NPOI导出EXCEL 合并单元格、统计列、单元格样式设置
先上效果图:
先声明一个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 合并单元格、统计列、单元格样式设置相关推荐
- springboot项目导出excel 合并单元格表格
springboot项目导出excel 合并单元格表格 导出效果 业务controller 业务数据 业务实体类 注解MyExcel.java 注解 MyExcels 导出工具类MyExcelUtil ...
- Excel使用VBA合并单列、多列单元格
Excel使用VBA合并单列.多列单元格 多列合并相同内容单元格 合并相同单元格的功能如下同,让相同内容的单元格合并为一个. 具体代码如下: Sub 相同内容合并单元格() ' ' '' Dim i, ...
- c# Npoi导出Excel并合并行列
在工作开发中,客户经常要求数据库中数据导出到Excel表格.以前方法是引用office相关组件,如果客户没有安装office,功能就会遇到问题. 现在用Npoi导出Excel,导出表格是合并行列,如图 ...
- NPOI导出Excel示例
摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...
- Npoi导出excel整理(附源码)
前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...
- C#利用NPOI导出Excel
C#利用NPOI导出Excel 第一篇文章 View Code 1 using System; 2 using System.Collections.Generic; 3 using System.L ...
- [C#]Npoi导出excel整理(附源码)
前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...
- C# NPOI 导出Excel 日期格式
NPOI 导出Excel时,如果是需要日期格式,在这处理一下,Excel本身支持的是 XSSF开头 和 HSSF开头就是 .xls 和 .xlsx的区别, 可以强制转换 row = (XSSFRow) ...
- C#NPOI导出Excel详解
C#NPOI导出Excel详解 开发工具与技术:工具:Visual Studio/C#.Net,技术:C# 作者:刘胜 撰写时间:2019-05-08 NPOI简介 NOP是一个开源的C#读写Exce ...
- Winform中通过NPOI导出Excel时通过ICellStyle和IDataFormat格式化日期显示格式
场景 Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载: https://blog.csdn.net/B ...
最新文章
- 有哪些适合放在程序员办公桌上的高逼格物件?哈哈哈哈哈哈哈!
- vForum 2008系列之七:主题演讲:虚拟化的未来
- 2016企业开发趋势:Lightbend关于JVM开发者的调查
- linux下shell命令trap
- MonkeyFest2018 微软最有价值专家讲座
- python安装百度aip_Python3.6安装aip
- Android第四十五天
- linux进程和线程理解
- 调整SAP系统中物料账和财务账的期间
- SQL Server DTS
- 别想着复制别人的路!
- RS232RS485协议原理和应用
- 龙门上下料样本程序,四轴。用台达AS228T和台达触摸屏编写
- jersey文件服务器,通过jersey实现客户端图片上传
- 存储和虚拟化服务器的对接,储存虚拟化
- 2022/04/29 第一次晋升答辩总结
- 安徽大学计算机考研考情与难度、参考书及上岸前辈备考经验指导
- 人脸检测数据集评价代码FDDB evaluation运行方法
- PureMVC使用体会
- 2014秋江苏计算机二级,关于2014年秋季江苏省计算机等级考试报名通知
热门文章
- Jenkins上配置Robot Framework测试邮件通知模板
- (二)机器学习实践Python3-决策树ID3的一个简单案例
- 多线程通信Queue
- JeecgBoot 3.3.0 版本发布,基于代码生成器的企业级低代码平台
- 大厂面试通行证- Java基础
- 拼多多推广没有曝光怎么办?
- 拓嘉辰丰电商:拼多多推广主要有哪些模式
- EOS Error 3090003: provided keys, permissions, and delays do not satisfy declared authoriz
- org.apache.felix.http.jetty %bundles.pluginTitle: Cannot start (org.osgi.framework.BundleException:
- 苹果退款_苹果退款流程最新苹果内购退款流程和教程