一种高效率的.NET平台Excel文件控制方法

时间:2022-10-26 11:21:52

一种高效率的.NET平台Excel文件控制方法

摘要:目前,.NET框架下开发中的Excel应用主要使用微软提供的OLE接口,但是这种方法需要服务器后台启动Excel进程,当应用数据量或者用户激增时,OLE方法将极大地耗费系统资源。对一种Java编译的第三方空间NPOI进行了研究,详细阐述了对Excel文件格式进行控制的方法,能够实现在服务器未安装MS Office的环境下,采用文件流方式对Excel文件进行读写和控制,从而极大地节省了服务器资源。

关键词关键词:NET;NPOI;Excel;文件流

中图分类号:TP301文献标识码:A文章编号文章编号:16727800(2013)011002602

0引言

由Windows平台支撑的.NET框架是目前Web开发使用的主要工具之一,是由微软公司提供的解决方案。在Webform开发过程中,一般采用微软体系下的OLE方式对Excel文件进行读写编辑的操作,虽然代码编写简单,网上也有大量的例程,但是当Web程序真正投入使用时,其响应速度和资源耗用却不能使用户感到满意,尤其是在数据量大、瞬时爆发用户多、页面结构复杂的情况下。究其主要原因在于:①需要在服务器安装Office系统;②每接入一个用户都要启动一个Excel进程。笔者以前编写的应用程序在投入使用之后,高峰期服务器进程中有40多个Excel进程,每个占用内存5~40M之间,服务器不堪重负。因此,使用一种替代方案尤为必要。

1NPOI简介

NPOI是POI的.NET版本,是一套用Java写成的第三方库,能够帮助Webform的开发者在没有安装Office的情况下读写Excel格式的文件,目前其2.0版本已经能够支持Excel 2007。NPOI对Excel进行读写的主要方法是按照Excel组织文件的格式规则和方法通过文件流方式生成Excel文件,从而避免了通过OLE方式激活庞大的Excel进程,大量节省了服务器的资源,提高了服务器生成Excel文件的性能。

对于Webform开发者来讲,Excel包括的核心元素按照层次由上至下有工作簿(也就是一个xls文件)、工作表(也就是一个sheet)、表格中一个行、表格中的一个单元格。与此相对应,NPOI通过HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell这4个类分别来定义上述的Excel核心元素,完成xls文件的创建过程。

2NPOI应用实例

NPOI在使用之前,要引用NPOI.dll、Ionic.Zip.dll这两个文件,并引用NPOI.HSSF.UserModel这个命名空间,如果要使用功能更强的SS接口,则要同时引用NPOI.SS.UserModel。

2.1创建一个基本的Excel文档

构造一个xls文件,首先要创建一个工作簿book1:

IWorkbook book1 = new HSSFWorkbook();

然后,创建一个工作表sheet1:

ISheet sheet1 = book1.CreateSheet("新工作表");

这里新创建的对象sheet1对应的工作表在xls被命名为“新工作表”,那么一个新的完整结构的空xls文件即被创建。如果需要向xls填充数据,则需要定义一个表格行和一个单元格:

IRow row0 = sheet1.CreateRow(0);

ICell cell0 = row0.CreateCell(0);

以上方法创建了工作表中行号为1的一个表格行,同时创建了行号为1,列号为A的单元格A1。要向这个单元格写入数据,则使用如下方法:

cell0.SetCellValue("这是第一格数据");

此时,一个完整的具有所有元素的Excel空白文档就生成了。

2.2基本Excel文档格式控制方法介绍

在Excel的使用过程中,设置页边距、边框、列宽行高、文字字体、数值样式,以及合并单元格、单元格水平垂直居中等经常要使用到Excel功能,NPOI对页面的这些设置也都能实现,下面简单介绍一下设置的方法。

(1) 设置页边距。页边距设置如图1所示,方法如下:

(2) 设置边框。官方例程里是用Region方法来批量设置边框格式,但是仍然在进化过程中的NPOI1.2.5版本在VS2010下使用Region方法调试通不过,所以退而求其次对单元格进行边框样式设定。首先使用ICellStyle创建一个单元格格式对象,然后对单元格边框进行指定:

(3) 设置列宽和行高。使用以下方法设置列宽和行高:

sheet1.SetColumnWidth(0,50*256);//设置第一列的宽度

sheet1.CreateRow(0).HeightInPoints = 20//设置第一行的高度

NPOI开发者宣称在设置列宽时指定的列宽值需要乘以256才是真正的列宽值,但是经笔者调试,这个数值随着调试机器的不同而发生变化,初步分析跟Windows某些视频驱动有关系,因此在编程时应注意调试。行高使用HeightInPoints,与Excel单位相同。

(4) 合并单元格。使用以下方法合并单元格:

sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(2,1,4,4));

此方法将B3:D5合并为了一个单元格。

(5) 设置文字字体:设置文字字体仍然使用ICellStyle类来实现:

ICellStyle style1= book1.CreateCellStyle();//创建单元格格式对象

IFont font1= output.CreateFont();//创建字体对象

font1.FontName="宋体";//设置字体名称

font1.FontHeightInPoints = 12;//设置字号

style1.SetFont(font);//给style1格式设置字体参数

cell0.CellStyle = style1;//设置单元格格式

(6) 设置数值样式。设置数值样式同样使用style1格式对象,比如要设置单元格数值样式为保留两位小数,则可以使用如下方法来实现:

style1.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");

cell0.CellStyle = style1;

引号内的参数值直接使用Excel内置的格式列表,如图2所示。

图2Excel数值格式列表 (7) 设置单元格水平垂直居中。设置单元格垂直水平居中,仍然使用style1格式对象:

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

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

水平居中还有LEFT、RIGHT等方法,垂直居中还有TOP、BOTTOM等方法。

2.3Excel文件输出

当数据填充和格式设定完毕,需要保存这个xls文

第11期 赵伟:16节点COMA型并行机Cache一致性研究软 件 导 刊2013年标题

上一篇:南水北调中线明渠工程运行风险评价方法研究 下一篇:领域本体支持下的语义查询扩展研究