总结 | C#实现Excel导出功能
目录
- 一、效果展示
- 1.实现功能
- 2.效果展示
- 二、代码实现
- 1.引入库
- 2.读入数据
- 3.设置单元格样式
- 4.自定义类
- 三、遇到的坑
- 四、参考文档
- 总结
一、效果展示
在最近开发任务中使用到了第三方类库NPOI,简单总结一下自己使用的心得体会。如果存在漏洞或不足请多多指正。
1.实现功能
- 表格数据的写入
- 下拉框
- 图片插入
2.效果展示
- 表格数据写入 与 图片插入
- 下拉框
二、代码实现
1.引入库
2.读入数据
代码如下(示例):
/// <summary>/// 导出Excel样例/// </summary>/// <returns></returns>public string GetExportExcelExamples(){string result = "导出失败";try{int CurrRow = 0;//当前Excel写入的行数#region 1、创建Excel格式,并写入数据HSSFWorkbook workbook = new HSSFWorkbook();//初始化一个新的HSSFWorkbook实例ISheet sheet = workbook.CreateSheet("销售财务统计表");//创建一个sheet表//设置列宽for (int i = 0; i < 13; i++){sheet.SetColumnWidth(i, 20 * 130);}sheet.SetColumnWidth(0, 20 * 150);//设置单元格样式类型(单元格样式【单元格图案、填充模式、单元格背景色、边框、是否自动换行】、字体样式【字体类型、字体大小、字体颜色、字体是否加粗】)//(1)大标题格式ICellStyleVo cellStyleVo = new ICellStyleVo(HSSFColor.Grey50Percent.Index, FillPattern.SolidForeground, HSSFColor.Grey50Percent.Index, BorderStyle.Thin, true);FontStyleVo fontStyleVo = new FontStyleVo("华文行楷", 18 * 18, HSSFColor.White.Index, false);ICellStyle bigHeadStyle = SetICellStyle(workbook, cellStyleVo, fontStyleVo);//(2)表格标题格式cellStyleVo = new ICellStyleVo(HSSFColor.Grey50Percent.Index, FillPattern.SolidForeground, HSSFColor.Grey50Percent.Index, BorderStyle.Thin, true);fontStyleVo = new FontStyleVo("华文行楷", 15 * 15, HSSFColor.White.Index, false);ICellStyle tableHeadStyle = SetICellStyle(workbook, cellStyleVo, fontStyleVo);//(3)表格正文格式(加粗)cellStyleVo = new ICellStyleVo(HSSFColor.Grey40Percent.Index, FillPattern.SolidForeground, HSSFColor.Grey40Percent.Index, BorderStyle.Thin, true);fontStyleVo = new FontStyleVo("华文行楷", 15 * 15, HSSFColor.Black.Index, true);ICellStyle tableTextBoldStyle = SetICellStyle(workbook, cellStyleVo, fontStyleVo);//(4)表格正文格式(不加粗)cellStyleVo = new ICellStyleVo(HSSFColor.Grey25Percent.Index, FillPattern.SolidForeground, HSSFColor.Grey25Percent.Index, BorderStyle.Thin, true);fontStyleVo = new FontStyleVo("华文行楷", 15 * 15, HSSFColor.Black.Index, false);ICellStyle tableTextStyle = SetICellStyle(workbook, cellStyleVo, fontStyleVo);#region 1.1、写入头部信息sheet.AddMergedRegion(new CellRangeAddress(CurrRow, CurrRow, 0, 12));//合并单元格IRow rowH = sheet.CreateRow(CurrRow);//创建一行ICell cell = rowH.CreateCell(0);//创建一列cell.SetCellValue("年终销售业绩财务数据统计表—动态分析");cell.CellStyle = bigHeadStyle;//设置单元格样式CurrRow += 2;#endregion#region 1.2、写入表格信息//表格头部rowH = sheet.CreateRow(CurrRow);for (int i = 0; i < 13; i++){cell = rowH.CreateCell(i);if (i > 0)cell.SetCellValue(i + "月");cell.CellStyle = tableHeadStyle;}CurrRow += 1;//表格Bodyint[,] saleData = new int[,] {{ 5,28,50,69,58,122,134,158,28,93,94,183},{ 150,125,24,82,58,114,81,85,124,25,94,72},{ 138,123,68,85,5,12,34,58,128,83,114,83},{ 18,4,50,69,58,22,34,118,128,43,88,133},{ 8,65,150,169,158,22,34,134,128,113,35,138},{ 132,128,30,79,88,122,184,58,128,56,63,156},{ 10,28,150,169,58,142,43,78,28,73,124,153}};//销售数据for (int i = 0; i < saleData.GetLength(0); i++)//数组行数{rowH = sheet.CreateRow(CurrRow);cell = rowH.CreateCell(0);cell.SetCellValue("销售"+ (i + 1) +"部");cell.CellStyle = tableTextStyle;for (int j = 0; j < saleData.GetLength(1); j++)//数组列数{cell = rowH.CreateCell(j + 1);cell.SetCellValue(saleData[i, j]);cell.CellStyle = tableTextStyle;}CurrRow += 1;}#endregion#region 1.3、插入图片//下拉菜单rowH = sheet.CreateRow(CurrRow);cell = rowH.CreateCell(11);cell.SetCellValue("下拉框");cell.CellStyle = tableHeadStyle;cell = rowH.CreateCell(12);cell.SetCellValue("请选择");cell.CellStyle = tableHeadStyle;CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(CurrRow, CurrRow, 12, 12);DVConstraint dVConstraint = DVConstraint.CreateExplicitListConstraint(new string[] { "销售1部", "销售2部", "销售3部", "销售4部", "销售5部", "销售6部", "销售7部" });HSSFDataValidation dataValidate = new HSSFDataValidation(cellRangeAddressList, dVConstraint);sheet.AddValidationData(dataValidate);CurrRow += 1;//簇状柱状图string picPath = "C:/Users/Administrator/Desktop/Export/柱状图.png";byte[] bytes = System.IO.File.ReadAllBytes(picPath);int pictureIdx = workbook.AddPicture(bytes, PictureType.PNG);HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();//在sheet中创建画布HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, 0, 11, 13, 38);//设置锚点(在起始单元格的X坐标0-1023,Y的坐标0-255,在终止单元格的X坐标0-1023,Y的坐标0-255,起始单元格列数,行数,终止单元格列数,行数)HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);//把图片插到相应的位置pict.Resize();//自动调节图片大小,防止图片被拉伸变形#endregion#endregion#region 2、文件导出string path = "C:/Users/Administrator/Desktop/Export/Example1.xls";if (System.IO.File.Exists(path)){File.Delete(Path.GetFullPath(path));}FileStream file = new FileStream(path, FileMode.Create);workbook.Write(file);file.Close();#endregionresult = "导出成功";}catch (Exception ex){object msg = string.Concat("ExportExcels(GetExportExcelExamples)——导出Excel样例");Log4NetHelper.ErrorLog(msg, ex);}return result;}
3.设置单元格样式
/// <summary>/// 设置单元格样式/// </summary>/// <param name="workbook">Excel工作单元</param>/// <param name="FillForegroundColor">单元格图案</param>/// <param name="FillPattern">填充模式</param>/// <param name="FillBackgroundColor">单元格背景色</param>/// <param name="BorderStyle">边框</param>/// <param name="IsWrapText">是否自动换行</param>/// <param name="FontName">字体类型</param>/// <param name="FontHeight">字体大小</param>/// <param name="fontColor">字体颜色</param>/// <param name="IsBold">字体是否加粗</param>/// <returns></returns>public ICellStyle SetICellStyle(HSSFWorkbook workbook, ICellStyleVo cellStyleVo, FontStyleVo fontStyleVo){ICellStyle cellStyle = workbook.CreateCellStyle();#region [+]设置通用样式#region [+]1、单元格通用样式cellStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中cellStyle.Alignment = HorizontalAlignment.Center;//水平居中//设置单元格的背景和图案(注意坑:顺序)cellStyle.FillBackgroundColor = cellStyleVo.FillBackgroundColor;//背景cellStyle.FillPattern = cellStyleVo.FillPattern;//填充模式(必须设置)cellStyle.FillForegroundColor = cellStyleVo.FillForegroundColor;//图案//设置边框//cellStyle.BorderTop = cellStyleVo.BorderStyle;//cellStyle.BorderBottom = cellStyleVo.BorderStyle;//cellStyle.BorderLeft = cellStyleVo.BorderStyle;//cellStyle.BorderRight = cellStyleVo.BorderStyle;//自动换行cellStyle.WrapText = cellStyleVo.IsWrapText;#endregion#region [+]2、字体通用样式IFont font = workbook.CreateFont();font.FontName = fontStyleVo.FontName;//字体类型font.FontHeight = fontStyleVo.FontHeight;//字体大小font.Color = fontStyleVo.fontColor;//字体颜色font.IsBold = fontStyleVo.IsBold;//字体是否加粗cellStyle.SetFont(font);//把字体应用到当前样式#endregionreturn cellStyle;#endregion}
4.自定义类
/// <summary>/// 单元格样式模型/// </summary>public class ICellStyleVo{/// <summary>/// 单元格图案/// </summary>public short FillForegroundColor { get; set; } = HSSFColor.White.Index;/// <summary>/// 填充模式/// </summary>public FillPattern FillPattern { get; set; } = FillPattern.SolidForeground;/// <summary>/// 单元格背景色/// </summary>public short FillBackgroundColor { get; set; } = HSSFColor.White.Index;/// <summary>/// 边框/// </summary>public BorderStyle BorderStyle { get; set; } = BorderStyle.None;/// <summary>/// 是否自动换行/// </summary>public bool IsWrapText { get; set; } = false;public ICellStyleVo(short FillForegroundColor = HSSFColor.White.Index, FillPattern FillPattern = FillPattern.SolidForeground, short FillBackgroundColor = HSSFColor.White.Index, BorderStyle BorderStyle = BorderStyle.Thin, bool IsWrapText = false){this.FillForegroundColor = FillForegroundColor;this.FillPattern = FillPattern;this.FillBackgroundColor = FillBackgroundColor;this.BorderStyle = BorderStyle;this.IsWrapText = IsWrapText;}}/// <summary>/// 字体样式模型/// </summary>public class FontStyleVo{/// <summary>/// 字体类型/// </summary>public string FontName { get; set; } = "宋体";/// <summary>/// 字体大小/// </summary>public double FontHeight { get; set; } = 15 * 15;/// <summary>/// 字体颜色/// </summary>public short fontColor { get; set; } = HSSFColor.Black.Index;/// <summary>/// 字体是否加粗/// </summary>public bool IsBold { get; set; } = false;public FontStyleVo(string FontName = "宋体", double FontHeight = 15 * 15, short fontColor = HSSFColor.Black.Index, bool IsBold = false){this.FontName = FontName;this.FontHeight = FontHeight;this.fontColor = fontColor;this.IsBold = IsBold;}}
三、遇到的坑
- 竖向合并单元格时,必须在第一行写入数据,否则无法写入数据;
例如:合并第一列中的第1~3行
//正确使用方法
int CurrRow = 0;
IRow rowTemp = sheet.CreateRow(CurrRow);
sheet.AddMergedRegion(new CellRangeAddress(CurrRow, CurrRow + 3, 0, 0));
cell = rowTemp.CreateCell(0);
cell.SetCellValue("学习");
//错误使用方法
int CurrRow = 3;
IRow rowTemp = sheet.CreateRow(CurrRow);
sheet.AddMergedRegion(new CellRangeAddress(CurrRow - 3, CurrRow, 0, 0));
cell = rowTemp.CreateCell(0);
cell.SetCellValue("学习");
四、参考文档
- NPOI使用手册:https://www.cnblogs.com/joean/p/4661056.html
- FillPattern填充模式效果:https://blog.csdn.net/qq_39541254/article/details/107940224
- HSSFColor中Excel表格颜色对照表:https://blog.csdn.net/qq_27937043/article/details/72779442
- 自定义色调:https://blog.csdn.net/pyc_01/article/details/100599632
总结
目前NPOI对基础的表格导出的API比较完善,但对于高级Chart图的开发接口比较匮乏。
总结 | C#实现Excel导出功能相关推荐
- 如何在 Asp.Net Core 实现 Excel 导出功能
在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使 ...
- 根据children动态复杂表头excel导出_Java高级特性-注解:注解实现Excel导出功能
注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套"注解驱动编程". 这听起来高大上,但毕竟是框架的事,我们也能用好注解吗? 的确,我们很少有机会自己写注 ...
- java数据导出ex_Java高级特性注解:注解实现Excel导出功能
作者:JerryWu来源:SegmentFault 思否社区 注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套"注解驱动编程". 这听起来高大上,但毕竟 ...
- Angular导出功能(excel导出功能、文件数据流导出功能、图片的下载导出功能)
Angular导出功能(excel导出功能.文件数据流导出功能.图片的下载导出功能) 场景1:(直接返回网络地址进行导出的excel) 后台返回的是 : "http://192.168.0. ...
- java Excel导出功能之 不固定列表格
背景:考勤周期为本月19号至上月20号,则每个月考勤周期表的列是动态变化的.所有数据显示和excel导出功能都需要动态的进行处理. 显示格式如下图 前端 checkin.jsp<%@ page ...
- Excel导出功能超时解决方案 -- 异步处理
Excel导出功能超时解决方案 -- 异步处理 参考文章: (1)Excel导出功能超时解决方案 -- 异步处理 (2)https://www.cnblogs.com/nightOfStreet/p/ ...
- 解决通过调用后台接口实现Excel导出功能,后台返回数据乱码的问题
解决通过调用后台接口实现Excel导出功能,后台返回数据乱码的问题 问题如下: 这导致我虽然成功导出文件,但文件受损打不开 解决方案如下: 在调用接口加入: // 导出 export function ...
- 简便的Excel导出功能
Excel导出功能 在我们开发项目的时候,难免会遇到客户需要将表格数据导出到Excel中,进行打印或者留存,于是Java对Excel.word的操作都必不可少. 关于这些操作Excel目前有两个框架, ...
- ThingsBoard CE添加Excel导出功能-优化篇
文章目录 前言 rpc,static,alarm去掉图例中的启用数据导出选项 效果 前言 如何添加Excel导出功能请跳转上一篇ThingsBoard CE数据导出excel,这篇做优化. 按照Thi ...
- 基于easyexcel的MySQL百万级别数据的excel导出功能
前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在U ...
最新文章
- Android适应方案汇总(三)
- shandong‘s approach for doing thing
- Oracle 应用短连接导致连接风暴
- TCPIP / MTU 和 MSS 的区别和联系
- 奇迹世界服务器不响应,sun-奇迹世界 目前常见问题解决方法
- MySQL 条件查询
- WPF中两个窗口的互斥
- 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础
- JAVA 微信支付 native方式
- java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间
- GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
- 拓端tecdat|R语言和Stan,JAGS:用rstan,rjags建立贝叶斯多元线性回归预测选举数据
- Google产品设计师:从二维界面到虚拟现实
- 如何实现幻灯片效果/图片轮播
- 特殊符号大全,方便大家输入特殊字符用
- 修改植物大战僵尸游戏存档(Java实现版)
- 墨者学院简单sql注入
- AFNetworkReachabilityManager检测网络状态
- Some linux hits
- 氨氮废水吸附处理工艺——树脂吸附