目录

  • 一、效果展示
    • 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导出功能相关推荐

  1. 如何在 Asp.Net Core 实现 Excel 导出功能

    在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使 ...

  2. 根据children动态复杂表头excel导出_Java高级特性-注解:注解实现Excel导出功能

    注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套"注解驱动编程". 这听起来高大上,但毕竟是框架的事,我们也能用好注解吗? 的确,我们很少有机会自己写注 ...

  3. java数据导出ex_Java高级特性注解:注解实现Excel导出功能

    作者:JerryWu来源:SegmentFault 思否社区 注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套"注解驱动编程". 这听起来高大上,但毕竟 ...

  4. Angular导出功能(excel导出功能、文件数据流导出功能、图片的下载导出功能)

    Angular导出功能(excel导出功能.文件数据流导出功能.图片的下载导出功能) 场景1:(直接返回网络地址进行导出的excel) 后台返回的是 : "http://192.168.0. ...

  5. java Excel导出功能之 不固定列表格

    背景:考勤周期为本月19号至上月20号,则每个月考勤周期表的列是动态变化的.所有数据显示和excel导出功能都需要动态的进行处理. 显示格式如下图 前端 checkin.jsp<%@ page ...

  6. Excel导出功能超时解决方案 -- 异步处理

    Excel导出功能超时解决方案 -- 异步处理 参考文章: (1)Excel导出功能超时解决方案 -- 异步处理 (2)https://www.cnblogs.com/nightOfStreet/p/ ...

  7. 解决通过调用后台接口实现Excel导出功能,后台返回数据乱码的问题

    解决通过调用后台接口实现Excel导出功能,后台返回数据乱码的问题 问题如下: 这导致我虽然成功导出文件,但文件受损打不开 解决方案如下: 在调用接口加入: // 导出 export function ...

  8. 简便的Excel导出功能

    Excel导出功能 在我们开发项目的时候,难免会遇到客户需要将表格数据导出到Excel中,进行打印或者留存,于是Java对Excel.word的操作都必不可少. 关于这些操作Excel目前有两个框架, ...

  9. ThingsBoard CE添加Excel导出功能-优化篇

    文章目录 前言 rpc,static,alarm去掉图例中的启用数据导出选项 效果 前言 如何添加Excel导出功能请跳转上一篇ThingsBoard CE数据导出excel,这篇做优化. 按照Thi ...

  10. 基于easyexcel的MySQL百万级别数据的excel导出功能

    前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在U ...

最新文章

  1. Android适应方案汇总(三)
  2. shandong‘s approach for doing thing
  3. Oracle 应用短连接导致连接风暴
  4. TCPIP / MTU 和 MSS 的区别和联系
  5. 奇迹世界服务器不响应,sun-奇迹世界 目前常见问题解决方法
  6. MySQL 条件查询
  7. WPF中两个窗口的互斥
  8. 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础
  9. JAVA 微信支付 native方式
  10. java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间
  11. GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
  12. 拓端tecdat|R语言和Stan,JAGS:用rstan,rjags建立贝叶斯多元线性回归预测选举数据
  13. Google产品设计师:从二维界面到虚拟现实
  14. 如何实现幻灯片效果/图片轮播
  15. 特殊符号大全,方便大家输入特殊字符用
  16. 修改植物大战僵尸游戏存档(Java实现版)
  17. 墨者学院简单sql注入
  18. AFNetworkReachabilityManager检测网络状态
  19. Some linux hits
  20. 氨氮废水吸附处理工艺——树脂吸附

热门文章

  1. 2019大数据挑战赛
  2. 安全运营和应急响应详解
  3. Win10 快捷操作
  4. 齐治运维堡垒机后台命令执行漏洞
  5. 小米 html5定位失败,小米手表GPS定位慢怎么办 GPS定位失败及室内无法定位解决方法...
  6. 随机数相关函数rand与srand 以及drand48()与srand48
  7. Java 并发编程:轻量级锁和偏向锁详解
  8. 操作系统——经典同步问题
  9. JS 正则表达式 验证中国大陆身份证号码
  10. CC2430 串口使用详解