倪问尹,陈顺平,尹 锋
NI Wen-yin, CHEN Shun-ping, YIN Feng
(长沙大学,长沙 410003)
报表是用表格、图表等格式来动态显示数据的一种方式,即指定数据以指定运算方法得出结果后,以指定样式在指定页面上的特殊表现形式。目前,Web报表已成为报表发展的一个主流方向[1]。目前国内外主流Web报表产品,如水晶报表(Crystal Report)、Style Report、Brio、MSTR、和勤报表、用友华表等,其基本思路都是利用特定文件格式生成报表,通用性、兼容性较弱。应此,格式转换的设计与实现成为通用WEB报表服务的基础,也是解决开放式架构和系统集成的核心问题。
本系统基于.NET平台开发,根据用户自定义在服务器端实现报表格式自动转换,将报表XML表现后利用服务器端的组件解析生成HTML文档,利用XML本身强大的可扩展性、可复用性和自解释性实现通用的WEB报表服务[3~5]。系统采用.NET Framework用于生成、部署、运行 XML Web Services 和应用程序,使用SQL数据库实现数据存储,使用 C#语言进行程序编辑,具备在线定制与在线运行功能。
影响报表样式变化的因素有应用领域、用户需求和个人爱好等,其最终都可以归结为以下几种报表模型的组合:列表、分组报表、嵌套报表、交叉报表、图形报表等。
常见的报表的结构布局为表头(Report Header)、表尾(Report Footer)、页眉(Page Header)、页脚(Page Header)、分组(Group)、主体(Detail)、合计(Summary)等。
按照报表元素的层次,组成报表的元素可分成报表根元素、容器元素和实体元素三种。
从报表对象到格式报表文件之间就是一个规则映射过程[6,7]。其主要思路是:将从应用程序中导入的应用对象与从规则库中导入的规则子集进行匹配,按匹配成功的规则执行动作,将结果输出给应用程序。基于基本映射技术实现的系统称作规则引擎,即根据规则中包含的指定过滤条件,判断能否匹配运行时刻的实时条件来执行规则中所规定的动作。四个基本要素是:信息元Information Unit(包含特定事件所有信息的对象,如信息元类型、相关规则集、通用属性及相关信息等[8])、信息服务Information Services、规则集Rule Se、队列管理器Queue Manager(管理来自不同信息服务的信息元对象)。其实现如图1所示。
图1 规则映射技术的实现
设计报表类TxtReport封装报表的属性和对报表的操作,通过该报表对象实现对报表的访问、修改、发布等操作,并封装对象序列化的过程。将设计的报表保存为.txt格式的报表定义文件的过程,即报表对象序列化的过程[9]。其UML图如图2所示。
图2 报表类TxtReport的UML图
其中,主要属性包括:ReportName(报表名称)、PageWidth(报表页宽度)、PageHeight(报表页高度)等。
主要操作方法包括:CreatNewReport()创建一个空的报表、SaveToFile()保存当前报表、DeplayReport(path:string)将当前报表发布到指定目录path中等。
将所有报表实体元素的共同属性和操作方法抽象出来,构造一个报表元素基类TxtObject。各种具体的报表实体元素类继承自TxtObject,拥有独特属性,并且重写了三个重要函数:
1)Draw():在报表设计界面上画出该报表元素;
2)LoadFromStream(Stream:TStream):加载序列化后的报表实体元素对象;
3)SaveToStream(Stream:TStream):保存该报表实体元素对象,即序列化。
TxtObject类的UML图如图3所示,每个报表元素类中都封装了对象序列化的过程(子类的UML图略)。
图3 TxtObject类的UML图
1)根元素<MsReport attribute=”value”></MsReport>
报表定义文件中的根元素,用MsReport标识,每个报表定义文件中有且只有一个根元素。其中attribute表示属性名,value表示属性值。
2)容器元素
区域是报表的重要组成部分,一个完全的报表包括若干个区域,每个区域可作为报表的一个容器元素,包括表头、分组、报表主体、总结等几个区域[10]。
3)实体元素
用标识rectangle、staticText、textField、chart等来表示报表实体元素。
针对两种格式的报表(ILASSⅡ中底层数据.txt格式的报表和 WEB发布时通用的.xml格式报表) 定义映射规则以实现这两种报表格式之间的转换[11]。使用DOM技术,对.XML格式的报表定义文件在内存中构造DOM树,从树根开始,深度遍历每个结点,根据结点的属性逆向构造报表对象和报表中的每一个实体元素。当整个DOM树遍历完成后,也就构造了整个报表对象,然后将逆向构造成的报表对象序列化得到.TXT格式的报表文件。
假设txt文件中有以下字段:Name:***Version:*.*.* Size:10 M Repo:installed Summary:5 - Beta Description:********。在通用WEB报表服务中转换为xml格式过程如下:
本文设计实现的通用WEB报表服务系统中报表格式的转换,主要是针对目前WEB报表存在的问题,基于.NET平台的体系结构和技术特点开发,实现了其它报表系统不支持的在线定制报表的功能。通过规则映射实现的报表通用化,即解决了不同报表格式的转换,避免了因环境改变而不得不重新开发报表的问题,同时这种转换具有很强的可扩展性,只需将映射规则在规则库中扩展并修改报表格式转换模块的接口,便可以实现更多格式报表的定制与解析。
[1]陈明.分布计算应用模型[M].北京:科学出版社,2009.04:219-220.
[2]张有明,张科,高赟.基于Access的信息管理系统开发实践[J].电化教育研究,2007(02):65-68.
[3]Lawrence, Racoon.The space efficiency of XML.Information and Software Technology,2004,46.
[4]Kristensen,Anders.Formsheets and the XML forms language.Computer Networks,1999,31.
[5]Michalis Petropoulos, Yannis Papakonstantinou, Vasilis Vassalos.Building XML query forms and reports with XQForms.Computer Networks,2002,39.
[6]王李军,陶明亮,张曙,莫琪叶.面向业务规则引擎研究[J].软件技术与数据库,2007(24):65-68.
[7]彭磊.规则引擎原理分析[J].福建电脑,2007(9):42-45
[8]蔡文,杨春燕.面向业务规则引擎研究[J].智能系统学报,20094(3):234-238.
[9]李佳,付强,丁宁,等.C#开发技术大全 [M].北京:清华大学出版社,2009:538-540.
[10]张文启.基于AJAX的可复用Web报表系统的设计及实现[D].中山大学,2009:12-13.
[11]郭昕,武娟.基于C#语音的EPSW与CASS数据格式转换[J].北京测绘,2009(4):78-84.