基于NPOI组件生成Excel报表的设计与实现

2016-03-22 14:00蔡小艳卢莉娜郑炎朱成文
电脑知识与技术 2016年1期

蔡小艳++卢莉娜++郑炎++朱成文

摘要:为避免传统操作Excel遇到的问题,提高信息管理系统中数据导出操作的灵活性和通用性,该文详细介绍了在Visual Studio 2008使用C#语言、通过引用开源的NPOI组件,结合Microsoft SQL Server 2005实现数据库数据导出到Excel的设计思路和实现方法。

关键词:C#;Excel;NPOI;导出数据

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)01-0064-02

1 概述

NPOI是POI(POI是一个开源的Java读写Excel、Word等微软OLE2组件文档的项目)项目的.Net版本。NPOI可以在未安装Office的环境下实现Excel、Word等微软OLE2组件文档读写[1],并能实现公式计算、单元格高级样式等复杂操作。因此,本文借助第三方组件NPOI的方式来实现Excel数据的批量导出。

2 数据导出设计思路

2.1基本思路

采用NPOI组件将SQL Server数据库中的数据导出到Excel表格的思路分析:

1) 选择需要导出的数据;

2) 从SQL Server2005读取表中数据到DataSet中;

3) 调用FileStream类创建一个文件对象;

4) 调用HSSFWorkbook类创建工作薄对象;

5) 调用ISheet类创建工作表对象;

6) 定义表格行和单元格;

7) 将DataSet中的数据按格式要求分别填入工作表对应的单元格;

8) 将整个工作表内容写入到文件对象中,从而生成对应的Excel文件。

2.2数据导出流程图

使用NPOI组件导出Excel数据的流程图如图1所示。

3 使用NPOI导出数据到Excel

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

3.1添加NPOI的引用

使用NPOI创建Workbook之前,先要在项目中添加NPOI的引用,具体步骤如下:

1)在项目菜单栏中选择“项目”→“添加引用”,弹出“添加引用”对话框。

2)选择浏览选项卡,选择NPOI.dll。

3)单击“确定”按钮,将NPOI.dll引用到工程中。

4)进入代码编辑器窗口,添加using语句引入NPOI的命名空间。

using NPOI.HSSF.UserModel;

using NPOI.SS.UserModel;

using NPOI.SS.Util;

NPOI.HSSF.UserModel 空间主要有HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,对应的接口为位于NPOI.SS.UserModel 空间下的IWorkbook、ISheet、IRow、ICell,分别对应Excel文件、工作表、行、单元格[3]。

图1 数据导出流程图

3.2创建工作薄

创建一个新的xls工作薄只需要初始化一个新的HSSFWorkbook实例,代码如下:

HSSFWorkbook wkBook =new HSSFWorkbook( ); //创建工作薄wkBook

上述语句创建的wkBook在Excel中打开会报错,因为Excel规定一个Workbook必须至少带一个Sheet,所以必须加入下面创建sheet的代码才能保证生成的文件正常。

ISheet sheet= wkBook.CreateSheet(“单位信息表”); //创建一个工作表sheet

创建单元格首先要创建单元格所在的行,下面的代码创建了第0行。

IRow row = sheet.CreateRow(0); //创建单元格所在的行row

行创建好后就可以创建单元格,下面的代码创建了A1位置的单元格。

ICell cell = row.CreateCell(0); //创建单元格cell

3.3 设置单元格字体

在设置字体之前,首先需要创建字体对象,代码如下:

IFont font = wkBook.CreateFont( ); //创建字体对象

1)设置字体名称

设置字体名称的前提:假设打开这个xls文件的电脑有这种字体,如果没有,Excel将使用默认字体。下面是设置字体名称为“宋体”的代码:

font.FontName=”宋体”;

2)设置字号

与字号相关的属性有FontHeight和FontHeightInPoints,通常使用FontHeightInPoints来设置,代码如下:

font.FontHeightInPoints = 10; //设置字号

字体在设置完成后,赋给单元格样式,代码如下:

ICellStyle style = wkBook.CreateCellStyle( ); //创建样式对象

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

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

3.4 向单元格写入数据

Cell.SetCellValue( “单位名称” );

如果要创建多个表格行和单元格,并在其中填充数据,可以使用循环和嵌套循环的方法来创建。

3.5 导出Excel文件

数据填充完毕,保存xls文件通过如下代码来实现:

FileStream fs = new FileStream(fName, FileMode.OpenOrCreate);

其中fName表示xls文件的保存路径;FileMode.OpenOrCreate表示操作系统打开文件的方式,如果文件存在则打开,否则,创建新文件。

创建FileSteam文件流后,直接调用HSSFWorkbook类的Write方法即可将设置好格式并填充完数据的Excel文件创建在指定的目录中,数据的导出工作完成。

wkBook.Write(fs);

使用NPOI组件将DataSet对象中的数据导出为Excel文件的核心代码如下:

public static bool ExportToExcel(DataSet ds, string fName)

{ HSSFWorkbook wkBook = new HSSFWorkbook();

ISheet sheet = wkBook.CreateSheet("导出信息");

bool res = true;

FileStream fs = null;

try

{fs = new FileStream(fName, FileMode.OpenOrCreate);

//导出表头

IRow row = sheet.CreateRow(0);

ICell cell;

int cid = 0;

for (int i = 0; i < ds.Tables[0].Columns.Count; i++)

{ cell = row.CreateCell(cid);

cell.SetCellValue(ds.Tables[0].Columns[i].ToString());

cid++;}

//导出内容

for (int j = 0; j < ds.Tables[0].Rows.Count; j++)

{row = sheet.CreateRow(j + 1);

cid = 0;

for (int i = 0; i < ds.Tables[0].Columns.Count; i++)

{cell = row.CreateCell(cid);

cell.SetCellValue(ds.Tables[0].Rows[j][i].ToString());

cid++;}}

wkBook.Write(fs); }

catch (Exception e)

{System.Diagnostics.Trace.WriteLine(e.Message);

res = false; }

finally

{ if (fs != null)

{

fs.Close();}}

return res;}

4 结束语

本文采用Visual Studio开发平台,运用开源的NPOI组件,结合Microsoft SQL Server 2005实现了Excel文件的批量生成,能在没有安装Office的机器上将数据库中的数据导出到Excel文件。NPOI文档完善、更新及时,使用NPOI组件生成Excel文件非常方便、人性化。

参考文献:

[1] NPOI官网[EB/OL]. http://npoi.codeplex.com

[2] 李硕.一种高效率的.Net平台Excel文件控制方法[J].软件导刊,2013(11):26-27.

[3] 钱立,邓绯.高校新生入学宿舍管理系统的设计与实现[J].重庆三峡学院学报,2014(3):48-51.