Asp.Net MVC使用NPOI快速导出Excel文档数据处理
一、背景
在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计、并以excel表格形式导出来、并且对表格格式要求并不高
二、问题分析
鉴于用户只要求最终将数据库中的数据导出excel、对于格式要求不高、因此只需要在页面上加入一条链接、后台action中读取数据然后通过第三方组件导出、再下载、就能满足这个简单的需求了
首先上bing找了有关数据导出的组件、NPOI是弹出的次数最多的一项、在这里也要说到以前做winform窗体开发用到过水晶报表的方法、其实实现方法比较多、由于以前没接触过NPOI、便打算在项目里使用这个开源的组件
三、解决思路或过程
1、先准备好数据源、用的是mysql数据库、事先在数据中存入一些数据
2、直接切入主题、这里主要在action里做操做、先要引入NPOI组件的dll( NPOI最新下载链接 ) 、再控制器中添加 using NPOI.HSSF.UserModel;
3、贴上控制器中action里代码
public ActionResult ExportDormitoryBottleRecycleExcel() { NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); List<Model> list = new List<Model>(); list = pbsAccess.DeriveList(); //创建栏目 NPOI.SS.UserModel.IRow row = sheet1.CreateRow(0); row.CreateCell(0).SetCellValue("编号"); row.CreateCell(1).SetCellValue("Col_1"); row.CreateCell(2).SetCellValue("Col_2"); row.CreateCell(3).SetCellValue("Col_3"); row.CreateCell(4).SetCellValue("Col_4"); row.CreateCell(5).SetCellValue("Col_5"); for (int i = 0; i < list.Count; i ) { NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i 1); rowtemp.CreateCell(0).SetCellValue((i 1).ToString()); rowtemp.CreateCell(1).SetCellValue(list[i].DormitoryNumber.ToString()); rowtemp.CreateCell(2).SetCellValue(list[i].SmallBottleNumber.ToString()); rowtemp.CreateCell(3).SetCellValue(list[i].BigBottleNumber.ToString()); rowtemp.CreateCell(4).SetCellValue(list[i].TotalBottleNumber.ToString()); rowtemp.CreateCell(5).SetCellValue(list[i].PublishTime.ToString()); } // 写入到客户端 //....... return Content(""); }
首先、先new一个book对象、再NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); 创建一个名为Sheet1的表对象、这里的Sheet1不是最终输出的文件名、创建好表格后、需要添加列项、这里添加这一段NPOI.SS.UserModel.IRow row = sheet1.CreateRow(0);其中的IRow需要注意了、在看过一些别的博客写的示例时、发现一个错误便是使用
NPOI.SS.UserModel.Row、这里引用的是2.1.3.1版本、已经更改过来了、应该是用IRow的、这是看了文档才意识到这里的问题、纠正这个错误、关于NPOI操作的中文文档、有需要的朋友可以留言、我再贴出来、在这得感谢之前在NPOI开发群里各路大神的帮助、row.CreateCell(i).SetCellValue("编号"),有多少列、i取到多少(从0开始)
在表格建好了以后开始导入数据、list装好的数据、因此每行遍历一次、将数据填充进入便可、使用foreach的时候注意、此时第一行已经使用了、被创建了列名、因此需要在一开始的时候、将填充数据的开始行 1即:NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i 1); 数据string转换也是正常不过的操作、
然后关键是导出下载的处理
// 写入到客户端 System.IO.MemoryStream ms = new System.IO.MemoryStream(); book.Write(ms); ms.Seek(0, SeekOrigin.Begin); Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls","****总表" DateTime.Now.ToString("yyyyMMddHHmmssfff"))); Response.BinaryWrite(ms.ToArray()); book = null; ms.Close(); ms.Dispose();
System.IO.MemoryStream和Response是两个很关键的处理、在Response中可以对文件名进行处理、string.Formate();、在前台只需要加入a标签就可以下载了
<a href = "/admin/ExportDormitoryBottleRecycleExcel">下载文档</a>
四、总结
最近也在使用NPOI做更多具体的操作、后期会把一些使用心得和大家一起分享、今天实现的功能简单、如果我思路和方法有误、恳请各位指正、虚心求教