先上效果图:

先声明一个IWorkbook对象:

             IWorkbook workbook;//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式string fileExt = Path.GetExtension(fileName).ToLower();if (fileExt == ".xlsx") {workbook = new XSSFWorkboo}else if (fileExt == ".xls") {workbook = new HSSFWorkbook();} else {workbook = null;}if (workbook == null)  {return;}

标题合并单元格,字体居中加粗,先定义单元格样式:

                ICellStyle cellStyle = workbook.CreateCellStyle();//声明样式cellStyle.Alignment = HorizontalAlignment.Center;//水平居中cellStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中IFont font = workbook.CreateFont();//声明字体font.Boldweight = (Int16)FontBoldWeight.Bold;//加粗font.FontHeightInPoints = 18;//字体大小cellStyle.SetFont(font);//加入单元格

其次实现单元格合并:

             IRow row0 = sheet.CreateRow(0);//创建行row0.HeightInPoints = 35;//行高ICell cell0 = row0.CreateCell(0);//创建单元格cell0.SetCellValue("XXXX年XX月对账单");//赋值cell0.CellStyle = cellStyle;//设置样式sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtBody.Columns.Count-1));//合并单元格(第几行,到第几行,第几列,到第几列)

这样第一列的标题效果完成,接下来是一行的多个单元格合并,步骤如上,需要注意的是,单元格赋值的时候,下标要写每个合并单元格域的第一列,不然会被覆盖。
接下来是一个DataTable的读取,可以先计算每一列的列宽:

int[] arrColWidth = new int[dtBody.Columns.Count];//声明列宽数组foreach (DataColumn item in dtBody.Columns)//先存储列头的宽度{arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;}for (int i = 0; i < dtBody.Rows.Count; i++)//遍历整张表,如果宽度大于列头宽度,则替换{for (int j = 0; j < dtBody.Columns.Count; j++){int intTemp = Encoding.GetEncoding(936).GetBytes(dtBody.Rows[i][j].ToString()).Length;if (intTemp > arrColWidth[j]){arrColWidth[j] = intTemp;}}}

接下来填充数据:

             #region 填充表头IRow row = sheet.CreateRow(2);//先前占用了2行,表头从3开始for (int i = 0; i < dtBody.Columns.Count; i++){ICell cell = row.CreateCell(i);cell.SetCellValue(dtBody.Columns[i].ColumnName);sheet.SetColumnWidth(i, arrColWidth[i] * 300);cell.CellStyle = dateStyle;}#endregion#region  填充表身for (int i = 0; i < dtBody.Rows.Count; i++){IRow row1 = sheet.CreateRow(i + 3);//表身从3开始for (int j = 0; j < dtBody.Columns.Count; j++){ICell cell = row1.CreateCell(j);if (dtBody.Columns[j].DataType.FullName == "System.Decimal")//数字类型的值单独的样式{cell.SetCellType(CellType.Numeric);if (dtBody.Rows[i][j].ToString() == ""){cell.SetCellValue(0);}else{cell.SetCellValue(double.Parse(dtBody.Rows[i][j].ToString()));}cell.CellStyle = numberStyle;//数字样式}else{cell.SetCellValue(dtBody.Rows[i][j].ToString());cell.CellStyle = initStyle;}}#region 统计行if (i == dtBody.Rows.Count - 1)//最后一行{IRow rowCount = sheet.CreateRow(i + 4);//追加一行统计列sheet.AddMergedRegion(new CellRangeAddress(i+ 4, i+4 , 0, 5));//合并单元格(第几行,到第几行,第几列,到第几列)ICell cellEnd1 = rowCount.CreateCell(6);//创建单元格ICell cellEnd2 = rowCount.CreateCell(7);ICell cellEnd3 = rowCount.CreateCell(8);ICell cellEnd4 = rowCount.CreateCell(9);;cellEnd1.SetCellValue("对帐总金额:");cellEnd3.SetCellValue("确认总金额:");cellEnd1.CellStyle = textStyle;cellEnd3.CellStyle = textStyle;cellEnd2.CellStyle = moneyStyle;cellEnd4.CellStyle = moneyStyle;sheet.SetColumnWidth(6, 16 * 256);//设置单元格宽度sheet.SetColumnWidth(7, 14 * 256);sheet.SetColumnWidth(8, 16 * 256);sheet.SetColumnWidth(9, 14 * 256);string CellFormulaString1= "sum(I4:I"+ (dtBody.Rows.Count + 3) + ")"; //计算表达式,行统计: sum(A1:C1),列统计:sum(B1:B10)string CellFormulaString2= "sum(J4:J"+ (dtBody.Rows.Count + 3) + ")"; //计算表达式sheet.GetRow(dtBody.Rows.Count + 3).GetCell(7).SetCellFormula(CellFormulaString1);//赋值表达式sheet.GetRow(dtBody.Rows.Count + 3).GetCell(9).SetCellFormula(CellFormulaString2);}#endregion}#endregion

统计行中moneyStyle单元格样式中需要添加“¥”字符,网上搜了很久的方法没有找到,自己无意中试出来的:

             ICellStyle moneyStyle= workbook.CreateCellStyle();IFont font1 = workbook.CreateFont();font1.Color = (Int16)FontColor.Red;moneyStyle.SetFont(font1);IDataFormat dataformat = workbook.CreateDataFormat();style3.DataFormat = dataformat.GetFormat("¥0.00"); ;

填充完数据之后,需要将其写入文件中,然后导出:

             MemoryStream stream = new MemoryStream(); workbook.Write(stream);var buf = stream.ToArray();//转为字节数组 //创建文件using (FileStream fs = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write))//savePath为文件保存路径{fs.Write(buf, 0, buf.Length);fs.Flush();}

至此,后端完成

NPOI导出EXCEL 合并单元格、统计列、单元格样式设置相关推荐

  1. springboot项目导出excel 合并单元格表格

    springboot项目导出excel 合并单元格表格 导出效果 业务controller 业务数据 业务实体类 注解MyExcel.java 注解 MyExcels 导出工具类MyExcelUtil ...

  2. Excel使用VBA合并单列、多列单元格

    Excel使用VBA合并单列.多列单元格 多列合并相同内容单元格 合并相同单元格的功能如下同,让相同内容的单元格合并为一个. 具体代码如下: Sub 相同内容合并单元格() ' ' '' Dim i, ...

  3. c# Npoi导出Excel并合并行列

    在工作开发中,客户经常要求数据库中数据导出到Excel表格.以前方法是引用office相关组件,如果客户没有安装office,功能就会遇到问题. 现在用Npoi导出Excel,导出表格是合并行列,如图 ...

  4. NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...

  5. Npoi导出excel整理(附源码)

    前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...

  6. C#利用NPOI导出Excel

    C#利用NPOI导出Excel 第一篇文章 View Code 1 using System; 2 using System.Collections.Generic; 3 using System.L ...

  7. [C#]Npoi导出excel整理(附源码)

    前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...

  8. C# NPOI 导出Excel 日期格式

    NPOI 导出Excel时,如果是需要日期格式,在这处理一下,Excel本身支持的是 XSSF开头 和 HSSF开头就是 .xls 和 .xlsx的区别, 可以强制转换 row = (XSSFRow) ...

  9. C#NPOI导出Excel详解

    C#NPOI导出Excel详解 开发工具与技术:工具:Visual Studio/C#.Net,技术:C# 作者:刘胜 撰写时间:2019-05-08 NPOI简介 NOP是一个开源的C#读写Exce ...

  10. Winform中通过NPOI导出Excel时通过ICellStyle和IDataFormat格式化日期显示格式

    场景 Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载: https://blog.csdn.net/B ...

最新文章

  1. 有哪些适合放在程序员办公桌上的高逼格物件?哈哈哈哈哈哈哈!
  2. vForum 2008系列之七:主题演讲:虚拟化的未来
  3. 2016企业开发趋势:Lightbend关于JVM开发者的调查
  4. linux下shell命令trap
  5. MonkeyFest2018 微软最有价值专家讲座
  6. python安装百度aip_Python3.6安装aip
  7. Android第四十五天
  8. linux进程和线程理解
  9. 调整SAP系统中物料账和财务账的期间
  10. SQL Server DTS
  11. 别想着复制别人的路!
  12. RS232RS485协议原理和应用
  13. 龙门上下料样本程序,四轴。用台达AS228T和台达触摸屏编写
  14. jersey文件服务器,通过jersey实现客户端图片上传
  15. 存储和虚拟化服务器的对接,储存虚拟化
  16. 2022/04/29 第一次晋升答辩总结
  17. 安徽大学计算机考研考情与难度、参考书及上岸前辈备考经验指导
  18. 人脸检测数据集评价代码FDDB evaluation运行方法
  19. PureMVC使用体会
  20. 2014秋江苏计算机二级,关于2014年秋季江苏省计算机等级考试报名通知

热门文章

  1. Jenkins上配置Robot Framework测试邮件通知模板
  2. (二)机器学习实践Python3-决策树ID3的一个简单案例
  3. 多线程通信Queue
  4. JeecgBoot 3.3.0 版本发布,基于代码生成器的企业级低代码平台
  5. 大厂面试通行证- Java基础
  6. 拼多多推广没有曝光怎么办?
  7. 拓嘉辰丰电商:拼多多推广主要有哪些模式
  8. EOS Error 3090003: provided keys, permissions, and delays do not satisfy declared authoriz
  9. org.apache.felix.http.jetty %bundles.pluginTitle: Cannot start (org.osgi.framework.BundleException:
  10. 苹果退款_苹果退款流程最新苹果内购退款流程和教程