欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Asp.Net MVC使用NPOI快速导出Excel文档数据处理

程序员文章站 2022-02-02 20:30:49
...

一、背景

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