Junky's IT Notebook

          統(tǒng)計(jì)

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評(píng)論排行榜

          BIRT:基于 Eclipse 的報(bào)表(轉(zhuǎn))

          胡鍵 , 西安交通大學(xué)碩士
          2006 年 3 月 22 日
          幾乎在各種應(yīng)用中,報(bào)表都具有其不可替代的作用。各類報(bào)表軟件也是爭(zhēng)奇斗艷,如今Eclipse也推出了自己的報(bào)表框架:BIRT。現(xiàn)在,讓我們不妨看看它到底提供了什么樣的功能,以及特點(diǎn)是什么。
          安裝介紹
          對(duì)于擴(kuò)展Eclipse的功能,首先當(dāng)然就是去下載對(duì)應(yīng)的plugin,BIRT也不能例外。BIRT的下載地址:http://download.eclipse.org/birt/downloads/,當(dāng)前版本是2.0。BIRT依賴于Eclipse的其它幾個(gè)plugin(GEF和EMF),由于我使用的是Eclipse WTP(這是Eclipse的WEB開發(fā)工具),在這個(gè)工具中那些plugin都已預(yù)裝,因此直接下載birt-report-framework-2_0_0.zip就好了。如果沒有這些plugin,請(qǐng)下載。
          下載之后,安裝非常簡(jiǎn)單:只需解壓然后將對(duì)應(yīng)的features和plugins目錄中的內(nèi)容復(fù)制到Eclipse對(duì)應(yīng)的目錄下即可。且慢,這只是完成了對(duì)于BIRT的基本安裝。下一步就是去下載BIRT需要的第三方軟件包:
          ? 需要的jar文件 復(fù)制位置(都在plugins目錄下)
          Apache Axis axis.jar
          axis-ant.jar
          commons-discovery-0.2.jar
          jaxrpc.jar
          saaj.jar
          wsdl4j-1.5.1.jar
          org.eclipse.birt.report.viewer_version/birt/WEB-INF/Lib
          iText 1.3 itext-1.3.jar org.eclipse.birt.report.engine.emitter.pdf_version/lib
          prototype.js v1.4.0 prototype.js v1.4.0 org.eclipse.birt.report.viewer_version/birt/ajax/lib
          自此,BIRT的安裝大功告成。啟動(dòng)Eclipse,在"project wizard"中會(huì)出現(xiàn)一個(gè)BIRT的項(xiàng)目類型。




          回頁(yè)首


          典型使用
          在使用之前,了解一些關(guān)于BIRT的基本概念,將會(huì)對(duì)使用非常有益:
          • 數(shù)據(jù)源:數(shù)據(jù)的來源,或提供者。如xml數(shù)據(jù)源、jdbc數(shù)據(jù)源等。
          • 數(shù)據(jù)集:數(shù)據(jù)集合,它必須與數(shù)據(jù)源關(guān)聯(lián),可以理解為查詢的結(jié)果。
          • 報(bào)表以及報(bào)表項(xiàng),報(bào)表可視為是針對(duì)一組數(shù)據(jù)集的表現(xiàn)形式,而報(bào)表項(xiàng)這是這個(gè)表現(xiàn)形式的某個(gè)具體的單元。它們之間的關(guān)系,與窗體和控件的關(guān)系非常類似。報(bào)表、數(shù)據(jù)集、數(shù)據(jù)源三者間的關(guān)系:數(shù)據(jù)源 --- 數(shù)據(jù)集 --- 報(bào)表。
          • 報(bào)表參數(shù):查詢參數(shù)的表現(xiàn)形式,使用它可以構(gòu)建更靈活的報(bào)表。
          • 模板和庫(kù):主要用于復(fù)用報(bào)表設(shè)計(jì),提高報(bào)表開發(fā)的效率。
          本文中的例子都采用jdbc數(shù)據(jù)源,這是最常見的使用情形,其中涉及的數(shù)據(jù)關(guān)系是一個(gè)典型的多對(duì)多關(guān)系:


          1. 簡(jiǎn)單報(bào)表
          首先,讓我們來看看一個(gè)"Hello World"級(jí)別的應(yīng)用:"列出所有用戶",以便可以快速的了解BIRT。為了完成這一任務(wù),我們需要:
          A. 通過項(xiàng)目向?qū)?,?chuàng)建BIRT工程。工程創(chuàng)建完畢之后,顯示BIRT的"報(bào)表設(shè)計(jì)"視圖。由于此時(shí)沒有報(bào)表,其它幾個(gè)視圖,如"數(shù)據(jù)資源管理器",不可用。


          B. 在項(xiàng)目上點(diǎn)鼠標(biāo)右鍵,選擇:"new -> 報(bào)表"。在報(bào)表類型中,選擇"空白報(bào)表"。
          C. 創(chuàng)建新報(bào)表后,數(shù)據(jù)視圖可用。在"數(shù)據(jù)資源管理器"中創(chuàng)建報(bào)表所需要的jdbc數(shù)據(jù)源。根據(jù)向?qū)В梢苑奖愕奶砑觠dbc驅(qū)動(dòng)、數(shù)據(jù)庫(kù)url、用戶名和密碼。
          D. 在指定的數(shù)據(jù)源上,創(chuàng)建數(shù)據(jù)集,這一步完成產(chǎn)生數(shù)據(jù)集的查詢。在BIRT中支持2種數(shù)據(jù)集:基于查詢語(yǔ)句和基于存儲(chǔ)過程。在本例中使用前者,對(duì)應(yīng)的查詢語(yǔ)句是:select user.userid, user.username, user.addr from user。
          E. 選擇剛剛創(chuàng)建的數(shù)據(jù)集,將它拖至空白報(bào)表頁(yè)上。BIRT會(huì)自動(dòng)為其創(chuàng)建一個(gè)報(bào)表項(xiàng),此處是"表"。如下圖:


          F. 選擇預(yù)覽,就可以看到報(bào)表運(yùn)行的實(shí)際結(jié)果了。或在報(bào)表上點(diǎn)擊鼠標(biāo)右鍵,選擇:"報(bào)表 -> 運(yùn)行報(bào)表"。
          非常簡(jiǎn)單,一個(gè)顯示所有用戶信息的報(bào)表就完成了。在此基礎(chǔ)之上,讓我們?cè)賮硗瓿梢恍┢渌哂刑魬?zhàn)性的任務(wù):
          1.格式化:這是一個(gè)內(nèi)容廣泛的主題,常見的需求:
          需求 解決辦法(以上為例)
          顯示報(bào)表列頭為中文 如:將userid顯示為"用戶標(biāo)識(shí)"。
          選擇"userid",輸入"用戶標(biāo)識(shí)"。
          設(shè)置報(bào)表外觀 選擇對(duì)應(yīng)的報(bào)表項(xiàng),通過"屬性編輯器"調(diào)整。
          對(duì)于報(bào)表數(shù)據(jù)列進(jìn)行處理 如:將userid和username,顯示成:userid:username。雙擊row["userid"],出現(xiàn)"表達(dá)式生成器",輸入: row["userid"]+":"+ row["username"]
          分頁(yè) 選擇"表":在"屬性編輯器"中,選擇"分頁(yè)符",在"分頁(yè)符間隔"中輸入分頁(yè)大小。
          頁(yè)眉和頁(yè)腳 在報(bào)表設(shè)計(jì)頁(yè),選擇"主頁(yè)",在其中設(shè)置頁(yè)眉和頁(yè)腳。
          2.排序:一種變通的做法是:將數(shù)據(jù)集排序之后,如在對(duì)應(yīng)的SQL語(yǔ)句中使用order by,再顯示。除此之外,也可以在報(bào)表設(shè)計(jì)時(shí)來完成:
          A. 選擇表,此時(shí)屬性編輯器下方會(huì)出現(xiàn)與表相關(guān)的選擇頁(yè)。


          B. 選擇"排序",在對(duì)應(yīng)的頁(yè)面中選擇"添加"按鈕之后,出現(xiàn):


          C. 選擇需要進(jìn)行排序的列,以及排序方式。
          3.計(jì)算列:通過"數(shù)據(jù)集編輯器"來完成。進(jìn)入"數(shù)據(jù)集編輯器后",選擇"計(jì)算列":輸入對(duì)應(yīng)的"列名稱"、"數(shù)據(jù)類型"和"表達(dá)式"。
          4.報(bào)表參數(shù):它為報(bào)表的產(chǎn)生帶來了極大的靈活性。報(bào)表參數(shù)一定是與含參數(shù)的查詢對(duì)應(yīng)的,否則失去了意義?,F(xiàn)在,將以上需求改為列出"用戶標(biāo)識(shí)大于某一輸入的所有用戶":
          A. 編輯數(shù)據(jù)集,修改SQL:select user.userid,user.username,user.addr from user where user.userid>?。
          B. 在數(shù)據(jù)集編輯窗體內(nèi)選擇"參數(shù)",然后輸入對(duì)應(yīng)的"名稱"、"數(shù)據(jù)類型"、"方向"和"默認(rèn)值"(必須給出默認(rèn)值)。其中"方向"表示"輸入"或"輸出"。對(duì)于參數(shù),一般選"輸入"。完畢之后:


          C. 在"數(shù)據(jù)資源管理器"視圖,創(chuàng)建報(bào)表參數(shù):"用戶標(biāo)識(shí)"。
          D. 選擇"表",在"屬性編輯器"中選擇"綁定"。此時(shí),會(huì)出現(xiàn)剛才在數(shù)據(jù)集中定義的參數(shù)"id"。在"值"列,選擇報(bào)表參數(shù)"用戶標(biāo)識(shí)":


          E. 運(yùn)行報(bào)表時(shí),此時(shí)會(huì)出現(xiàn)報(bào)表參數(shù)的輸入框,填寫值后即出現(xiàn)報(bào)表結(jié)果。
          本例雖然只定義了一個(gè)報(bào)表參數(shù),但是BIRT并沒有這樣的限制。我們可以創(chuàng)建多個(gè)參數(shù),做法很簡(jiǎn)單:首先,查詢有多個(gè)參數(shù);定義數(shù)據(jù)集的參數(shù)時(shí),按照查詢中參數(shù)出現(xiàn)的順序定義;最后,添加需要的報(bào)表參數(shù)。
          5.分組:以上為例:將用戶按地址分組。
          A. 選擇"表",點(diǎn)擊鼠標(biāo)右鍵,選擇"插入組"。這里有兩個(gè)選擇:"在上面"和"在下面"。
          B. 選擇任意一種,彈出分組資料窗體。填寫其中的:"名稱"和"分組依據(jù)"。在本例中,"分組依據(jù)"是addr列。
          C. 選擇預(yù)覽,或運(yùn)行報(bào)表,查看結(jié)果。
          2. 子報(bào)表
          子報(bào)表是另一種最常見的報(bào)表,以上為例:列出所有用戶,并列出每個(gè)用戶所購(gòu)買的項(xiàng)目,以及項(xiàng)目數(shù)。為了完成這種父子關(guān)系的報(bào)表,需要:
          A. 創(chuàng)建新報(bào)表和數(shù)據(jù)源。
          B. 創(chuàng)建數(shù)據(jù)集user,使用SQL:select user.userid,user.username,user.addr from user。
          C. 創(chuàng)建數(shù)據(jù)集items,使用SQL:

          select item.itemid,item.itemdesc,item.price,user_item.count from item,user_item where item.itemid= user_item.itemid and user_item.userid= ?
          												

          同時(shí)在數(shù)據(jù)集items上創(chuàng)建參數(shù)user,它對(duì)應(yīng)SQL中的參數(shù)。
          D. 從"Palette"視圖拖入"列表"到報(bào)表中,在"屬性編輯器"的"綁定"頁(yè)中,選擇數(shù)據(jù)集為user。它用來顯示主表的信息,在本例中是用戶信息。
          E. 從"Palette"視圖拖入"網(wǎng)格"到"列表"的"明細(xì)數(shù)據(jù)"中,設(shè)置網(wǎng)格為1行2列,它用來存放"用戶姓名"和"用戶地址"。在"數(shù)據(jù)資源管理器"視圖,選擇數(shù)據(jù)集user,將username和addr分別拖入網(wǎng)格的2列中。
          F. 在"數(shù)據(jù)資源管理器"視圖,選擇數(shù)據(jù)集items,將它拖入"列表"的"明細(xì)數(shù)據(jù)"中,位于剛剛插入的網(wǎng)格下方。此時(shí),BIRT會(huì)生成數(shù)據(jù)集items對(duì)應(yīng)的"表"。
          G. 選擇剛剛生成的"表",在"屬性編輯器"的"綁定"頁(yè)中,會(huì)出現(xiàn)在items中定義的參數(shù)。修改它的值:row["userid"]。于是,父子報(bào)表就發(fā)生了聯(lián)系。
          H. 選擇預(yù)覽,或運(yùn)行報(bào)表,就可以看到結(jié)果了。
          很遺憾,到目前為止,另一種最常見的報(bào)表"交叉表"還不被BIRT支持。但是,BIRT的官方網(wǎng)站已明確表示,將在未來的版本中支持它。
          3. 統(tǒng)計(jì)圖表
          俗話說,"一圖頂千言"。沒有圖的報(bào)表是枯燥,且缺乏表現(xiàn)力的。在本例中,我們將使用圖表來表示:每個(gè)用戶的消費(fèi)總數(shù)。
          A. 創(chuàng)建新報(bào)表和數(shù)據(jù)源。
          B. 創(chuàng)建數(shù)據(jù)集chart,使用SQL:

          select user.username,round(sum(item.price*user_item.count),2) from item, user_item, user where item.itemid= user_item.itemid and user.userid= user_item.userid group by user.username
          												

          C. 從"Palette"視圖拖入"圖表"到報(bào)表中,此時(shí)會(huì)彈出"編輯圖表"窗體。
          D. 在"選擇圖表類型"頁(yè),選擇圖表類型為"條形圖"。在"選擇數(shù)據(jù)"頁(yè),使用數(shù)據(jù)集chart,同時(shí)選中username列,將其拖入"類別x系列"。對(duì)于統(tǒng)計(jì)列,同樣將其拖入"類別y系列"。在"圖表格式"頁(yè),分別為x和y系列,填寫相應(yīng)的顯示名稱。
          E. 選擇預(yù)覽,或運(yùn)行報(bào)表,即可看到統(tǒng)計(jì)圖表。
          4. 使用腳本
          可以使用腳本,是BIRT的一大特色。在BIRT中,數(shù)據(jù)源、數(shù)據(jù)集和報(bào)表項(xiàng),都可以書寫腳本。具體做法:選擇數(shù)據(jù)源、數(shù)據(jù)集和報(bào)表項(xiàng)任意一種對(duì)象,然后選擇"腳本"頁(yè)面。如選擇數(shù)據(jù)源user后,對(duì)應(yīng)的腳本輸入頁(yè)面:


          選擇對(duì)應(yīng)的事件,然后在下方的腳本輸入框中輸入腳本即可。如對(duì)于第一個(gè)例子,我們需要統(tǒng)計(jì)用戶地址是"No.5 St."的用戶數(shù):
          A. 選擇數(shù)據(jù)集,然后選擇"腳本",進(jìn)入數(shù)據(jù)集的腳本編輯窗口。
          B. 選擇事件"afterOpen",在腳本窗口內(nèi)輸入:count=0;
          C. 選擇事件"onFetch",在腳本窗口內(nèi)輸入:if( row["addr"]== "No.5 St.") count++;
          D. 選擇報(bào)表,在腳本窗口選擇事件"onRender",輸入:this.caption=count;
          E. 預(yù)覽,或運(yùn)行報(bào)表后,會(huì)在報(bào)表的標(biāo)題輸出count的數(shù)值。
          另外,BIRT也支持使用java來作為報(bào)表項(xiàng)的事件處理程序。具體做法,請(qǐng)參見BIRT的幫助文檔。
          5. 庫(kù)和模板
          除了腳本使開發(fā)者可以自定義報(bào)表的行為外,BIRT還提供了庫(kù)和模板機(jī)制來重用設(shè)計(jì),加快報(bào)表的開發(fā)。在TheServerSide上有一篇相當(dāng)詳細(xì)的文檔:Using Eclipse BIRT Report Libraries and Templates。




          回頁(yè)首


          應(yīng)用集成
          BIRT與現(xiàn)有應(yīng)用的集成非常簡(jiǎn)單,由于BIRT主要是web應(yīng)用,本節(jié)以web應(yīng)用為例進(jìn)行說明。
          1. 從Eclipse BIRT官方網(wǎng)站下載birt-runtime-2_0_0.zip。
          2. 解壓之后,只需要其中的web view example目錄下的內(nèi)容。
          3. 復(fù)制以下第三方軟件包到web view example目錄:
          ? 需要的jar文件 復(fù)制位置
          Apache Axis axis.jar
          axis-ant.jar
          commons-discovery-0.2.jar
          jaxrpc.jar
          saaj.jar
          wsdl4j-1.5.1.jar
          WEB-INF/Lib
          iText 1.3 itext-1.3.jar Plugins/org.eclipse.birt.report.engine.emitter.pdf/lib
          prototype.js v1.4.0 prototype.js v1.4.0 ajax/lib
          4. 將web view example目錄發(fā)布到web容器中,如tomcat,改名:birtApp。
          5. 啟動(dòng)tomcat,并訪問birtApp。在首頁(yè)中選擇"View Example",如果成功發(fā)布,系統(tǒng)將提示成功。
          6. 發(fā)布設(shè)計(jì)完成的報(bào)表文件,在birtApp中創(chuàng)建reports目錄,用于存放報(bào)表設(shè)計(jì)文件。
          7. 在應(yīng)用中通過:http://localhost:8080/birtApp/frameset?__report=報(bào)表文件路徑,就可以訪問報(bào)表了。
          這個(gè)web應(yīng)用支持2個(gè)動(dòng)作:
          • frameset,以frameset的形式顯示報(bào)表。這個(gè)界面包含一些frame,如頁(yè)面導(dǎo)航,報(bào)表主體在其中的一個(gè)frame中顯示;使用形式:
            http://localhost:8080/birtApp/frameset?__report=報(bào)表文件路徑&參數(shù)=........
          • run,報(bào)表以一個(gè)單獨(dú)的html頁(yè)面或pdf顯示,由于這種形式?jīng)]有frmaeset,因此使用者必須自己提供相應(yīng)的參數(shù),如報(bào)表參數(shù),頁(yè)號(hào)等。使用形式:
            http://localhost:8080/birtApp/run?__report=報(bào)表文件路徑&參數(shù)=........
          對(duì)于以上2個(gè)動(dòng)作,以下列出可用的參數(shù):
          選項(xiàng) 說明
          __format 報(bào)表輸出格式:html或pdf,缺省是html。對(duì)于frameset不起作用。
          __isnull 指明一個(gè)參數(shù)是null,常用于字符串類型。如果提供參數(shù)且值為空: - 對(duì)于日期和數(shù)字類型,BIRT會(huì)將它們當(dāng)作null處理。 - 對(duì)于字符串,BIRT會(huì)將它作為空字符串。因此,為了說明某個(gè)字符串是null,通常寫為:__isnull=參數(shù)。
          __locale 本地化選項(xiàng),缺省是jvm的locale。
          __report 報(bào)表設(shè)計(jì)文件路徑。
          報(bào)表參數(shù) 報(bào)表參數(shù)參數(shù)值對(duì),形式:參數(shù)名=參數(shù)值。對(duì)于frameset,直接在地址欄中輸入?yún)?shù)名=參數(shù)值后回車,不會(huì)影響報(bào)表結(jié)果。雖然,此時(shí)選擇"運(yùn)行報(bào)表"時(shí),彈出的參數(shù)值已經(jīng)改變。
          雖然本節(jié)所說的是針對(duì)web應(yīng)用的集成,但是這種方法同樣也可與非web應(yīng)用集成。此時(shí),我們可以采取一種變通的方法:在非web應(yīng)用中使用內(nèi)嵌的web容器,如jetty,也可達(dá)到同樣的效果。這種做法和Eclipse的做法類似。還記得在報(bào)表設(shè)計(jì)時(shí)使用"報(bào)表 -> 運(yùn)行報(bào)表"嗎?那個(gè)彈出的窗體,實(shí)際就是一個(gè)web頁(yè)面。




          回頁(yè)首


          結(jié)論
          與一些老牌報(bào)表軟件相比,BIRT可能仍顯稚嫩。然而,它也不乏其獨(dú)到之處,如腳本控制、庫(kù)和模板。加之有世界領(lǐng)先的報(bào)表廠商Actuate支持,實(shí)際上BIRT的ROM(Report Object Model)就是Actuate捐獻(xiàn)的,我們有充分的理由對(duì)BIRT的前景表示樂觀。




          回頁(yè)首


          參考資料




          回頁(yè)首


          關(guān)于作者
          胡鍵,西安交通大學(xué)碩士,2000年畢業(yè)后一直從事軟件開發(fā)。2002年開始使用Java,在平時(shí)的項(xiàng)目開發(fā)中經(jīng)常采用OpenSource的工具,如Ant、Maven、Hibernate、Struts等,目前正在研究信息集成方面的規(guī)范和技術(shù)??梢酝ㄟ^jianhgreat@hotmail.com與他取得聯(lián)系,或訪問個(gè)人blog:http://blog.donews.com/foxgem/

          posted on 2007-01-03 23:44 junky 閱讀(646) 評(píng)論(1)  編輯  收藏 所屬分類: report

          評(píng)論

          # re: BIRT:基于 Eclipse 的報(bào)表(轉(zhuǎn)) 2007-01-04 14:14 BeanSoft

          呵呵, 西安交通大學(xué)碩士~~~  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 广西| 滕州市| 赤壁市| 蕉岭县| 固镇县| 咸丰县| 都江堰市| 安康市| 德格县| 英山县| 全椒县| 长白| 清涧县| 济宁市| 大埔区| 长宁县| 容城县| 合江县| 宣化县| 岑溪市| 乐都县| 射阳县| 兴安县| 兴隆县| 法库县| 泰安市| 利川市| 广元市| 汉源县| 淳化县| 西畴县| 雷山县| 宁明县| 宁陕县| 西昌市| 台山市| 磐石市| 温宿县| 水富县| 新密市| 平凉市|