一个报表文档双向格式转换组件

2010-09-15 03:38袁冠远袁卫华袁姝郭维琪
武汉纺织大学学报 2010年2期
关键词:画布绘图报表

袁冠远,袁卫华,袁姝,郭维琪*

(1 广州大学 华软软件学院,广州 51000;2 武汉纺织大学,武汉 430073;3 中国地质大学,武汉430074)

一个报表文档双向格式转换组件

袁冠远1,袁卫华2,袁姝3,郭维琪2*

(1 广州大学 华软软件学院,广州 51000;2 武汉纺织大学,武汉 430073;3 中国地质大学,武汉430074)

在现代企业的信息管理中,报表作为一种重要的输出载体,有着至关重要的作用。为了实现不同报表文档格式的相互转换,本文分析了Active Reports和StimulReports这两种报表文档的格式,给出了在两者之间进行格式转换的原理和实现代码。利用本组件在.NET 平台下进行系统开发,可以增强报表系统的可移植性和可扩充性。

报表;格式转换;组件

在基于数据库的信息系统中,信息的输出反映了整个应用系统的最终运行结果,报表作为一种重要的输出载体,在现代企业的信息管理中无疑起着至关重要的作用[1,2]。在微软的 .Net 平台下,可选的报表组件很多,老牌的有 Crystal Report、Active Reports,.Net 平台下的新秀有 SQL Server Reporting Service、Stimul Reports、 Component One Reports、 Xtra Reports[3,4]。不同的报表组件所生成的最终文档格式不一样,对这些文档格式进行相互转换,其意义不亚于在微软的Word文档与金山的WPS文档之间进行格式转换[5]。

1 原理

当前,各种报表组件都是按照模板-引擎-文档的模式(如图1)开发的[6-9]。报表设计人员使用设计器设计好报表模板,报表引擎根据报表模板和相关的数据生成最终文档,最后,根据不同的需要,可以对最终文档进行不同的输出,如打印,保存,导出为其它通用文档格式。

图1 各种报表组件工作模式

不同的报表组件由于其报表引擎不同,使用的报表模板不一样,所生成的最终文档格式就不一样。而同一个企业甚至同一个信息系统,根据不同的需求和报表组件的不同功能,可能会选用两种或更多的报表组件,因此有必要对不同的报表组件生成的最终文档进行格式转换。本文对两种报表组件(Active Reports,StimulReports)所产生的最终文档格式进行分析,并开发了一个双向文档格式转换组件(如图2)。

图2 双向格式转换组件示意图

2 文档格式分析

2.1 StimulReports 文档格式:

StimulReports 产生的最终文档,具有良好的文档对象模型(Document Object Model, DOM)[10], 它包含文档-页面-组件这样一个层次结构。它的顶层对象是文档(StiReports), 一个文档包含所有生成的页面(RenderedPages), 每个页面(StiPage)则包含所有组成页面的组件(Components),每个组件(StiComponent)表示一个页面元素。有多种类型的组件,如文字(StiText)、图片(StiImage)、条码(StiBarCode)等(如图3)。

图3 StimulReports 文档结构示意图

2.2 ActiveReports 文档格式

ActiveReports 产生的文档,不是严格的DOM,而是DOM + 画布(Canvas)模型。它的顶层对象是文档(Document), 一个文档包含所有生成的页面(Pages), 每个页面(Page)则是一个画布。画布提供了一个比较灵活的绘图场所[11]。它提供了一系列的属性(Property)来设置当前的用于绘图的特点,如ForeColor用于设置当前的前景色,Font 用于设置当前的字体,等等;也提供了一系列的方法(Method)用于在画布上绘图,如DrawText 用于绘制文字,DrawImage 用于绘制图片,等等。当然,它也提供了一个很重要的属性:CanvasItems,用于获取当前画布中所有的绘制项目(CanvasItem)(如图4)。

图4 ActiveReports 文档格式示意图

3 双向文档格式转换组件实现

本双向格式转换组件由三个类组成:PageBuilder 类用于辅助构造Active Reports 页面;StiDocument2ARDocument 类用于将 StiReports 报表文档格式转换为 Active Reports 报表文档格式;ARDocument2StiDocument 类用于将 Active Reports报表文档格式转换为 StiReports 报表文档格式。

3.1 PageBuilder 类

鉴于 Active Reports 文档并非完全 DOM ,为了方便地生成其文档,而不是每次都采用画布模型绘图,这里特封装了 PageBuilder 类,用于构造页面。这个类主要重载[12]了几个 Add 方法,用于添加各种 Active Reports 模板对象(注意,虽然Active Reports生成的最终文档不是完全DOM,但其报表模板是完全DOM。这里Add方法内部将传入的模板对象转换为画布中的属性以及绘图指令)。这里Add方法内部将传入的模板对象转换为画布中的属性以及绘图指令),如:

在以上源代码中, page 是 PageBuilder 类的成员变量,是一个 Page 类的对象,表示当前的页面。由此代码也可以看出 Page 的Canvas 模式:先设置一系列的属性值如 ForeColor, PenStyle, PenWidth, 再调用 DrawLine 方法来绘制线条。其它的 Add 重载函数代码基本上也是这个思路。

使用 Add 方法构造完页面之后,可以使用PageBuilder 类的 Page 属性获取生成的页面。

3.2 StiDocument2ARDocument 类

有了 PageBuilder 类之后,可以着手实现StiDocument2ARDocument 类了。

StiDocument2ARDocument 类提供了 Sti Document 属性,用于设置待转换的 StiReports 文档对象; ARDocument 属性,用于获取转换之后的Active Reports 文档对象。同时,它封装了 Convert方法,用于执行转换操作。

Convert 函数的实现思想并不复杂,它首先创建了一个 Active Reports 的 Document 对象;然后遍历 StiReports 文档的每一页,创建一个PageBuilder 对象,用于构建 Active Reports 的Page;然后遍历当前 StiPage 中的每一个组件(StiComponent),根据当前组件的类型,调用AddComponent函数的不同重载版本,将其转换为Active Reports 对应的组件,并调用 PageBuilder 的Add 方法,添加到当前的页面。

Convert 方法的基本代码如下:

对于不同类型的 StiComponent ,需要实现不同的AddComponent 重载版本。 虽然从StiComponent 继承以及间接继承的派生类非常多,但是相当一部分只是作为报表模板组件存在,在生成的最终文档里,只包括有限几种类型的组件。这些类型以及转换后对应ActiveReports 组件见表1。

表1 StiReports 组件与 Active Reports 组件对照表

因此我们只需要为这几种类型的组件编写AddComponent 重载函数即可。这里仅列出添加文本框组件的代码,其它组件的代码结构基本相同:

3.3 ARDocument2StiDocument 类

ARDocument2StiDocument 类用于Active Reports 文档到 StiReports 文档的转换。类似地,ARDocument2StiDocument 类提供了 ARDocument属性,用于设置待转换的 Active Reports 文档对象;StiReports 属性,用于获取转换之后的 StiReports文档对象。Convert 方法,用于执行转换操作。

Convert方法的实现思想与StiDocument2ARDocument 类 的 Convert 方法基本相似,但由于 ActiveReports 文档不是完全的 DOM,所以代码的实现上会有所不同。它首先创建了一个StiReports 对象;然后遍历 Active Reports 文档的每一页,创建一个 StiPage 对象;然后通过当前Active Reports页(Page)的 CanvasItems 集合,遍历每一个绘图项目(CanvasItem),由于 CanvasItem 并非一个完整的页面元素(文本、图片等)。它有可能只是属性设置指令,如设置当前的前景色(ForeColr),背景色(BackColor),字体(SelectFont),等等;也有可能是绘图指令,如输出文字(TextOut),填充矩形(FillRect),绘制JPEG图片(JPEGImage)等等。对于属性设置指令,只能先暂存在环境变量中,以备遇到绘图指令,生成对应的 StiComponent 对象时使用:

Convert 方法的基本代码如下:

在 Convert 方法中,转换绘图指令为相应的组件(StiComponent),将当前环境变量中的相关值作为组件的属性,然后添加到转换后页面。这些工作是由AddTextControl、AddPictureControl、AddRoundRectControl、AddFillRectControl等函数来实现的。以下仅列出 AddTextControl 函数代码:

4 调用示例

转换组件的调用相当方便。一般流程是,根据需要,先创建合适的转换组件对象,然后加载待转换的源文件,调用Convert方法,执行转换即可。以下代码演示了将 StimulReports 文档转换为Active Reports 文档。

反向转换的代码类似,鉴于篇幅限制,在此不再提供。

5 结论

本组件采用 Visual Studio 2008, C# 语言开发,StimulReports版本为 2008.2.300.0, Active Reports 版本为 5.2.1013.2, 已稳定应用于多个管理信息系统。本组件虽然只实现了 Active Reports 文档与 StiReports 文档的相互转换,但它提供了一种思路,具有很强的通用性和实用性,可以轻松实现转换其它报表组件生成的文档。

[1] Chee Hoong Leong,Sai Peck Lee. A customisable report generator component system[J]. Malaysian Journal of Computer Science, 2003, 16(1): 1-8.

[2] Daniel K. C. Chan. A document-driven approach to database report generation[C]. DEXA Workshops, 1998.

[3] Carl Ganz, Jr. Real world enterprise reports using VB6 and VB. NET[M]. Berkeley, CA: Apress, 2003.

[4] Dariusz Król, Jacek Oleksy, Malgorzata Podyma, Bogdan Trawinski.The analysis of reporting tools for a cadastre information system[C]. Business Information Systems – BIS, 2006:150-163.

[5] 项 伍,曹峰.文档转换工具的设计与实现[J]. 计算机工程, 2008, 34(21): 48-50.

[6] Felipe I. Anfurrutia, Oscar Díaz, Salvador Trujillo. A product-line approach to database reporting[C]. Jornadas de Ingeniería del Software y Bases de Datos – JISBD, 2005.

[7] Leong Chee Hoong , Lee Sai Peck. A Report Generator Component System using XML-driven, Component-based Development Approach[J]. Informing Science, 2003(6): 53-61.

[8] 宋晓宇,刘蔚然,王永会.自定义报表系统的组件化开发[J]. 计算机与数字工程, 2008, 36(6): 82-84.

[9] 李兴勇, 袁兆山, 江正海. 复杂报表生成系统实现技术研究[J]. 计算机应用, 2006, 27(7): 1821-1824.

[10] 王海凤, 萨智海. DOM技术在数据转换中的应用[J]. 内蒙古工业大学学报, 2002, 27(4): 270-274.

[11] 李涛. 基于Delphi 的精确定位套打设计与实现[J].计算机工程与设计, 2007, 28(15):3793-3796.

[12] Andrew Troelsen.Pro C# 2008 and the .NET 3.5 Platform[M]. Berkeley, CA: Apress, 2007: 113.

A Component for Mutual Format Converion between Report Files

YUAN Guan-yuan1,YUAN Wei-hua2,YUAN Shu3,GUO Wei-qi2

(1 South China Institute of Software Engineering of Guangzhou University, 510990 2 Wuhan University of Science and Engineering, 430073 3 China University of Geosciences, Wuhan, 430074)

Report files have been playing a crucial role in information management of modern enterprises as an important means of output carrier. In order to implement interconversion between different report files, the paper analyzes two report document formats, namely, Active Reports and StimulReports, which present the principle and source code of conversion between the two reports. System developed under .NET Framework by using this component can strengthen the capacity of transplant and expansion of the reporting system.

report files; format converion; component

TP317.3

B

1009-5160(2010)02-0048-05

*通讯作者:郭维琪(1954-),男,高工,研究方向:机电一体化.

湖北省自然科学基金项目(2008CDZ058).

猜你喜欢
画布绘图报表
来自河流的你
“禾下乘凉图”绘图人
在画布上做梦的画家 夏加尔
为什么要在画布上割一刀?
让鲜花在画布上盛开
垂涎三尺
LabWindows/CVI中Excel报表技术研究
从三大报表读懂养猪人的成绩单
大师的画布
月度报表