當(dāng)前位置:工程項目OA系統(tǒng) > 泛普各地 > 陜西OA系統(tǒng) > 西安OA系統(tǒng) > 西安OA快博
怎樣用iReport制作Web報表
用iReport開發(fā)Web報表功能強大,容易上手使用。由于iReport支持JasperReport,它是純Java程序,所以用于Web的最佳引擎是JSP,首選Tomcat。報表開發(fā)平臺使用Windows平臺即可。iReport早期在Windows系統(tǒng)上安裝只要直接解壓即可,而目前最新的版本是1.3.1,可在其官方網(wǎng)站下載http://ireport.sf.net/,支持安裝程序。
安裝時需要預(yù)先安裝java jre,可打開DOS窗口輸入java-version看使用的是哪個版本的jre。實用中,安裝Oracle10g客戶端自帶的Java 1.4.2最適合當(dāng)前的iReport版本,使用Jbuilder2006自帶的Java 1.5.0在打開某些交叉報表時可能出現(xiàn)死機現(xiàn)象,建議在Windows系統(tǒng)上安裝Java1.4,它支持最新iReport。
iReport開發(fā)文檔是收費的,雖然網(wǎng)上可找到較多例子供參考,還有完整的簡單報表開發(fā)指南,稍加研究即可開發(fā)簡單報表。但如果要開發(fā)中小企業(yè)級各類Web報表,就需要深入研究,反復(fù)測試了。
在報表中顯示中文
iReport內(nèi)部使用Unicode UTF-8編碼,設(shè)置正確就可支持所有中文報表需求。界面選項支持簡體中文。為了在報表中顯示中文,在報表字體或較新版本的Style,選擇宋體字體。為了正確顯示中文,必須安裝亞洲語言包,可以從網(wǎng)上下載iTextAsian.jar考入開發(fā)機iReport安裝目錄/lib之下和服務(wù)器端WEB-INF/lib目錄下。還必須將服務(wù)器端的Java漢化,Java1.4比較麻煩,除拷貝宋體字庫外,還要修改幾個屬性文件。Java1.5漢化非常簡單,只要在jre/lib/fonts下建立fallback目錄,將宋體字庫考入該目錄即可。為了以PDF格式輸出中文,需要在“PDF Font Name”選項中選擇“STSong-Light”,在中文字體定義中勾選“Default”、“PDF Embedded”,“PDF Encoding”選擇“UniGB-UCS2-H (Chinese Simplified)”。
在報表中插入圖形
適當(dāng)?shù)牟鍒D在報表中起到畫龍點睛作用,可以使枯燥冗長的數(shù)據(jù)趨勢、比例等一目了然。iReport內(nèi)置基于jfreechart的Chart Tool工具可以方便繪制常用的柱狀圖、餅圖、曲線圖等,可滿足一般報表的需求。
如果需要插入靜態(tài)圖片,則要用image工具,要在圖片的“Image Expression”中寫圖片文件的絕對路徑。為了便于在PC上調(diào)試并可用于服務(wù)器,文件路徑應(yīng)寫成“$P{imagePath}+文件名”的形式,參數(shù)$P{imagePath}在PC上設(shè)為PC機上的DOS路徑,注意因為“”是轉(zhuǎn)義符號,DOS路徑的“”要寫成“\”。在Web輸出圖片時將服務(wù)器上的文件路徑作為參數(shù)$P{imagePath}傳遞給輸出程序,就可輸出正確圖片。在以下設(shè)定子報表絕對路徑等場合,為了增加靈活性,都需要這樣做。
iReport內(nèi)置的Chart工具并沒有支持jfreechart的全部功能,繪圖存在局限性,例如,1.2.7之后的版本才實現(xiàn)標(biāo)記label的旋轉(zhuǎn),旋轉(zhuǎn)90度可使標(biāo)記字符垂直顯示,以免水平項目過多時標(biāo)記顯示重疊在一起而顯示不出來。又如圖片中的category各個項目只能是查詢結(jié)果集各個記錄垂直方向的項目,如果要顯示同一記錄中水平方向各個項目就無法繪圖。另外,至今最新版本餅圖還不能顯示百分比。為了顯示更為靈活的圖片,應(yīng)該使用第三方繪圖工具。自行開發(fā)jfteechart繪圖程序可解決這些問題。jfreeChart也是純Java工具,一般設(shè)計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編碼,即定義一個變量值為java.net.URLEncoder.encode("中文字符串","GB2312"),在image的URL中使用變量名傳遞中文。
對數(shù)據(jù)源的支持
iReport報表引擎需要從數(shù)據(jù)源獲取報表中的數(shù)據(jù)。而最基本的查詢數(shù)據(jù)源的方法就是SQL查詢語句,一個報表只支持一個查詢結(jié)果集,設(shè)計一個報表的核心內(nèi)容就是設(shè)計SQL語句。如果一個報表在不同條件使用完全不同的數(shù)據(jù)庫表查詢語句,一般在報表程序中形成SQL語句,并查詢得到結(jié)果集,再將所得結(jié)果集傳遞給報表引擎形成報表。這樣雖然很靈活,但使報表程序冗長復(fù)雜,不便維護。最好是將SQL寫在報表數(shù)據(jù)源內(nèi),運行時將數(shù)據(jù)庫連接和其他必要參數(shù)傳遞給報表引擎,由報表引擎執(zhí)行SQL語句并生成報表。
由于報表只支持單一結(jié)果集,對較為復(fù)雜的報表,SQL語句的設(shè)計就需要較高技巧。簡單的參數(shù)如數(shù)字可直接傳遞,在報表的SQL語句中用參數(shù)表示,如查詢條件where x=$P{y},實際使用時程序中直接將參數(shù)值如“10”傳遞給報表引擎,執(zhí)行時就可以當(dāng)做where x=10執(zhí)行。較為復(fù)雜的參數(shù)可用$P!{param},可用于替代SQL語句的任何部分,如在不同條件下使用不同的字段排序,可在報表SQL中寫order by $P!{y},實際使用報表時可將實際的值如“a,b”或“b desc”傳遞給報表引擎,實際執(zhí)行時就當(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ù)形式,實際上iReport中所有設(shè)定表達(dá)式都要顯式使用Java函數(shù)。
對于涉及多個表查詢的情況,需要使用聯(lián)合查詢語句join和union,join用語橫向聯(lián)結(jié)多個表,而union用于縱向合并相同結(jié)構(gòu)表的結(jié)果集??梢允褂米硬樵兗夹g(shù),即將一個查詢語句當(dāng)做臨時表再進行查詢,或與其他表聯(lián)合查詢。
通過以上各種技術(shù),在各種條件下,最終形成一個單一數(shù)據(jù)結(jié)果集,形成報表。對于報表各個記錄來自完全不同來源的情況,可考慮使用非SQL基本數(shù)據(jù)源,如可用“JavaBean Data Source”。定義一個基本類,聲明各個字段類型及getXXX()、setXXX()方法。測試報表時,建一個數(shù)據(jù)類,用JRBeanCollectionDataSource(list)封裝,其中用list加入測試數(shù)據(jù)。將class打包考入iReport/lib目錄下,在iReport新建數(shù)據(jù)源,類型為JRDataSourceProvider,類名為剛才定義的類,就可用該類提供測試數(shù)據(jù)測試報表。打包時注意兩點,編譯和打包使用的jar的Java版本要與安裝iReport時Java版本一致,特別在電腦上裝有多個版本的Java時。實際使用報表時,也是使用list先動態(tài)填充數(shù)據(jù),fill報表時傳遞數(shù)據(jù)源為new JRBeanCollectionDataSource(list)即可生成動態(tài)報表。
iReport還支持其他數(shù)據(jù)源,一般使用SQL數(shù)據(jù)源就足夠了。
實現(xiàn)交叉報表
較為復(fù)雜的報表需求是交叉報表和子報表。
交叉報表是國內(nèi)數(shù)據(jù)統(tǒng)計報表最常使用的形式之一。通常用于將在數(shù)據(jù)庫中記錄的數(shù)據(jù)字段按不同分類水平匯總顯示。有兩種實現(xiàn)方式:1.用交叉查詢形成交叉結(jié)果集,最終用簡單報表實現(xiàn);2.使用iReport的交叉報表直接實現(xiàn)。
并非所有數(shù)據(jù)庫都支持交叉查詢,Oracle10g中通過sum和decode函數(shù)可以實現(xiàn)交叉查詢,匯總使用函數(shù)sum(decode(key,KEY1,value,0)) as Field1、sum(decode(key,KEY2,value,0)) as Field2,等等,將具有(…key,value…)形式的簡單結(jié)果集匯總為有(…Feild1,Field2,…),其中Field1是按key值為KEY1匯總值, Field2按key值為KEY2匯總值,依次類推。iReport可將該交叉結(jié)果集當(dāng)做普通結(jié)果集處理形成交叉報表形式。
使用iReport的交叉報表工具,可以制作更為豐富的交叉報表,過程較復(fù)雜。要點是,在主報表的Detail欄目插入crosstable,需要編輯交叉報表屬性決定交叉報表內(nèi)容,交叉報表設(shè)計決定報表的外觀。
在主報表中定義SQL查詢語句,將結(jié)果集傳遞給交叉報表。這樣就只需要進行一次數(shù)據(jù)庫查詢操作,不過也只能支持一個交叉報表,且不能自動繪圖,因為交叉報表會將結(jié)果集的游標(biāo)指向尾部,這樣可滿足單一交叉報表需要。為實現(xiàn)上述要求,在交叉報表屬性中點選“use a dataset to fill the crosstable”,選擇并命名一個subdataset,并且在連接數(shù)據(jù)源表達(dá)式中輸入系統(tǒng)參數(shù)“$P{REPORT_DATA_SOURCE}”。定義行列分組和Measure。Measure就是交叉報表需要進行匯總的目標(biāo)字段。行列分組寫入分組需要依據(jù)的字段,類似交叉查詢匯總的key字段,可支持嵌套多重分組,適用多級樹型管理分別需要統(tǒng)計的情況。屬性設(shè)置完畢,就可以使用報表設(shè)計,可視化進行報表外觀設(shè)計,每個字段或匯總字段的長度、顏色、線條等,可以做出相當(dāng)專業(yè)的交叉報表。
實現(xiàn)子報表
子報表也常用于多級管理的情況,需要知道按最高級別部門的統(tǒng)計數(shù)據(jù),有時同時也需要查看高級別下屬的按較低級別部門的統(tǒng)計數(shù)據(jù)。與交叉報表不同的是,子報表是獨立的報表,子報表還可以嵌套子報表。在主報表的detail欄目中插入子報表,事先子報表應(yīng)作為獨立報表調(diào)試好。主報表通過修改子報表屬性建立聯(lián)系,傳遞數(shù)據(jù)。在subreport中連接數(shù)據(jù)源屬性中選擇“$P{REPORT_CONNECTION”。子報表通常多達(dá)3級以上,每級傳遞數(shù)據(jù)庫連接說明顯示每級報表都需要執(zhí)行各自的數(shù)據(jù)庫查詢,通常認(rèn)為這樣做是低效的。但如果采用數(shù)據(jù)結(jié)果集的話,一次子報表調(diào)用就將游標(biāo)移至底部,導(dǎo)致主報表只能顯示一行。如果使用數(shù)據(jù)庫連接做參數(shù),各報表進行各自查詢,則沒有這個問題,而且最后還可以使用自動繪圖。其次要指定子報表絕對路徑表達(dá)式,為方便調(diào)試和實際使用,也應(yīng)采用“$P{路徑參數(shù)}+文件名.jasper”的形式。子報表參數(shù)中填入字段名作為參數(shù),子報表將利用這些參數(shù)進行它的子查詢,當(dāng)然這些參數(shù)也要在子報表中有相應(yīng)定義。
最后子報表的顯示結(jié)果是,每顯示一行主報表數(shù)據(jù),就根據(jù)“顯示表達(dá)式”真假值決定是否顯示相應(yīng)的子報表數(shù)據(jù),如果含嵌套子報表,依次類推。最后在匯總欄可用主報表結(jié)果集自動繪制圖形。
顯示表達(dá)式
為了制作靈活顯示的報表,顯示表達(dá)式是必不可少的。例如,多級子報表到底顯示哪些級,同一個字段在不同的值范圍用不同的顏色字體顯示,這些都需要顯示表達(dá)式。iReport所有的項目都有顯示表達(dá)式“Print When Expression”,顯示表達(dá)式是個邏輯表達(dá)式,運行時計算出真假值,決定相應(yīng)項目是否被顯示出來。例如,常用的報表中某數(shù)字字段用黑色顯示,超過預(yù)定值用紅色顯示。需要在相同位置定義兩個相同的字段,分別顯示黑色和紅色,每個都設(shè)定顯示表達(dá)式,確定顯示的條件。實際運行時,可得到彩色報表,紅色值顯示超過預(yù)設(shè)范圍的值。
寫顯示表達(dá)式的要點是所有值要使用Java的類型,所有表達(dá)式內(nèi)的項目都要顯式使用Java函數(shù),否則容易得到編譯錯誤。要求這樣做的原因是iReport編譯選項中缺省使用“JasperReport Default”編譯報表,運算時使用JasperReport定義的數(shù)據(jù)類型,如使用Java編譯器情況可能不同,設(shè)置會更簡潔。
輸出例程
每張不同的報表最后利用iReport產(chǎn)生過程都是大同小異的。就是根據(jù)程序參數(shù)獲取數(shù)據(jù)源fill報表,并按程序的要求以各種形式輸出。所以,所有報表使用公共的報表輸出程序可以大大簡化和方便報表程序的設(shè)計。
輸出程序要點如下,必須使用Servlet,例如ExportReport為輸出報表Servlet的名字:
public class ExportReport extends HttpServlet {“key”,value}
缺省JSP報表程序調(diào)用ExportReport采用GET。不同報表調(diào)用公用報表輸出程序,需要將數(shù)據(jù)結(jié)果集和參數(shù)傳遞給ExportReport,GET方式調(diào)用參數(shù)傳遞只能使用會話對象,session.setAttribute(“key”,value),當(dāng)用戶在同一會話中打開多個報表或多次以不同參數(shù)打開同一報表時,參數(shù)就會相互覆蓋產(chǎn)生錯誤,尤其當(dāng)刷新報表時,參數(shù)改變會使用戶看到的報表不是想要的報表。
解決多用戶傳遞參數(shù)的辦法是使用請求對象傳遞參數(shù)request.setAttribute(“key”,value),則每個報表發(fā)出的請求互相沒有沖突,用戶每次刷新都可得到參數(shù)正確的報表。在調(diào)用時,不能使用response.sendRedirect(exportURL),這樣只能以GET調(diào)用,且無法傳遞request對象中的參數(shù)。
輸出HTML圖文報表
HTML格式輸出是Web程序最基本的要求。在輸出有圖片的報表時,使用PDF格式輸出是最好的,HTML很容易出現(xiàn)各種圖片顯示問題。根據(jù)網(wǎng)上資料,在早期iReport0.5以前版本HTML輸出圖片沒有問題,從iReport1.1.0到最新的iReport1.3.0,首先必須在報表輸出Servlet中設(shè)置參數(shù)exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR,Boolean.TRUE),還必須設(shè)置“IMAGES_DIR_NAME”、“IMAGES_URI”參數(shù),輸出報表時才能在上述參數(shù)指定的目錄下生成臨時圖片文件,用戶在瀏覽器上才能看到圖片。但是問題產(chǎn)生了,當(dāng)多用戶以不同參數(shù)使用同一報表的情況下,臨時文件名一般是一樣的,用戶看到的報表數(shù)據(jù)是正確的,但插圖有可能是別人生成的臨時圖片。
經(jīng)過深入研究,筆者發(fā)現(xiàn)問題出在輸出設(shè)置上,目前幾乎所有資料在輸出HTML格式文件時,都沿用與輸出PDF格式文件相同的設(shè)置,可通過以下設(shè)置實現(xiàn):
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,outputStream);
最后動作是將jprint文件直接輸出到Servlet的輸出流中,而根據(jù)分析,PDF圖片是在二進制輸出流中輸出,而HTML輸出流中對圖片只是一個URL引用。圖片雖已作為獨立文件生成,以二進制方式在outputStream輸出HTML文件時,瀏覽器不能正確掌握引用圖片的時機。為了正確輸出圖片,根據(jù)HTML是文本文件的特性,先將HTML文件輸出到一個字符緩沖區(qū)當(dāng)中,再調(diào)用outputStream.println()方法以字符流方式打印HTML文件,println()函數(shù)以字符方式打印HTML文件,瀏覽器接受到輸出Servlet以println()發(fā)來的字符行形式的HTML文件時,可以正確地對已生成的臨時圖片文件進行引用,從而為用戶顯示出正確插圖的HTML文檔。
實用快報:Vista網(wǎng)絡(luò)功能的六大不足
一、對Windows XP支持不力
Vista對基于XP的PC以及使用舊版本W(wǎng)indows的PC幾乎沒有多少支持,至少RC-1版本是這樣。Windows XP PC也許不會出現(xiàn)在網(wǎng)絡(luò)上,即使它們明明就在網(wǎng)絡(luò)上。或者可能會顯示,但隨后會莫名其妙地消失?;蛘咴谑褂肰ista的一項特性時,也許能看到它們;但使用另一項特性時,卻又不見了。還有其他一些問題。譬如說,無法從Windows Vista PC連接到安裝在XP PC上的網(wǎng)絡(luò)打印機。
二、死腦筋的網(wǎng)絡(luò)備份
Vista包括一個界面出眾的新款網(wǎng)絡(luò)備份程序,但它簡直就是死腦筋。它讓你可以指定要備份的某些一般性的文件類型,譬如“文檔”或者“照片”,但你得備份屬于這個一般性類型的所有文件。還有比這更糟糕的。只想保存特定文件夾里面的文件嗎?同樣做不到。無法單單備份某些文件夾。只能備份與PC上每一個文件夾里面的文件類型相匹配的文件。
三、讓人混淆的界面
管理及配置網(wǎng)絡(luò)的界面需要加以改進,有時候讓人混淆。點擊不同名字的鏈接,最終進入的卻是同一位置;有些任務(wù)通過“網(wǎng)絡(luò)和互聯(lián)網(wǎng)控制面板”來實現(xiàn)、另一些任務(wù)卻通過“網(wǎng)絡(luò)和共享中心”來實現(xiàn),這是沒有道理的。而另外一些網(wǎng)絡(luò)特性卻無處可尋。
你可能想知道,為什么通過網(wǎng)絡(luò)實現(xiàn)文件同步及共享的“同步中心”會出現(xiàn)在“網(wǎng)絡(luò)和互連網(wǎng)控制面板”,而不是出現(xiàn)在“網(wǎng)絡(luò)和共享中心”?原因說不上來。實際上,讓特性出現(xiàn)在這些不同位置是沒有明顯道理的。
四、不完美的WMS
Windows Meeting Space本身是個好想法,但實施不當(dāng)。譬如說,在進行演示報告時,要是能與別人通話就好了,不必每個人都非得建立會議呼叫。畢竟,現(xiàn)在有許多免費的IP語音(VoIP)應(yīng)用軟件如Skype,許多即時通信軟件也包括了語音功能。但WMS居然沒有添加這項功能,實在讓人費解。也沒有“白板”功能。人們可以編寫文件,但無法使用記號筆和熒光筆這些工具。
五、沒有反病毒軟件
微軟在Vista的安全方面花了大量時間,并且初見成效:改進了防火墻、內(nèi)置了反間諜軟件,另外還有許多安全特性??墒欠床《拒浖谀睦锬兀窟@正是你我需要的最基本的安全工具,Vista卻偏偏少了它。
六、讓人困惑的同步中心
使用同步中心讓人非常困惑。例如,假設(shè)你有一個USB閃存驅(qū)動器,你想對該設(shè)備與PC之間的文件和文件夾進行同步。進入“同步中心”,該設(shè)備就會出現(xiàn)。這會讓你以為PC可以與它進行真正的同步。但顯然沒有辦法來實現(xiàn)同步。再譬如說,“同步中心”里面竟然沒有可以刪除合作關(guān)系的選項。必須通過相當(dāng)煩瑣的過程才能實現(xiàn),甚至需要重新啟動PC,合作關(guān)系才被刪除。(CCW)
- 1組策略管理Vista網(wǎng)絡(luò)
- 2構(gòu)建數(shù)據(jù)中心底層平臺
- 3改造“緊急斷電”按鈕
- 4最成功的創(chuàng)業(yè)者都是20出頭的年輕人?
- 5客戶做自己OA系統(tǒng)的主人始終是泛普軟件的最終目標(biāo)
- 6香港示威者升殖民地時期旗幟自稱非中國人(圖)
- 7三大主流ETL工具選型
- 8協(xié)同辦公軟件建立XX全球信息一體化項目
- 9物理拓?fù)浜瓦壿嬐負(fù)洮F(xiàn)實和應(yīng)用的比較
- 10RFID在務(wù)實中演進
- 11記者臥底遭暴打 這是救助站還是黑心店
- 12淺談計算機網(wǎng)絡(luò)安全六大指標(biāo)
- 13以加密技術(shù)構(gòu)造最安全的虛擬存儲系統(tǒng)
- 14中國商人造諾亞方舟:煤老板下訂貨單
- 15SOA與SaaS兩者將在何處相遇?
- 16八地交易所整頓過關(guān) 文交所份額化模式前景未明
- 17開源的道路 Intel解剖開源商業(yè)模式
- 18數(shù)據(jù)災(zāi)難,就在我們身邊
- 19建立敏捷信息安全過程新思維
- 20日媒:中國二炮電子戰(zhàn)能力強 日美難擋導(dǎo)彈攻擊
- 21至今無法解決的三種系統(tǒng)漏洞
- 22OA系統(tǒng)自動記錄年假總天數(shù)以及剩余天數(shù)
- 23MES:瓶子里的蒼蠅 如何找到出口?
- 24ILM走俏2007
- 25企業(yè)需要將真實存在的資產(chǎn)記錄到OA系統(tǒng)中
- 26誰是最大的信息安全漏洞?
- 27如何在奧運期間輕松優(yōu)化企業(yè)網(wǎng)絡(luò)管理
- 28中國旅游團19名成員在韓國失蹤 均為山西男子
- 29加密電子郵件
- 30在IIS中為SQL Server 2008配置報表服務(wù)
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓