999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2010-09-15 03:38:58袁冠遠(yuǎn)袁衛(wèi)華袁姝郭維琪
關(guān)鍵詞:頁(yè)面

袁冠遠(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).

猜你喜歡
頁(yè)面
微信群聊總是找不到,打開這個(gè)開關(guān)就好了
大狗熊在睡覺
刷新生活的頁(yè)面
在本機(jī)中輕松完成常見PDF操作
電腦愛好者(2022年3期)2022-05-30 10:48:04
移動(dòng)頁(yè)面設(shè)計(jì):為老人做設(shè)計(jì)
Web安全問答(3)
同一Word文檔 縱橫頁(yè)面并存
網(wǎng)站結(jié)構(gòu)在SEO中的研究與應(yīng)用
幾種頁(yè)面置換算法的基本原理及實(shí)現(xiàn)方法
淺析ASP.NET頁(yè)面導(dǎo)航技術(shù)
主站蜘蛛池模板: 久草视频精品| 久久久91人妻无码精品蜜桃HD| 中文国产成人精品久久一| 亚欧成人无码AV在线播放| 国产福利在线免费观看| 91破解版在线亚洲| 日韩精品亚洲精品第一页| 日韩毛片在线视频| 国产女人在线| 亚洲色精品国产一区二区三区| 免费无码AV片在线观看国产| 久久免费视频6| 欧美亚洲一二三区| 青草娱乐极品免费视频| 91成人免费观看| 国产一区二区福利| 亚洲乱码精品久久久久..| 成人福利免费在线观看| 91成人在线观看| 久久精品人妻中文系列| 国产交换配偶在线视频| 欧洲一区二区三区无码| 欧美成人综合在线| 91国内视频在线观看| 成人午夜网址| 亚洲男人天堂久久| 国产成年无码AⅤ片在线| 国产毛片片精品天天看视频| 人人澡人人爽欧美一区| 一区二区欧美日韩高清免费| 天天色天天综合| 精品福利国产| 91精品最新国内在线播放| 日韩精品一区二区三区视频免费看| 国产精品林美惠子在线观看| 国内自拍久第一页| 真人高潮娇喘嗯啊在线观看| 免费激情网址| 久视频免费精品6| 久久99热这里只有精品免费看| 日本免费高清一区| 一区二区三区四区日韩| 男女男免费视频网站国产| 久久久久国产精品嫩草影院| 亚洲自拍另类| 免费观看国产小粉嫩喷水| 国产尤物视频在线| 波多野结衣无码AV在线| 成年人国产网站| 国产亚洲第一页| 日本免费福利视频| 亚洲人成网站观看在线观看| 日韩精品毛片| 亚洲午夜片| 老熟妇喷水一区二区三区| 囯产av无码片毛片一级| 欧美怡红院视频一区二区三区| 草逼视频国产| 亚洲不卡影院| 欧美精品在线免费| 香蕉久久永久视频| 色网站免费在线观看| 无码网站免费观看| 中国精品自拍| 免费人成黄页在线观看国产| 中文字幕 欧美日韩| 国产白浆在线| 欧美三级不卡在线观看视频| 国产xx在线观看| 国产精品hd在线播放| 试看120秒男女啪啪免费| 东京热av无码电影一区二区| 男女男免费视频网站国产| 凹凸精品免费精品视频| 毛片免费在线视频| 欧美精品成人| 亚洲欧美日本国产综合在线| 欧美在线免费| 国产在线视频福利资源站| 啦啦啦网站在线观看a毛片| 亚洲色图综合在线| 日韩精品亚洲人旧成在线|