使用第三方.Net NPOI实现.net mvc使用FileResult导出excel(下载到客户端)

来源:互联网 发布:企业办公通讯软件 编辑:程序博客网 时间:2024/05/16 16:03

这个功能直观来讲,就是表格导出(至excel)功能。此功能主要涉及到的技术有.NET第三方库NPOI,C#的MemoryStream,DataTable操作与使用以及.net mvc的FileResult。
一, .NET第三方库NPOI
NPOI库有七个,分別是:
NPOI.DLL:NPOI
NPOI.DDF.DLL:NPOI
NPOI.HPSF.DLL:NPOI
NPOI.HSSF.DLL:NPOI Excel BIFF
NPOI.Util.DLL:NPOI
NPOI.POIFS.DLL:NPOI OLE
ICSharpCode.SharpZipLib.DLL
二,和FileStream一样,MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法。这两个类都是实现对内存进行数据读写的功能,而不是对持久性存储器进行读写。
1、Read():读取MemoryStream流对象,将值写入缓存区。
2、ReadByte():从MemoryStream流中读取一个字节。
3、Write():将值从缓存区写入MemoryStream流对象。
4、WriteByte():从缓存区写入MemoytStream流对象一个字节。
5、Seek(Int64, SeekOrigin)将当前流中的位置设置为指定值。
关于memoryStream的官方api:微软api说明

三,datatable在代码中已经使用了基本用法,关于具体的说明请参考官方api:微软api说明
代码:

    public static MemoryStream Export(List<DataTable> listDT,int[] widths){        //先创建一个流        MemoryStream ms = new MemoryStream();        if(listDT!=null&&listDt.Count!=0){            try{                //新建一个excel                HSSFWorkbook workbook = new HSSFWorbook();                //excel样式                HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();                foreach(DataTable dt in listDT){                    //创建一个sheet                    ISheet sheet = workbook.CreateSheet(dt.TableName);                    //给指定sheet的内容设置每列宽度(index从0开始,width1000相当于excel设置的列宽3.81)                    for(int i = 0 ;i <widths.Length;i++){                        sheet.SetColumnWidth(i,width[i]);                    }                                   //在sheet里创建行                    NPOI.SS.UserModel.IRow row1 = sheet.CreateRow(0);                    //第一行,列名                    for(var i=0;i<dt.Columns.Count;i++){                        row1.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);                    }                    for(var r=0;r<dt.Rows.Count;r++){                        var row_r =sheet1.CreatRow(r+1);                        for(int i = 0;i<dt.Columns.Count;i++){                            row_r.CreateCell(i).SetCellValue(dt.Rows[r][i].ToString());                        }                    }                               }                //写入流                workbook.Write(ms);                ms.Flush();                return ms;            }            catch(Exception ex){                //            }        }        return null;    }

下面这个方法是.net mvc中的controller中的action

    public FileResult Export(){//参数随业务场景从前台获取的不一样        ResponseData rsp = new ResponseData();        List<ExportExcelModel> _list = new List<ExportExcelModel>();        //ExportExcelModel为表格抽象对象,具体数据来自前端或数据库        DataTable Dt = new DataTable("表名");        Dt.Columns.Add("序号",System.Type.GetType("System.Int32"));        Dt.Columns.Add("列名1");        Dt.Columns.Add("列名2");        Dt.Columns.Add("列名3");        Dt.Columns.Add("列名4");        Dt.Columns.Add("列名5");        int i = 1;        foreach(var item in _list){            DataRow newDr = Dt.NewRow();            newDr["序号"] = i;            newDr["列名1"] = item.filed1;            newDr["列名2"] = item.filed2;            newDr["列名3"] = item.filed3;            newDr["列名4"] = item.filed4;            newDr["列名5"] = item.filed5;             i++;            Dt.Rows.Add(newDr);        }        List<DataTable> Ld = new List<DataTable>();        Ld.Add(Dt);        int widths={2000,2000,2000,2000,2000,2000};        MemoryStream ms = Export(Ld,Widths);//调用前一个方法        ms.Seek(0,SeekOrigin.Bengin);        return File(ms,"application/ms-excel","文件名.xls");    }
0 0