在公司的項(xiàng)目中用JapserReport也做了不少報(bào)表了,現(xiàn)在也做個(gè)記錄吧,很多東西都從網(wǎng)上而來,總結(jié)一下而已。
注意:本文由 bangke 所撰寫 版權(quán)歸屬于bangke 轉(zhuǎn)載請注明出處
1.下載不說了,需要JapserReport和iReport,要pdf支持中文的話需要itextasian.jar(google!)
2.資源:The JasperReports Ultimate Guide.pdf(google!)
http://jasperreports.sourceforge.net/
http://plateau.sicool.com (good!)
源代碼包下面的examples
3.先集中說一下中文支持問題:
1)iReport中文顯示:去掉iReport lib目錄下的tinylaf.jar,會(huì)丑點(diǎn)兒:)
2)要在pdf中顯示中文:如下圖設(shè)置字體或定義字體
注意:在iReport中新建一個(gè)TextField會(huì)自動(dòng)把pdf字體設(shè)為CP1252,需要修改,否則pdf輸出會(huì)報(bào)錯(cuò)說找不到字體
4.明確需求:
JasperReport(0.5.2)目前支持Tabular形式的報(bào)表,分組,子報(bào)表
不支持cross report(交叉表)和單元格合并。
5.JasperReport簡述:
JasperReport總的來說采用報(bào)表樣式和數(shù)據(jù)相分離的設(shè)計(jì),在報(bào)表?xiàng)钍贾卸x好和數(shù)據(jù)源的映射關(guān)系,然后在實(shí)際應(yīng)用的時(shí)候再用數(shù)據(jù)源填充樣式得到最終的報(bào)表輸出。
1)數(shù)據(jù)源:
在JasperReport中可以定義多種數(shù)據(jù)源,都實(shí)現(xiàn)了dori.jasper.engine.JRDataSource接口。
接口有兩個(gè)方法:
public boolean next() throws JRException;
public Object getFieldValue(JRField jrField) throws JRException;
各個(gè)數(shù)據(jù)源簡介:
dori.jasper.engine.JRResultSetDataSource封裝了一個(gè)java.sql.ResultSet
dori.jasper.engine.JREmptyDataSource在沒有實(shí)際數(shù)據(jù)源的數(shù)據(jù)的時(shí)候可以使用它
dori.jasper.engine.data.JRTableModelDataSource封裝了javax.swing.table.TableModel
dori.jasper.engine.data.JRBeanArrayDataSource封裝了an array of JavaBeans and uses reflection to retrieve report field values.
dori.jasper.engine.data.JRBeanCollectionDataSource封裝了java.util.Collection of JavaBeans,和上面的JRBeanArrayDataSource用法相像(強(qiáng)烈推薦,我一直都用它)
簡而言之就是JRDataSource中封裝了一個(gè)循環(huán)的集合,在報(bào)表中一后會(huì)通過(屬性名)反射來取得每個(gè)數(shù)據(jù)項(xiàng)的內(nèi)容
為什么選擇JRBeanCollectionDataSource后面會(huì)解釋。
構(gòu)造數(shù)據(jù)源,采用數(shù)據(jù)工廠(針對JRBeanCollectionDataSource來說),工廠方法:































一個(gè)簡單的數(shù)據(jù)源需要兩個(gè)類,一個(gè)POJO,一個(gè)InterCustomerDS的實(shí)現(xiàn)
POJO:













































TestDateSource:


































2)報(bào)表樣式:
JasperReport將一張報(bào)表分為了幾個(gè)Sections,又叫bands(按照一張報(bào)表的內(nèi)容來劃分的):title, pageHeader, columnHeader, detail, columnFooter, pageFooter, summary, (如果有g(shù)roup的話,還有g(shù)roupHeader和groupFooter)。用iReport畫報(bào)表的工作簡單得說就是把特定的內(nèi)容放在特定的section中。
title和summary在整個(gè)報(bào)表中只顯示一次(不過有個(gè)選項(xiàng)可以設(shè)置為每頁顯示一次)
column和page是每頁顯示一次
detail才是最關(guān)鍵的地方,循環(huán)顯示數(shù)據(jù)源的內(nèi)容,直到全部顯示完為止。
在樣式中的3個(gè)變量:fields,variables,parameters
fields:從數(shù)據(jù)源傳入樣式的屬性名(日后通過反射取值使用,所以fields名一定要和數(shù)據(jù)源中的屬性名一樣!比如使用JRBeanCollectionDataSource的話,fields名就要和javabean中對應(yīng)的屬性名一樣?。?BR> parameters:應(yīng)用程序向報(bào)表傳入得非數(shù)據(jù)源形式的數(shù)據(jù)。
variables:對fields,parameters,也包括所有java對象進(jìn)行合法運(yùn)算后得到的變量。(通常用做對數(shù)據(jù)源某個(gè)屬性的統(tǒng)計(jì),比如求和什么等等)
具體使用iReport設(shè)計(jì)報(bào)表樣式不說了,網(wǎng)上很多資料.
需要注意的是
在報(bào)表樣式中可以輸入表達(dá)式,也就是合法的java scriptlet
在JasperReport中存在的都是java object所以某個(gè)textfield和對應(yīng)數(shù)據(jù)的object類型一定要相同。
parameters除了iReport默認(rèn)的那些類型外其實(shí)可以使用任何java類型的。
每個(gè)band在print when expression中輸入返回Boolean的表達(dá)式可以控制是否顯示
可以使用group來添加bands,group其實(shí)并不需要和某個(gè)field對應(yīng),也就是說group沒有expression是可以的,只不過又expression的話會(huì)按照expression(通常的fields)來動(dòng)態(tài)分組(這里又需要注意,效果上和sql的group by相當(dāng),但并不需要在查詢數(shù)據(jù)源的sql中寫group by, JasperReport回自己幫你做好的)
在輸出數(shù)據(jù)的時(shí)候可以套用pattern,也就是正則表達(dá)式,比如輸出Double的時(shí)候使用 #,##0.00 表示金額:1,234.00, #0.00表示1234.00
3)輸出報(bào)表
采用一個(gè)Helper類,分別使用不同的方法得到填充了數(shù)據(jù)源的JasperPrint比如:

























然后使用JasperPrint得到報(bào)表輸出,比如html輸出:






















6.普通報(bào)表開發(fā):
開發(fā)3步驟
1.定義POJO,寫DataSource查詢數(shù)據(jù)庫生成一個(gè)Collection of POJOs
2.使用iReport設(shè)計(jì)報(bào)表,定義和POJO屬性一樣的fields等
3.用戶輸入web頁面及輸出的Servlet開發(fā)
7.SubReport
其實(shí)和普通報(bào)表開發(fā)一樣,只不過多寫幾個(gè)報(bào)表樣式,POJO和DateSource。
關(guān)鍵是在masterreport中對子報(bào)表的subreport選項(xiàng)卡中的Connection/DataSource Expression要選DataSource,然后填入你子報(bào)表的DataSource,當(dāng)然先要把子報(bào)表的DataSource作為parameter傳入masterreport。(這里JasperReport的example全是Connection的example,害的我想了半天,呵呵,實(shí)際上在J2EE這個(gè)要求解藕程度很高的范圍內(nèi)將sql寫在報(bào)表樣式中是不適合使用的)
8.最后說說為什么使用JRBeanCollectionDataSource,原因上面其實(shí)很多地方都說明了
1。使用POJO和Collection簡單,規(guī)范
2。充分的解除報(bào)表樣式和數(shù)據(jù)庫之間的耦合,假如我要查詢的sql變了,我只需要修改sql和結(jié)果集存入POJO的對應(yīng)處,報(bào)表樣式是不用修改的。
9.喝咖啡,休息,(其實(shí)我更喜歡喝雪碧,呵呵)!
本文由 bangke 所撰寫 版權(quán)歸屬于bangke 轉(zhuǎn)載請注明出處