BIRT:基於 Eclipse 的報表

來源:互聯網
上載者:User

層級: 初級

鍵 胡 (jianhgreat@hotmail.com), 西安交通大學碩士

2006 年 3 月 22 日

幾乎在各種應用中,報表都具有其不可替代的作用。各類報表軟體也是爭奇鬥豔,如今Eclipse也推出了自己的報表架構:BIRT。現在,讓我們不妨看看它到底提供了什麼樣的功能,以及特點是什麼。

安裝介紹

對於擴充 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. 選擇預覽,就可以看到報表啟動並執行實際結果了。或在報表上點擊滑鼠右鍵,選擇:"報表 -> 運行報表"。

非常簡單,一個顯示所有使用者資訊的報表就完成了。在此基礎之上,讓我們再來完成一些其它具有挑戰性的任務:

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_itemwhere 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, userwhere item.itemid= user_item.itemid  and user.userid= user_item.useridgroup 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的前景表示樂觀。

參考資料

  • BIRT官方網站 http://www.eclipse.org/birt/phoenix/

  • BIRT and POJOs as datasources example http://tools.osmosis.gr/blog/archives/2005/06/birt_and_object.html
  • Using Eclipse BIRT Report Libraries and Templates http://www.theserverside.com/articles/article.tss?l=EclipseBRT

關於作者

 

胡鍵,西安交通大學碩士,2000 年畢業後一直從事軟體開發。2002 年開始使用 Java,在平時的項目開發中經常採用 OpenSource 的工具,如 Ant、Maven、Hibernate、Struts 等,目前正在研究資訊整合方面的規範和技術。可以通過jianhgreat@hotmail.com與他取得聯絡,或訪問個人 blog:http://blog.donews.com/foxgem/。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.