袁冠遠,袁衛(wèi)華,袁姝,郭維琪*
(1 廣州大學 華軟軟件學院,廣州 51000;2 武漢紡織大學,武漢 430073;3 中國地質大學,武漢430074)
一個報表文檔雙向格式轉換組件
袁冠遠1,袁衛(wèi)華2,袁姝3,郭維琪2*
(1 廣州大學 華軟軟件學院,廣州 51000;2 武漢紡織大學,武漢 430073;3 中國地質大學,武漢430074)
在現代企業(yè)的信息管理中,報表作為一種重要的輸出載體,有著至關重要的作用。為了實現不同報表文檔格式的相互轉換,本文分析了Active Reports和StimulReports這兩種報表文檔的格式,給出了在兩者之間進行格式轉換的原理和實現代碼。利用本組件在.NET 平臺下進行系統(tǒng)開發(fā),可以增強報表系統(tǒng)的可移植性和可擴充性。
報表;格式轉換;組件
在基于數據庫的信息系統(tǒng)中,信息的輸出反映了整個應用系統(tǒng)的最終運行結果,報表作為一種重要的輸出載體,在現代企業(yè)的信息管理中無疑起著至關重要的作用[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)開發(fā)的[6-9]。報表設計人員使用設計器設計好報表模板,報表引擎根據報表模板和相關的數據生成最終文檔,最后,根據不同的需要,可以對最終文檔進行不同的輸出,如打印,保存,導出為其它通用文檔格式。
圖1 各種報表組件工作模式
不同的報表組件由于其報表引擎不同,使用的報表模板不一樣,所生成的最終文檔格式就不一樣。而同一個企業(yè)甚至同一個信息系統(tǒng),根據不同的需求和報表組件的不同功能,可能會選用兩種或更多的報表組件,因此有必要對不同的報表組件生成的最終文檔進行格式轉換。本文對兩種報表組件(Active Reports,StimulReports)所產生的最終文檔格式進行分析,并開發(fā)了一個雙向文檔格式轉換組件(如圖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 文檔格式示意圖
本雙向格式轉換組件由三個類組成: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方法,用于執(zhí)行轉換操作。
Convert 函數的實現思想并不復雜,它首先創(chuàng)建了一個 Active Reports 的 Document 對象;然后遍歷 StiReports 文檔的每一頁,創(chuàng)建一個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 方法,用于執(zhí)行轉換操作。
Convert方法的實現思想與StiDocument2ARDocument 類 的 Convert 方法基本相似,但由于 ActiveReports 文檔不是完全的 DOM,所以代碼的實現上會有所不同。它首先創(chuàng)建了一個StiReports 對象;然后遍歷 Active Reports 文檔的每一頁,創(chuàng)建一個 StiPage 對象;然后通過當前Active Reports頁(Page)的 CanvasItems 集合,遍歷每一個繪圖項目(CanvasItem),由于 CanvasItem 并非一個完整的頁面元素(文本、圖片等)。它有可能只是屬性設置指令,如設置當前的前景色(ForeColr),背景色(BackColor),字體(SelectFont),等等;也有可能是繪圖指令,如輸出文字(TextOut),填充矩形(FillRect),繪制JPEG圖片(JPEGImage)等等。對于屬性設置指令,只能先暫存在環(huán)境變量中,以備遇到繪圖指令,生成對應的 StiComponent 對象時使用:
Convert 方法的基本代碼如下:
在 Convert 方法中,轉換繪圖指令為相應的組件(StiComponent),將當前環(huán)境變量中的相關值作為組件的屬性,然后添加到轉換后頁面。這些工作是由AddTextControl、AddPictureControl、AddRoundRectControl、AddFillRectControl等函數來實現的。以下僅列出 AddTextControl 函數代碼:
轉換組件的調用相當方便。一般流程是,根據需要,先創(chuàng)建合適的轉換組件對象,然后加載待轉換的源文件,調用Convert方法,執(zhí)行轉換即可。以下代碼演示了將 StimulReports 文檔轉換為Active Reports 文檔。
反向轉換的代碼類似,鑒于篇幅限制,在此不再提供。
本組件采用 Visual Studio 2008, C# 語言開發(fā),StimulReports版本為 2008.2.300.0, Active Reports 版本為 5.2.1013.2, 已穩(wěn)定應用于多個管理信息系統(tǒng)。本組件雖然只實現了 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] 宋曉宇,劉蔚然,王永會.自定義報表系統(tǒng)的組件化開發(fā)[J]. 計算機與數字工程, 2008, 36(6): 82-84.
[9] 李興勇, 袁兆山, 江正海. 復雜報表生成系統(tǒng)實現技術研究[J]. 計算機應用, 2006, 27(7): 1821-1824.
[10] 王海鳳, 薩智海. DOM技術在數據轉換中的應用[J]. 內蒙古工業(yè)大學學報, 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).