国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一個(gè)報(bào)表文檔雙向格式轉(zhuǎn)換組件

2010-09-15 03:38:58袁冠遠(yuǎn)袁衛(wèi)華袁姝郭維琪
關(guān)鍵詞:畫布繪圖報(bào)表

袁冠遠(yuǎn),袁衛(wèi)華,袁姝,郭維琪*

(1 廣州大學(xué) 華軟軟件學(xué)院,廣州 51000;2 武漢紡織大學(xué),武漢 430073;3 中國(guó)地質(zhì)大學(xué),武漢430074)

一個(gè)報(bào)表文檔雙向格式轉(zhuǎn)換組件

袁冠遠(yuǎn)1,袁衛(wèi)華2,袁姝3,郭維琪2*

(1 廣州大學(xué) 華軟軟件學(xué)院,廣州 51000;2 武漢紡織大學(xué),武漢 430073;3 中國(guó)地質(zhì)大學(xué),武漢430074)

在現(xiàn)代企業(yè)的信息管理中,報(bào)表作為一種重要的輸出載體,有著至關(guān)重要的作用。為了實(shí)現(xiàn)不同報(bào)表文檔格式的相互轉(zhuǎn)換,本文分析了Active Reports和StimulReports這兩種報(bào)表文檔的格式,給出了在兩者之間進(jìn)行格式轉(zhuǎn)換的原理和實(shí)現(xiàn)代碼。利用本組件在.NET 平臺(tái)下進(jìn)行系統(tǒng)開發(fā),可以增強(qiáng)報(bào)表系統(tǒng)的可移植性和可擴(kuò)充性。

報(bào)表;格式轉(zhuǎn)換;組件

在基于數(shù)據(jù)庫(kù)的信息系統(tǒng)中,信息的輸出反映了整個(gè)應(yīng)用系統(tǒng)的最終運(yùn)行結(jié)果,報(bào)表作為一種重要的輸出載體,在現(xiàn)代企業(yè)的信息管理中無(wú)疑起著至關(guān)重要的作用[1,2]。在微軟的 .Net 平臺(tái)下,可選的報(bào)表組件很多,老牌的有 Crystal Report、Active Reports,.Net 平臺(tái)下的新秀有 SQL Server Reporting Service、Stimul Reports、 Component One Reports、 Xtra Reports[3,4]。不同的報(bào)表組件所生成的最終文檔格式不一樣,對(duì)這些文檔格式進(jìn)行相互轉(zhuǎn)換,其意義不亞于在微軟的Word文檔與金山的WPS文檔之間進(jìn)行格式轉(zhuǎn)換[5]。

1 原理

當(dāng)前,各種報(bào)表組件都是按照模板-引擎-文檔的模式(如圖1)開發(fā)的[6-9]。報(bào)表設(shè)計(jì)人員使用設(shè)計(jì)器設(shè)計(jì)好報(bào)表模板,報(bào)表引擎根據(jù)報(bào)表模板和相關(guān)的數(shù)據(jù)生成最終文檔,最后,根據(jù)不同的需要,可以對(duì)最終文檔進(jìn)行不同的輸出,如打印,保存,導(dǎo)出為其它通用文檔格式。

圖1 各種報(bào)表組件工作模式

不同的報(bào)表組件由于其報(bào)表引擎不同,使用的報(bào)表模板不一樣,所生成的最終文檔格式就不一樣。而同一個(gè)企業(yè)甚至同一個(gè)信息系統(tǒng),根據(jù)不同的需求和報(bào)表組件的不同功能,可能會(huì)選用兩種或更多的報(bào)表組件,因此有必要對(duì)不同的報(bào)表組件生成的最終文檔進(jìn)行格式轉(zhuǎn)換。本文對(duì)兩種報(bào)表組件(Active Reports,StimulReports)所產(chǎn)生的最終文檔格式進(jìn)行分析,并開發(fā)了一個(gè)雙向文檔格式轉(zhuǎn)換組件(如圖2)。

圖2 雙向格式轉(zhuǎn)換組件示意圖

2 文檔格式分析

2.1 StimulReports 文檔格式:

StimulReports 產(chǎn)生的最終文檔,具有良好的文檔對(duì)象模型(Document Object Model, DOM)[10], 它包含文檔-頁(yè)面-組件這樣一個(gè)層次結(jié)構(gòu)。它的頂層對(duì)象是文檔(StiReports), 一個(gè)文檔包含所有生成的頁(yè)面(RenderedPages), 每個(gè)頁(yè)面(StiPage)則包含所有組成頁(yè)面的組件(Components),每個(gè)組件(StiComponent)表示一個(gè)頁(yè)面元素。有多種類型的組件,如文字(StiText)、圖片(StiImage)、條碼(StiBarCode)等(如圖3)。

圖3 StimulReports 文檔結(jié)構(gòu)示意圖

2.2 ActiveReports 文檔格式

ActiveReports 產(chǎn)生的文檔,不是嚴(yán)格的DOM,而是DOM + 畫布(Canvas)模型。它的頂層對(duì)象是文檔(Document), 一個(gè)文檔包含所有生成的頁(yè)面(Pages), 每個(gè)頁(yè)面(Page)則是一個(gè)畫布。畫布提供了一個(gè)比較靈活的繪圖場(chǎng)所[11]。它提供了一系列的屬性(Property)來(lái)設(shè)置當(dāng)前的用于繪圖的特點(diǎn),如ForeColor用于設(shè)置當(dāng)前的前景色,F(xiàn)ont 用于設(shè)置當(dāng)前的字體,等等;也提供了一系列的方法(Method)用于在畫布上繪圖,如DrawText 用于繪制文字,DrawImage 用于繪制圖片,等等。當(dāng)然,它也提供了一個(gè)很重要的屬性:CanvasItems,用于獲取當(dāng)前畫布中所有的繪制項(xiàng)目(CanvasItem)(如圖4)。

圖4 ActiveReports 文檔格式示意圖

3 雙向文檔格式轉(zhuǎn)換組件實(shí)現(xiàn)

本雙向格式轉(zhuǎn)換組件由三個(gè)類組成:PageBuilder 類用于輔助構(gòu)造Active Reports 頁(yè)面;StiDocument2ARDocument 類用于將 StiReports 報(bào)表文檔格式轉(zhuǎn)換為 Active Reports 報(bào)表文檔格式;ARDocument2StiDocument 類用于將 Active Reports報(bào)表文檔格式轉(zhuǎn)換為 StiReports 報(bào)表文檔格式。

3.1 PageBuilder 類

鑒于 Active Reports 文檔并非完全 DOM ,為了方便地生成其文檔,而不是每次都采用畫布模型繪圖,這里特封裝了 PageBuilder 類,用于構(gòu)造頁(yè)面。這個(gè)類主要重載[12]了幾個(gè) Add 方法,用于添加各種 Active Reports 模板對(duì)象(注意,雖然Active Reports生成的最終文檔不是完全DOM,但其報(bào)表模板是完全DOM。這里Add方法內(nèi)部將傳入的模板對(duì)象轉(zhuǎn)換為畫布中的屬性以及繪圖指令)。這里Add方法內(nèi)部將傳入的模板對(duì)象轉(zhuǎn)換為畫布中的屬性以及繪圖指令),如:

在以上源代碼中, page 是 PageBuilder 類的成員變量,是一個(gè) Page 類的對(duì)象,表示當(dāng)前的頁(yè)面。由此代碼也可以看出 Page 的Canvas 模式:先設(shè)置一系列的屬性值如 ForeColor, PenStyle, PenWidth, 再調(diào)用 DrawLine 方法來(lái)繪制線條。其它的 Add 重載函數(shù)代碼基本上也是這個(gè)思路。

使用 Add 方法構(gòu)造完頁(yè)面之后,可以使用PageBuilder 類的 Page 屬性獲取生成的頁(yè)面。

3.2 StiDocument2ARDocument 類

有了 PageBuilder 類之后,可以著手實(shí)現(xiàn)StiDocument2ARDocument 類了。

StiDocument2ARDocument 類提供了 Sti Document 屬性,用于設(shè)置待轉(zhuǎn)換的 StiReports 文檔對(duì)象; ARDocument 屬性,用于獲取轉(zhuǎn)換之后的Active Reports 文檔對(duì)象。同時(shí),它封裝了 Convert方法,用于執(zhí)行轉(zhuǎn)換操作。

Convert 函數(shù)的實(shí)現(xiàn)思想并不復(fù)雜,它首先創(chuàng)建了一個(gè) Active Reports 的 Document 對(duì)象;然后遍歷 StiReports 文檔的每一頁(yè),創(chuàng)建一個(gè)PageBuilder 對(duì)象,用于構(gòu)建 Active Reports 的Page;然后遍歷當(dāng)前 StiPage 中的每一個(gè)組件(StiComponent),根據(jù)當(dāng)前組件的類型,調(diào)用AddComponent函數(shù)的不同重載版本,將其轉(zhuǎn)換為Active Reports 對(duì)應(yīng)的組件,并調(diào)用 PageBuilder 的Add 方法,添加到當(dāng)前的頁(yè)面。

Convert 方法的基本代碼如下:

對(duì)于不同類型的 StiComponent ,需要實(shí)現(xiàn)不同的AddComponent 重載版本。 雖然從StiComponent 繼承以及間接繼承的派生類非常多,但是相當(dāng)一部分只是作為報(bào)表模板組件存在,在生成的最終文檔里,只包括有限幾種類型的組件。這些類型以及轉(zhuǎn)換后對(duì)應(yīng)ActiveReports 組件見表1。

表1 StiReports 組件與 Active Reports 組件對(duì)照表

因此我們只需要為這幾種類型的組件編寫AddComponent 重載函數(shù)即可。這里僅列出添加文本框組件的代碼,其它組件的代碼結(jié)構(gòu)基本相同:

3.3 ARDocument2StiDocument 類

ARDocument2StiDocument 類用于Active Reports 文檔到 StiReports 文檔的轉(zhuǎn)換。類似地,ARDocument2StiDocument 類提供了 ARDocument屬性,用于設(shè)置待轉(zhuǎn)換的 Active Reports 文檔對(duì)象;StiReports 屬性,用于獲取轉(zhuǎn)換之后的 StiReports文檔對(duì)象。Convert 方法,用于執(zhí)行轉(zhuǎn)換操作。

Convert方法的實(shí)現(xiàn)思想與StiDocument2ARDocument 類 的 Convert 方法基本相似,但由于 ActiveReports 文檔不是完全的 DOM,所以代碼的實(shí)現(xiàn)上會(huì)有所不同。它首先創(chuàng)建了一個(gè)StiReports 對(duì)象;然后遍歷 Active Reports 文檔的每一頁(yè),創(chuàng)建一個(gè) StiPage 對(duì)象;然后通過當(dāng)前Active Reports頁(yè)(Page)的 CanvasItems 集合,遍歷每一個(gè)繪圖項(xiàng)目(CanvasItem),由于 CanvasItem 并非一個(gè)完整的頁(yè)面元素(文本、圖片等)。它有可能只是屬性設(shè)置指令,如設(shè)置當(dāng)前的前景色(ForeColr),背景色(BackColor),字體(SelectFont),等等;也有可能是繪圖指令,如輸出文字(TextOut),填充矩形(FillRect),繪制JPEG圖片(JPEGImage)等等。對(duì)于屬性設(shè)置指令,只能先暫存在環(huán)境變量中,以備遇到繪圖指令,生成對(duì)應(yīng)的 StiComponent 對(duì)象時(shí)使用:

Convert 方法的基本代碼如下:

在 Convert 方法中,轉(zhuǎn)換繪圖指令為相應(yīng)的組件(StiComponent),將當(dāng)前環(huán)境變量中的相關(guān)值作為組件的屬性,然后添加到轉(zhuǎn)換后頁(yè)面。這些工作是由AddTextControl、AddPictureControl、AddRoundRectControl、AddFillRectControl等函數(shù)來(lái)實(shí)現(xiàn)的。以下僅列出 AddTextControl 函數(shù)代碼:

4 調(diào)用示例

轉(zhuǎn)換組件的調(diào)用相當(dāng)方便。一般流程是,根據(jù)需要,先創(chuàng)建合適的轉(zhuǎn)換組件對(duì)象,然后加載待轉(zhuǎn)換的源文件,調(diào)用Convert方法,執(zhí)行轉(zhuǎn)換即可。以下代碼演示了將 StimulReports 文檔轉(zhuǎn)換為Active Reports 文檔。

反向轉(zhuǎn)換的代碼類似,鑒于篇幅限制,在此不再提供。

5 結(jié)論

本組件采用 Visual Studio 2008, C# 語(yǔ)言開發(fā),StimulReports版本為 2008.2.300.0, Active Reports 版本為 5.2.1013.2, 已穩(wěn)定應(yīng)用于多個(gè)管理信息系統(tǒng)。本組件雖然只實(shí)現(xiàn)了 Active Reports 文檔與 StiReports 文檔的相互轉(zhuǎn)換,但它提供了一種思路,具有很強(qiáng)的通用性和實(shí)用性,可以輕松實(shí)現(xiàn)轉(zhuǎn)換其它報(bào)表組件生成的文檔。

[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] 項(xiàng) 伍,曹峰.文檔轉(zhuǎn)換工具的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(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] 宋曉宇,劉蔚然,王永會(huì).自定義報(bào)表系統(tǒng)的組件化開發(fā)[J]. 計(jì)算機(jī)與數(shù)字工程, 2008, 36(6): 82-84.

[9] 李興勇, 袁兆山, 江正海. 復(fù)雜報(bào)表生成系統(tǒng)實(shí)現(xiàn)技術(shù)研究[J]. 計(jì)算機(jī)應(yīng)用, 2006, 27(7): 1821-1824.

[10] 王海鳳, 薩智海. DOM技術(shù)在數(shù)據(jù)轉(zhuǎn)換中的應(yīng)用[J]. 內(nèi)蒙古工業(yè)大學(xué)學(xué)報(bào), 2002, 27(4): 270-274.

[11] 李濤. 基于Delphi 的精確定位套打設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(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-),男,高工,研究方向:機(jī)電一體化.

湖北省自然科學(xué)基金項(xiàng)目(2008CDZ058).

猜你喜歡
畫布繪圖報(bào)表
來(lái)自河流的你
“禾下乘涼圖”繪圖人
商業(yè)模式畫布
為什么要在畫布上割一刀?
讓鮮花在畫布上盛開
LabWindows/CVI中Excel報(bào)表技術(shù)研究
基于HTML5 Canvas繪圖技術(shù)應(yīng)用
從三大報(bào)表讀懂養(yǎng)豬人的成績(jī)單
Surfer和ArcView結(jié)合在氣象繪圖中的應(yīng)用
河北遙感(2015年2期)2015-07-18 11:11:14
大師的畫布
新余市| 枞阳县| 靖远县| 丰台区| 泽普县| 汝南县| 南丰县| 柞水县| 瑞金市| 彰武县| 巫溪县| 莫力| 安陆市| 彰化市| 巴彦淖尔市| 准格尔旗| 治县。| 文山县| 财经| 吐鲁番市| 丹东市| 香河县| 阿拉善右旗| 含山县| 唐河县| 常宁市| 德清县| 常州市| 呼伦贝尔市| 股票| 巩义市| 北京市| 凤凰县| 耿马| 普兰店市| 廉江市| 额济纳旗| 民权县| 绥宁县| 平顶山市| 长沙市|