首页 > 代码库 > asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

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 = "http://www.mamicode.com/admin/ExportDormitoryBottleRecycleExcel"></a>标签。
  8. 实际生成效果
  9. 技术分享 

 

技术分享

 

 

四、总结

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

asp.net mvc4使用NPOI 数据处理之快速导出Excel文档