怎樣用iReport制作Web報(bào)表 轉(zhuǎn)
用iReport開發(fā)Web報(bào)表功能強(qiáng)大,容易上手使用。由于iReport支持JasperReport,它是純Java程序,所以用于Web的最佳引擎是JSP,首選Tomcat。報(bào)表開發(fā)平臺使用Windows平臺即可。iReport早期在Windows系統(tǒng)上安裝只要直接解壓即可,而目前最新的版本是1.3.1,可在其官方網(wǎng)站下載http://ireport.sf.net/,支持安裝程序。
安裝時(shí)需要預(yù)先安裝java jre,可打開DOS窗口輸入java-version看使用的是哪個(gè)版本的jre。實(shí)用中,安裝Oracle10g客戶端自帶的Java 1.4.2最適合當(dāng)前的iReport版本,使用Jbuilder2006自帶的Java 1.5.0在打開某些交叉報(bào)表時(shí)可能出現(xiàn)死機(jī)現(xiàn)象,建議在Windows系統(tǒng)上安裝Java1.4,它支持最新iReport。
iReport開發(fā)文檔是收費(fèi)的,雖然網(wǎng)上可找到較多例子供參考,還有完整的簡單報(bào)表開發(fā)指南,稍加研究即可開發(fā)簡單報(bào)表。但如果要開發(fā)中小企業(yè)級各類Web報(bào)表,就需要深入研究,反復(fù)測試了。
在報(bào)表中顯示中文
iReport內(nèi)部使用Unicode UTF-8編碼,設(shè)置正確就可支持所有中文報(bào)表需求。界面選項(xiàng)支持簡體中文。為了在報(bào)表中顯示中文,在報(bào)表字體或較新版本的Style,選擇宋體字體。為了正確顯示中文,必須安裝亞洲語言包,可以從網(wǎng)上下載iTextAsian.jar考入開發(fā)機(jī)iReport安裝目錄/lib之下和服務(wù)器端WEB-INF/lib目錄下。還必須將服務(wù)器端的Java漢化,Java1.4比較麻煩,除拷貝宋體字庫外,還要修改幾個(gè)屬性文件。Java1.5漢化非常簡單,只要在jre/lib/fonts下建立fallback目錄,將宋體字庫考入該目錄即可。為了以PDF格式輸出中文,需要在“PDF Font Name”選項(xiàng)中選擇“STSong-Light”,在中文字體定義中勾選“Default”、“PDF Embedded”,“PDF Encoding”選擇“UniGB-UCS2-H (Chinese Simplified)”。
在報(bào)表中插入圖形
適當(dāng)?shù)牟鍒D在報(bào)表中起到畫龍點(diǎn)睛作用,可以使枯燥冗長的數(shù)據(jù)趨勢、比例等一目了然。iReport內(nèi)置基于jfreechart的Chart Tool工具可以方便繪制常用的柱狀圖、餅圖、曲線圖等,可滿足一般報(bào)表的需求。
如果需要插入靜態(tài)圖片,則要用image工具,要在圖片的“Image Expression”中寫圖片文件的絕對路徑。為了便于在PC上調(diào)試并可用于服務(wù)器,文件路徑應(yīng)寫成“$P{imagePath}+文件名”的形式,參數(shù)$P{imagePath}在PC上設(shè)為PC機(jī)上的DOS路徑,注意因?yàn)?#8220;\”是轉(zhuǎn)義符號,DOS路徑的“\”要寫成“\\”。在Web輸出圖片時(shí)將服務(wù)器上的文件路徑作為參數(shù)$P{imagePath}傳遞給輸出程序,就可輸出正確圖片。在以下設(shè)定子報(bào)表絕對路徑等場合,為了增加靈活性,都需要這樣做。
iReport內(nèi)置的Chart工具并沒有支持jfreechart的全部功能,繪圖存在局限性,例如,1.2.7之后的版本才實(shí)現(xiàn)標(biāo)記label的旋轉(zhuǎn),旋轉(zhuǎn)90度可使標(biāo)記字符垂直顯示,以免水平項(xiàng)目過多時(shí)標(biāo)記顯示重疊在一起而顯示不出來。又如圖片中的category各個(gè)項(xiàng)目只能是查詢結(jié)果集各個(gè)記錄垂直方向的項(xiàng)目,如果要顯示同一記錄中水平方向各個(gè)項(xiàng)目就無法繪圖。另外,至今最新版本餅圖還不能顯示百分比。為了顯示更為靈活的圖片,應(yīng)該使用第三方繪圖工具。自行開發(fā)jfteechart繪圖程序可解決這些問題。jfreeChart也是純Java工具,一般設(shè)計(jì)Servlet用于繪圖,使用image工具,在“Image Expression”中用URL表示對繪圖程序Servlet的調(diào)用,new java.net.URL(URL?參數(shù)),其中URL繪圖Servlet的調(diào)用路徑,問號后用于傳遞各種繪圖參數(shù)。其中為了正確傳遞中文參數(shù),中文字符串應(yīng)該使用標(biāo)準(zhǔn)的URL編碼,即定義一個(gè)變量值為java.net.URLEncoder.encode("中文字符串","GB2312"),在image的URL中使用變量名傳遞中文。
對數(shù)據(jù)源的支持
iReport報(bào)表引擎需要從數(shù)據(jù)源獲取報(bào)表中的數(shù)據(jù)。而最基本的查詢數(shù)據(jù)源的方法就是SQL查詢語句,一個(gè)報(bào)表只支持一個(gè)查詢結(jié)果集,設(shè)計(jì)一個(gè)報(bào)表的核心內(nèi)容就是設(shè)計(jì)SQL語句。如果一個(gè)報(bào)表在不同條件使用完全不同的數(shù)據(jù)庫表查詢語句,一般在報(bào)表程序中形成SQL語句,并查詢得到結(jié)果集,再將所得結(jié)果集傳遞給報(bào)表引擎形成報(bào)表。這樣雖然很靈活,但使報(bào)表程序冗長復(fù)雜,不便維護(hù)。最好是將SQL寫在報(bào)表數(shù)據(jù)源內(nèi),運(yùn)行時(shí)將數(shù)據(jù)庫連接和其他必要參數(shù)傳遞給報(bào)表引擎,由報(bào)表引擎執(zhí)行SQL語句并生成報(bào)表。
由于報(bào)表只支持單一結(jié)果集,對較為復(fù)雜的報(bào)表,SQL語句的設(shè)計(jì)就需要較高技巧。簡單的參數(shù)如數(shù)字可直接傳遞,在報(bào)表的SQL語句中用參數(shù)表示,如查詢條件where x=$P{y},實(shí)際使用時(shí)程序中直接將參數(shù)值如“10”傳遞給報(bào)表引擎,執(zhí)行時(shí)就可以當(dāng)做where x=10執(zhí)行。較為復(fù)雜的參數(shù)可用$P!{param},可用于替代SQL語句的任何部分,如在不同條件下使用不同的字段排序,可在報(bào)表SQL中寫order by $P!{y},實(shí)際使用報(bào)表時(shí)可將實(shí)際的值如“a,b”或“b desc”傳遞給報(bào)表引擎,實(shí)際執(zhí)行時(shí)就當(dāng)做“order by a,b”或“order by b desc”排序子句執(zhí)行,參數(shù)使用是SQL語句靈活支持多種需要的最重要手段。
絕大部分參數(shù)是字符串格式,偶然需要日期格式的參數(shù),iReport中設(shè)缺省值比較復(fù)雜,如“2007年2月28日”要寫成“(new SimpleDateFormat("yyyy-MM-dd")).parse("2003-01-01")”,要使用Java函數(shù)形式,實(shí)際上iReport中所有設(shè)定表達(dá)式都要顯式使用Java函數(shù)。
對于涉及多個(gè)表查詢的情況,需要使用聯(lián)合查詢語句join和union,join用語橫向聯(lián)結(jié)多個(gè)表,而union用于縱向合并相同結(jié)構(gòu)表的結(jié)果集。可以使用子查詢技術(shù),即將一個(gè)查詢語句當(dāng)做臨時(shí)表再進(jìn)行查詢,或與其他表聯(lián)合查詢。
通過以上各種技術(shù),在各種條件下,最終形成一個(gè)單一數(shù)據(jù)結(jié)果集,形成報(bào)表。對于報(bào)表各個(gè)記錄來自完全不同來源的情況,可考慮使用非SQL基本數(shù)據(jù)源,如可用“JavaBean Data Source”。定義一個(gè)基本類,聲明各個(gè)字段類型及getXXX()、setXXX()方法。測試報(bào)表時(shí),建一個(gè)數(shù)據(jù)類,用JRBeanCollectionDataSource(list)封裝,其中用list加入測試數(shù)據(jù)。將class打包考入iReport/lib目錄下,在iReport新建數(shù)據(jù)源,類型為JRDataSourceProvider,類名為剛才定義的類,就可用該類提供測試數(shù)據(jù)測試報(bào)表。打包時(shí)注意兩點(diǎn),編譯和打包使用的jar的Java版本要與安裝iReport時(shí)Java版本一致,特別在電腦上裝有多個(gè)版本的Java時(shí)。實(shí)際使用報(bào)表時(shí),也是使用list先動態(tài)填充數(shù)據(jù),fill報(bào)表時(shí)傳遞數(shù)據(jù)源為new JRBeanCollectionDataSource(list)即可生成動態(tài)報(bào)表。