基于Excel实现动态报表
2017-04-27乔治强
乔治强
摘要:对软件设计中常涉及的动态报表输出问题,NPOI是一个开源的读写excel文件的组件,通过在软件中调用NPOI组件、设计报表模版,并将数据填充到Excel文件中,解决了软件设计中报表定制输出的问题,并在应用软件的开发中得到应用。并在基于c#开发的系统中实现了Excel动态报表制作技术。
关键词:NOPI;动态报表;报表输出
文献编号:TP317 文献标识码:A 文章编号:1009-3044(201 6129-0101-02
1背景
在管理类软件应用中,用户需要生成各种复杂报表,还要求报表在使用期可以更改格式。以delphi、c#为代表的编程语言中普遍提供报表设计器,但大都是在软件设计期指定报表格式,编译后用户不能不能变更或增加报表。为了解决这些问题,本文采用NPOI组件,NPOI是一款开源免费的组件,不依赖Microsoft Office环境,NPOI还可以应用Microsoft Office本身的公式及格式,在软件中实现客户自定义报表格式,软件填充数据,从而很好的解决了这一问题。
2实现原理
用户使用时自定义Excel模版,Excel模版存入数据库,并制定用户打印数据对应Excel单元格的坐标(row和col)。用户打印时,从数据库下载对应的Excel模版生成响应的Excel文件,生成需要打印的数据,并输入响应的Excel单元格中。
3实现过程
3.1报表信息
系统采用access数据库,数据库中存放一个模版信息表和多个数据源信息表。每份报表的数据由一个模版信息表加若干个数据源组成。
模版信息表:模版编号(主键,自动生成)、模版名称、模版内容(OLE对象,即二进制数据)。模版内容自段是要存储xsl模版的文件,该文件定义了格式信息。模版信息表存储对模版的定义,是一个excel文件及报表名。软件生成报表时需要将模版下载并保存用户目录上,然后对模版(excel文件)赋值。
数据源:模版编号、字段名、记录类型、开始行号、列号,行数,每页重复。
每一份报表由表头、报表主体、表尾组成;表头和表尾可以选择每页重复;报表主体是多条记录,由多行构成。表头、报表主体、表尾可以分别由不同的数据源构成,整个数据填充过程分三步完成。
3.2保存excel模版
将excel模版作为access数据库的字段存入数据库。生成报表时则将模版取出保存为本地文件,然后将数据输出到模版中。
Filelnfo fi=new Filelnfo(fileName);//讀取文件
FileStream fs=fi.OpenRead();
bytel]bytes=new byte[fs.Length];
fs.Read(bytes,0,Convert.ToInt32(fs.Length));//将文件转换为二进制流
string eonnstr="Provider=Mierosoft.Jet.OLEDB.4.0;Da-ta Souree=C:\\Lrpt.mdb":
OleDbConnection cn=new OleDbConnection(connstr);
OleDbCommand cm=new OleDbCommand();
cm.Connection=cn;
cm.CommandType=CommandType.Text;
if(cn.State==0)cn.Open();
3.3读取excel模版
从数据库读出数据,并将二进制数据转储为本地文件
OleDbDataReader dT=null;
//中间有关数据库操作代码省略,am是OleDbCom-mand对象
3.3基于nopi组件实现报表输出
在实现将数据输入到excel模版过程中,需要解决读写ex-cel文件的问题。通过编程方式读写excel文件的方式有三种:
1)OleDb方式,将excel文件当作一个DataBase,而excel工作表作为一个table,是将excel的列名当作字段名,excel行当作table的一条记录,通过sql语言实现读写。用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活。
2)Com组件的方式读取Excel,这种方式需要先引用Micro-soft.Office.Interop.Excel。web方式实现时需要服务器安装excel和配置网络安全选项。可以非常灵活的读取Excel中的数据,基于单元格方式读取的,所以读写数据很慢,太大时不建议使用。
3)NPOI方式读取Excel,NPOI是POI项目的.NET版本。POI是一个Apache软件基金会开源的Java读写Excel、WORD等微软文档的项目。Nopi模式可以脱离excel读写excd文档,可适用于c/s和b/s模式。
本文就采用nopi模式实现excel中数据的写入。