你的位置:首页 > ASP.net教程

[ASP.net教程]asp.net mvc4使用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("");    }

     

  4. 首先,先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开始)。
  5. 在表格建好了以后开始导入数据。list装好的数据,因此每行遍历一次,将数据填充进入便可。使用foreach的时候注意,此时第一行已经使用了,被创建了列名,因此需要在一开始的时候,将填充数据的开始行+1即:NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1); 数据string转换也是正常不过的操作。
  6. 然后关键是导出下载的处理
    // 写入到客户端       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();      

  7. System.IO.MemoryStream和Response是两个很关键的处理,在Response中可以对文件名进行处理,string.Formate();在前台只需要加入<a href = "/admin/ExportDormitoryBottleRecycleExcel"></a>标签。
  8. 实际生成效果
  9.  

 

 

 

四、总结

  最近也在使用NPOI做更多具体的操作,后期会把一些使用心得和大家一起分享,今天实现的功能简单,如果我思路和方法有误,恳请各位指正,虚心求教。转载请注明来源与出处,谢谢合作 By 点将台无将