<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Junky's IT Notebook

    統計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    BIRT:基于 Eclipse 的報表(轉)

    胡鍵 , 西安交通大學碩士
    2006 年 3 月 22 日
    幾乎在各種應用中,報表都具有其不可替代的作用。各類報表軟件也是爭奇斗艷,如今Eclipse也推出了自己的報表框架:BIRT?,F在,讓我們不妨看看它到底提供了什么樣的功能,以及特點是什么。
    安裝介紹
    對于擴展Eclipse的功能,首先當然就是去下載對應的plugin,BIRT也不能例外。BIRT的下載地址:http://download.eclipse.org/birt/downloads/,當前版本是2.0。BIRT依賴于Eclipse的其它幾個plugin(GEF和EMF),由于我使用的是Eclipse WTP(這是Eclipse的WEB開發工具),在這個工具中那些plugin都已預裝,因此直接下載birt-report-framework-2_0_0.zip就好了。如果沒有這些plugin,請下載。
    下載之后,安裝非常簡單:只需解壓然后將對應的features和plugins目錄中的內容復制到Eclipse對應的目錄下即可。且慢,這只是完成了對于BIRT的基本安裝。下一步就是去下載BIRT需要的第三方軟件包:
    ? 需要的jar文件 復制位置(都在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的安裝大功告成。啟動Eclipse,在"project wizard"中會出現一個BIRT的項目類型。




    回頁首


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


    1. 簡單報表
    首先,讓我們來看看一個"Hello World"級別的應用:"列出所有用戶",以便可以快速的了解BIRT。為了完成這一任務,我們需要:
    A. 通過項目向導,創建BIRT工程。工程創建完畢之后,顯示BIRT的"報表設計"視圖。由于此時沒有報表,其它幾個視圖,如"數據資源管理器",不可用。


    B. 在項目上點鼠標右鍵,選擇:"new -> 報表"。在報表類型中,選擇"空白報表"。
    C. 創建新報表后,數據視圖可用。在"數據資源管理器"中創建報表所需要的jdbc數據源。根據向導,可以方便的添加jdbc驅動、數據庫url、用戶名和密碼。
    D. 在指定的數據源上,創建數據集,這一步完成產生數據集的查詢。在BIRT中支持2種數據集:基于查詢語句和基于存儲過程。在本例中使用前者,對應的查詢語句是:select user.userid, user.username, user.addr from user。
    E. 選擇剛剛創建的數據集,將它拖至空白報表頁上。BIRT會自動為其創建一個報表項,此處是"表"。如下圖:


    F. 選擇預覽,就可以看到報表運行的實際結果了?;蛟趫蟊砩宵c擊鼠標右鍵,選擇:"報表 -> 運行報表"。
    非常簡單,一個顯示所有用戶信息的報表就完成了。在此基礎之上,讓我們再來完成一些其它具有挑戰性的任務:
    1.格式化:這是一個內容廣泛的主題,常見的需求:
    需求 解決辦法(以上為例)
    顯示報表列頭為中文 如:將userid顯示為"用戶標識"。
    選擇"userid",輸入"用戶標識"。
    設置報表外觀 選擇對應的報表項,通過"屬性編輯器"調整。
    對于報表數據列進行處理 如:將userid和username,顯示成:userid:username。雙擊row["userid"],出現"表達式生成器",輸入: row["userid"]+":"+ row["username"]
    分頁 選擇"表":在"屬性編輯器"中,選擇"分頁符",在"分頁符間隔"中輸入分頁大小。
    頁眉和頁腳 在報表設計頁,選擇"主頁",在其中設置頁眉和頁腳。
    2.排序:一種變通的做法是:將數據集排序之后,如在對應的SQL語句中使用order by,再顯示。除此之外,也可以在報表設計時來完成:
    A. 選擇表,此時屬性編輯器下方會出現與表相關的選擇頁。


    B. 選擇"排序",在對應的頁面中選擇"添加"按鈕之后,出現:


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


    C. 在"數據資源管理器"視圖,創建報表參數:"用戶標識"。
    D. 選擇"表",在"屬性編輯器"中選擇"綁定"。此時,會出現剛才在數據集中定義的參數"id"。在"值"列,選擇報表參數"用戶標識":


    E. 運行報表時,此時會出現報表參數的輸入框,填寫值后即出現報表結果。
    本例雖然只定義了一個報表參數,但是BIRT并沒有這樣的限制。我們可以創建多個參數,做法很簡單:首先,查詢有多個參數;定義數據集的參數時,按照查詢中參數出現的順序定義;最后,添加需要的報表參數。
    5.分組:以上為例:將用戶按地址分組。
    A. 選擇"表",點擊鼠標右鍵,選擇"插入組"。這里有兩個選擇:"在上面"和"在下面"。
    B. 選擇任意一種,彈出分組資料窗體。填寫其中的:"名稱"和"分組依據"。在本例中,"分組依據"是addr列。
    C. 選擇預覽,或運行報表,查看結果。
    2. 子報表
    子報表是另一種最常見的報表,以上為例:列出所有用戶,并列出每個用戶所購買的項目,以及項目數。為了完成這種父子關系的報表,需要:
    A. 創建新報表和數據源。
    B. 創建數據集user,使用SQL:select user.userid,user.username,user.addr from user。
    C. 創建數據集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= ?
    												

    同時在數據集items上創建參數user,它對應SQL中的參數。
    D. 從"Palette"視圖拖入"列表"到報表中,在"屬性編輯器"的"綁定"頁中,選擇數據集為user。它用來顯示主表的信息,在本例中是用戶信息。
    E. 從"Palette"視圖拖入"網格"到"列表"的"明細數據"中,設置網格為1行2列,它用來存放"用戶姓名"和"用戶地址"。在"數據資源管理器"視圖,選擇數據集user,將username和addr分別拖入網格的2列中。
    F. 在"數據資源管理器"視圖,選擇數據集items,將它拖入"列表"的"明細數據"中,位于剛剛插入的網格下方。此時,BIRT會生成數據集items對應的"表"。
    G. 選擇剛剛生成的"表",在"屬性編輯器"的"綁定"頁中,會出現在items中定義的參數。修改它的值:row["userid"]。于是,父子報表就發生了聯系。
    H. 選擇預覽,或運行報表,就可以看到結果了。
    很遺憾,到目前為止,另一種最常見的報表"交叉表"還不被BIRT支持。但是,BIRT的官方網站已明確表示,將在未來的版本中支持它。
    3. 統計圖表
    俗話說,"一圖頂千言"。沒有圖的報表是枯燥,且缺乏表現力的。在本例中,我們將使用圖表來表示:每個用戶的消費總數。
    A. 創建新報表和數據源。
    B. 創建數據集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"視圖拖入"圖表"到報表中,此時會彈出"編輯圖表"窗體。
    D. 在"選擇圖表類型"頁,選擇圖表類型為"條形圖"。在"選擇數據"頁,使用數據集chart,同時選中username列,將其拖入"類別x系列"。對于統計列,同樣將其拖入"類別y系列"。在"圖表格式"頁,分別為x和y系列,填寫相應的顯示名稱。
    E. 選擇預覽,或運行報表,即可看到統計圖表。
    4. 使用腳本
    可以使用腳本,是BIRT的一大特色。在BIRT中,數據源、數據集和報表項,都可以書寫腳本。具體做法:選擇數據源、數據集和報表項任意一種對象,然后選擇"腳本"頁面。如選擇數據源user后,對應的腳本輸入頁面:


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




    回頁首


    應用集成
    BIRT與現有應用的集成非常簡單,由于BIRT主要是web應用,本節以web應用為例進行說明。
    1. 從Eclipse BIRT官方網站下載birt-runtime-2_0_0.zip。
    2. 解壓之后,只需要其中的web view example目錄下的內容。
    3. 復制以下第三方軟件包到web view example目錄:
    ? 需要的jar文件 復制位置
    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目錄發布到web容器中,如tomcat,改名:birtApp。
    5. 啟動tomcat,并訪問birtApp。在首頁中選擇"View Example",如果成功發布,系統將提示成功。
    6. 發布設計完成的報表文件,在birtApp中創建reports目錄,用于存放報表設計文件。
    7. 在應用中通過:http://localhost:8080/birtApp/frameset?__report=報表文件路徑,就可以訪問報表了。
    這個web應用支持2個動作:
    • frameset,以frameset的形式顯示報表。這個界面包含一些frame,如頁面導航,報表主體在其中的一個frame中顯示;使用形式:
      http://localhost:8080/birtApp/frameset?__report=報表文件路徑&參數=........
    • run,報表以一個單獨的html頁面或pdf顯示,由于這種形式沒有frmaeset,因此使用者必須自己提供相應的參數,如報表參數,頁號等。使用形式:
      http://localhost:8080/birtApp/run?__report=報表文件路徑&參數=........
    對于以上2個動作,以下列出可用的參數:
    選項 說明
    __format 報表輸出格式:html或pdf,缺省是html。對于frameset不起作用。
    __isnull 指明一個參數是null,常用于字符串類型。如果提供參數且值為空: - 對于日期和數字類型,BIRT會將它們當作null處理。 - 對于字符串,BIRT會將它作為空字符串。因此,為了說明某個字符串是null,通常寫為:__isnull=參數。
    __locale 本地化選項,缺省是jvm的locale。
    __report 報表設計文件路徑。
    報表參數 報表參數參數值對,形式:參數名=參數值。對于frameset,直接在地址欄中輸入參數名=參數值后回車,不會影響報表結果。雖然,此時選擇"運行報表"時,彈出的參數值已經改變。
    雖然本節所說的是針對web應用的集成,但是這種方法同樣也可與非web應用集成。此時,我們可以采取一種變通的方法:在非web應用中使用內嵌的web容器,如jetty,也可達到同樣的效果。這種做法和Eclipse的做法類似。還記得在報表設計時使用"報表 -> 運行報表"嗎?那個彈出的窗體,實際就是一個web頁面。




    回頁首


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




    回頁首


    參考資料




    回頁首


    關于作者
    胡鍵,西安交通大學碩士,2000年畢業后一直從事軟件開發。2002年開始使用Java,在平時的項目開發中經常采用OpenSource的工具,如Ant、Maven、Hibernate、Struts等,目前正在研究信息集成方面的規范和技術。可以通過jianhgreat@hotmail.com與他取得聯系,或訪問個人blog:http://blog.donews.com/foxgem/。

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

    評論

    # re: BIRT:基于 Eclipse 的報表(轉) 2007-01-04 14:14 BeanSoft

    呵呵, 西安交通大學碩士~~~  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲日本乱码一区二区在线二产线| 亚洲熟女精品中文字幕| 美女隐私免费视频看| 91老湿机福利免费体验| 免费精品国产自产拍观看| 色拍自拍亚洲综合图区| 美女无遮挡免费视频网站| 在线永久看片免费的视频| 亚洲午夜福利717| 亚洲欧美在线x视频| 永久免费视频网站在线观看| 亚洲人成无码网站久久99热国产| 亚洲免费福利在线视频| 免费国产叼嘿视频大全网站| 亚洲国产精品第一区二区三区| 国产精品亚洲片夜色在线| 久久久久久久久久国产精品免费 | 亚洲国产日韩在线观频| 亚洲中文字幕无码爆乳| 四虎影视成人永久免费观看视频| 亚洲人成色7777在线观看不卡| 亚洲日韩精品无码专区加勒比☆| 2020因为爱你带字幕免费观看全集 | 俄罗斯极品美女毛片免费播放| 亚洲jjzzjjzz在线观看| 一个人免费日韩不卡视频| 在线观看国产区亚洲一区成人| 黄色一级毛片免费| 免费看片A级毛片免费看| 亚洲一级黄色大片| 最近2018中文字幕免费视频| 亚洲国产精品无码一线岛国| eeuss免费天堂影院| 亚洲AV无码乱码在线观看| 亚洲AV日韩综合一区| 成年轻人网站色免费看 | 亚洲综合欧美色五月俺也去| 黄色网址免费观看| 4444亚洲国产成人精品| 香港a毛片免费观看| 亚洲AV午夜成人影院老师机影院|