Asp.Net MVC使用NPOI快速导出Excel文档数据处理
2017-07-14 13:44:51  By: dwtedx

一、背景

在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计、并以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做更多具体的操作、后期会把一些使用心得和大家一起分享、今天实现的功能简单、如果我思路和方法有误、恳请各位指正、虚心求教

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+