报表数据导出Excel,很常见的需求,然而每次都能忘了,今天再次遇到了,总结一下。


一般来说都需要有个标题

//需要输出的字段
string[] fieldArr = { "Title", "Sequence", "WorkSheetDescription", "Position", "StartTime", "EndTime", "Transactor", "Status", "WorkClass", "Result", "StartDoTime", "EndDoTime" };//对应的中文描述            System.Collections.Generic.Dictionary<string, string> fieldDic = new System.Collections.Generic.Dictionary<string, string> { { "Title", "工单编号" }, { "Sequence", "顺序" }, { "WorkSheetDescription", "工单描述" }, { "Position", "位置" }, { "StartTime", "计划开始时间" }, { "EndTime", "计划结束时间" }, { "Transactor", "处理人" }, { "Status", "工单状态" }, { "WorkClass", "班次" }, { "Result", "执行结果" }, { "StartDoTime", "实际开始时间" }, { "EndDoTime", "实际结束时间" } };

设置表单表格样式

ICellStyle titleStyle= wb.CreateCellStyle();IFont font1 = wb.CreateFont();//字体font1.FontName = "楷体";font1.Color = HSSFColor.White.Index;//字体颜色font1.Boldweight = (short)FontBoldWeight.Normal;//字体加粗titleStyle.SetFont(font1);//字体设置具体的字体//背景色titleStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Blue.Index;titleStyle.FillPattern = FillPattern.SolidForeground;titleStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Blue.Index;titleStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式titleStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式

设置列宽

int[] columnWidth = { 10, 10, 25, 10, 15, 15, 20, 10, 20, 20, 15, 15 };for (int i = 0; i < columnWidth.Length; i++){//设置列宽度,256*字符数,因为单位是1/256个字符sheet.SetColumnWidth(i, 256 * columnWidth[i]);}

把生成的Excel发送到客户端

MemoryStream ms = new MemoryStream();wb.Write(ms);Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode("WS" + "_" + DateTime.Now.ToString("yyyy-MM-dd"), System.Text.Encoding.UTF8)));Response.BinaryWrite(ms.ToArray());Response.Flush();Response.End();wb = null;ms.Close();ms.Dispose();

因为我的项目是SharePoint的,所以数据源是SPListItemCollection传入,其他的DataTable或者其他的相应改动一下就行。

代码如下

public void NPOIExcel(SPListItemCollection items){HSSFWorkbook wb = new HSSFWorkbook();//标题样式样式ICellStyle titleStyle= wb.CreateCellStyle();IFont font1 = wb.CreateFont();//字体font1.FontName = "楷体";font1.Color = HSSFColor.White.Index;//字体颜色font1.Boldweight = (short)FontBoldWeight.Normal;//字体加粗titleStyle.SetFont(font1);//设置字体//设置背景色titleStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Blue.Index;titleStyle.FillPattern = FillPattern.SolidForeground;titleStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Blue.Index;titleStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;//文字水平对齐方式titleStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//文字垂直对齐方式//创建一个表单ISheet sheet = wb.CreateSheet("Sheet0");//设置列宽int[] columnWidth = { 10, 10, 25, 10, 15, 15, 20, 10, 20, 20, 15, 15 };for (int i = 0; i < columnWidth.Length; i++){//设置列宽度,256*字符数,因为单位是1/256个字符sheet.SetColumnWidth(i, 256 * columnWidth[i]);}IRow row;ICell cell;string[] fieldArr = { "Title", "Sequence", "WorkSheetDescription", "Position", "StartTime", "EndTime", "Transactor", "Status", "WorkClass", "Result", "StartDoTime", "EndDoTime" };System.Collections.Generic.Dictionary<string, string> fieldDic = new System.Collections.Generic.Dictionary<string, string> { { "Title", "工单编号" }, { "Sequence", "顺序" }, { "WorkSheetDescription", "工单描述" }, { "Position", "位置" }, { "StartTime", "计划开始时间" }, { "EndTime", "计划结束时间" }, { "Transactor", "处理人" }, { "Status", "工单状态" }, { "WorkClass", "班次" }, { "Result", "执行结果" }, { "StartDoTime", "实际开始时间" }, { "EndDoTime", "实际结束时间" } };//写入标题行row = sheet.CreateRow(0);for (int i = 0; i < fieldArr.Length; i++){cell = row.CreateCell(i);//创建第j列cell.CellStyle = titleStyle;SetCellValue(cell, fieldDic[fieldArr[i]]);}//写入数据,从第2行开始for (int i = 1; i <= items.Count; i++){row = sheet.CreateRow(i);//创建第i行for (int j = 0; j < fieldArr.Length; j++){cell = row.CreateCell(j);//根据数据类型设置不同类型的cellvar field = fieldArr[j];object obj = null;//如果报错,跳过该字段try{obj = items[i - 1][field];}catch{continue;}if (obj != null){SetCellValue(cell, obj);}}}//发送到客户端MemoryStream ms = new MemoryStream();wb.Write(ms);Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", HttpUtility.UrlEncode("WS" + "_" + DateTime.Now.ToString("yyyy-MM-dd"), System.Text.Encoding.UTF8)));Response.BinaryWrite(ms.ToArray());Response.Flush();Response.End();wb = null;ms.Close();ms.Dispose();}/// <summary>/// 根据数据类型设置不同类型的cell/// </summary>/// <param name="cell"></param>/// <param name="obj"></param>public static void SetCellValue(ICell cell, object obj){try{if (obj.GetType() == typeof(int)){cell.SetCellValue((int)obj);}else if (obj.GetType() == typeof(double)){cell.SetCellValue((double)obj);}else if (obj.GetType() == typeof(IRichTextString)){cell.SetCellValue((IRichTextString)obj);}else if (obj.GetType() == typeof(string)){cell.SetCellValue(obj.ToString());}else if (obj.GetType() == typeof(DateTime)){cell.SetCellValue(Convert.ToDateTime(obj).ToString("yyyy/MM/dd"));}else if (obj.GetType() == typeof(bool)){cell.SetCellValue((bool)obj);}else{cell.SetCellValue(obj.ToString());}}catch (Exception ex){}}

需要注意的是,如果在页面直接用按钮事件导出Excel的话,只能导出一次,然后因为页面被End了,导致页面没有刷新,如果需要多次导出的话,可以把下载的操作放到一个页面去执行,然后前端js创建iframe的方式去做。

好记忆不如烂笔头,记录一下,免得以后又要到处找。

NPOI导出Excel并下载到客户端相关推荐

  1. iText导出pdf,poi导出excel并下载到客户端

    项目中需要做导出功能,要支持excel,pdf导出. excel导出我选择使用poi:pdf导出我选择使用iText,在此单独做记录. 先说说在设计与开发中的问题,从整体上把握设计思路. 思路(一) ...

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

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

  3. Winforn中通过NPOI导出Excel时通过XSSFClientAnchor和XSSFPicture添加图片

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

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

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

  5. .NET NPOI导出Excel详解

    http://www.cnblogs.com/yinrq/p/5590970.html .NET NPOI导出Excel详解 NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是 ...

  6. NPOI导出excel(带图片)

    近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...

  7. C#利用NPOI导出Excel

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

  8. NPOI导出Excel 65536限制

    1 #region NPOI 导出excel数据超65535自动分表 2 /// <summary> 3 /// DataTable转换成Excel文档流,并输出到客户端 4 /// &l ...

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

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

最新文章

  1. MOS管电源开关电路的软启动
  2. Vista及Win7常见故障(拷贝)
  3. 阿里云超算集谛优化GPU异构并行性能:GROMACS
  4. 基于ArcEngine与C#的鹰眼地图实现
  5. 2020年母婴消费洞察报告
  6. 个人支付宝收款页面,对接当面付接口
  7. MFC_recvfrom
  8. kotlin使用mapstruct(二)
  9. web.xml 加载顺序
  10. 修改JDK的经历:两处字体的粗体代码引起的错误
  11. 易筋SpringBoot 2.1 | 第廿四篇:SpringBoot访问Docker中的MongoDB
  12. python2.7怎么升级python3_python2.7升级至python3.6
  13. PHP毕业设计源码带论文和答辩、大作业、实例程序源码下载合集【21套】
  14. XP中N8无法连接PC套件解决
  15. 如何在谷歌上搜索: 31个 Google 高级搜索技巧
  16. 筋膜枪方案-无刷马达方波运用1
  17. 实现轮播模拟点击事件
  18. 因果分析系列2--随机试验
  19. 今天给同学写5个数据结构算法的题...感觉很有价值的几个题..感兴趣的坐下。。
  20. go mysql dsn_Golang数据库编程之GORM库入门

热门文章

  1. 【医学图像处理】CT成像技术之CT设备
  2. 揭秘APP软件开发者百万富翁之路:造程序的工厂
  3. PaddlePaddle在优化方法处报错 EnforceNotMet: Enforce failed
  4. NLM_P-Parameter-Free Fast Pixelwise Non-Local Means Denoising分享
  5. 【HDU3292】数学_佩尔方程
  6. 文档在线编辑开发心得
  7. HTML5编写船上航行,描写帆船航行的诗句
  8. 软件工程大作业——设计阶段
  9. python语音唤醒功能_百度语音识别 语音唤醒失败
  10. lstm 能耗预测_预测能耗第一部分