基于NPOI导出Excel文件的研究与实现

时间:2022-05-19 03:40:03

基于NPOI导出Excel文件的研究与实现

[摘 要] 在基于B/S结构进行开发的应用系统中,“文件导出”是一项很重要的功能,利用它可以导出相关的业务数据,以便进行资料保存或者不同业务间的数据交互。本文就如何利用NPOI导出一个真正的Excel文件进行研究与分析。

[关键词] NPOI; 导出; Excel文件

doi : 10 . 3969 / j . issn . 1673 - 0194 . 2013 . 15. 061

[中图分类号] TP294 [文献标识码] A [文章编号] 1673 - 0194(2013)15- 0093- 02

1 导出Excel文件的传统方法

在进行Excel文件导出时,传统的方法一般都是利用Excel程序自身能够识别网页中的表格内容这种特性来实现的。当Web服务程序在响应客户端浏览请求时,先输出MIME类型,然后输出表格等HTML内容。比如(以C #代码为例):

Response.Clear();

Response.Buffer = false;

Response.AddHeader("Content-Disposition","attachment;filename=test.xls");

Response.ContentType ="application/ms-excel";

StringWriter sw= new StringWriter();

HtmlTextWriter htw = new HtmlTextWriter(sw);

GridView1.RenderControl(htw);

Response.Write(sw.ToString());

Response.End();

其中GridView1为Web服务端的GridView控件的ID。利用此方法的前提是需要重载VerifyRenderingInServerForm函数,取消其函数内容。

通过这种方法,可以将Web页面中的表格内容以HTML代码的方式输出到客户端浏览器,并提示保存名为test.xls的Excel文件。用记事本打开该文件,会发现其内容是HTML标记的网页文件,并非真正的二进制Excel文件。

2 Excel文件导出的其他几种可行方法

想要导出真正的二进制Excel文件,一是可以利用Excel应用程序对象创建Excel文件,然后输出二进制流到客户端浏览器进行保存;二是可以利用第三方的Excel类库,比如MyXlS、Koogra和NPOI等,直接生成二进制的Excel文件,然后输出二进制流到客户端浏览器进行保存。

利用Excel程序对象创建Excel文件首先要添加Microsoft.Office.Interop.Excel引用,并在代码中添加引用using Microsoft.Office.Interop.Excel ,然后新建一个ApplicationClass 实例,通过Excel应用程序实例进行相关的Excel文件操作,将创建的临时Excel文件读到内存流中,然后以二进制方式输出,并在最后将此实例释放。

使用Excel应用程序对象创建Excel文件,需要在服务器端安装Office,而且还需要设定权限允许.NET访问COM+,并且在服务器端会看到Excel程序窗口一闪而过,当然可以让程序窗口不显示,但是任务管理器里还是会有Excel程序的进程,如果多个用户同时请求导出Excel文件,会产生多个Excel程序的进程,消耗过多的服务器资源,可能导致服务器宕机。另外Excel程序会把只包含数字的列进行类型转换,原本是文本型的,Excel程序会将其转成数值型,比如000123会变成123。如果内容以“=”开头,Excel程序还会把它当成公式执行,然后报错等,不便于原始格式Excel的生成。

使用第三方Excel类库的优势就是不需要在服务器上安装微软的Office,避免版权问题,而且使用起来比Office PIA的API更加方便,更人性化,但几种Excel类库各有千秋。比如MyXlS 是一个免费开源的类库,侧重于Excel的输出。可以设置到单个单元格,但读取功能很弱。Koogra与MyXlS恰恰相反,是一个非常好用Excel读取类库,其最新版可以支持Excel 2007格式,可是在测试过程中发现Koogra读不了MyXlS输出的XLS文件。而NPOI不仅支持导出Excel,还支持导入Excel,并能“理解”OLE2文档结构。对于Excel文件来讲,NPOI不单是能创建Excel文件,而且能更深入地执行Excel文件的各种操作,比如支持单元格的格式设置、合并单元格、对齐设置、使用边框、字体设置、背景和纹理设置、宽度和高度设置等,还能使用Excel公式、创建图形、设置打印机属性、锁定列、设置密码等多项操作。

3 利用NPOI导出Excel文件的实现

基于上述分析,我们使用NPOI类库实现Excel文件的导出。该类库是POI的.NET版本。POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97、Office 2003版本的文件。最新的NPOI有.Net 2.0、3.5和4.0三个版本,支持Excel、Word的97、2003和2007格式。

利用NPOI实现Excel文件导出的步骤:

3.1 添加NPOI的引用

先在项目工程里引用NPOI.DLL,然后在代码开始处添加引用:

using NPOI.SS.Util;

using NPOI.SS.UserModel;

using NPOI.HSSF.UserModel;

3.2 创建工作簿

HSSFWorkbook hssfworkbook = new HSSFWorkbook();

Sheet sheet1= hssfworkbook.CreateSheet(title);//创建标题为title内容的工作簿

3.3 设置单元格样式

………

Row row1 = sheet1.CreateRow(0);//创建行对象

Cell cell1 = row1.CreateCell(0);//根据行对象创建单元格对象

CellStyle style = hssfworkbook.CreateCellStyle();//创建样式对象

Font font = hssfworkbook.CreateFont();//创建字体对象

style.Alignment = HorizontalAlignment.CENTER;//设置水平居中

style.VerticalAlignment = VerticalAlignment.CENTER;//设置垂直居中

font.FontHeight = 18 * 20;//设置字体

style.SetFont(font);//设置样式的字体

cell1.CellStyle = style;//设置单元格的样式

………

3.4 合并相关单元格

………

CellRangeAddress region = new CellRangeAddress(0, 0, 0, 11);//设置合并区域为0行0列到0行11列

sheet1.AddMergedRegion(region);//为工作簿sheet1添加合并区域

………

3.5 单元格赋值

………

string title = "2013年度教学任务分配表";

cell1.SetCellValue(title);//为单元格赋值

………

3.6 导出Excel文件

………

MemoryStream s = new MemoryStream();

hssfworkbook.Write(s);

hssfworkbook.Dispose();

Response.Clear();

Response.Buffer = false;

Response.ClearContent();

Response.ClearHeaders();

Response.AddHeader("Content-Disposition","attachment;filename=" +Server.UrlEncode("教学任务分配表.xls"));

Response.BinaryWrite(s.ToArray());

s.Dispose();

Response.End();

上一篇:关于我国农村“空巢”家庭养老问题的应对措施... 下一篇:医院档案管理信息化的问题与对策