基于NPOI组件生成Excel报表的设计与实现
2016-03-22蔡小艳卢莉娜郑炎朱成文
蔡小艳++卢莉娜++郑炎++朱成文
摘要:为避免传统操作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.