天天看點

IReport常見問題及處理方法

一、前言

相信很多java程式員們,在開發報表的時候都使用過ireport, ireport功能确實很強大,可以開發出各式各樣的報表來。ireport是java應用中做報表的一款很好的利器。這也是之是以很多的java程式員們熱衷于它的原因,而且因為ireport本身也是用java語言開發的,這更令我們java程式員們感覺親切。事實上在網上找ireport的資料并不是很多,在我們使用的時候出現的很多問題大多數甚至在網上都很難找到其原型,是以而困惱着許許多多的ireport的使用者。本人使用ireport開發​​開源位元組低代碼平台​​也有一段時間了(從2017年10月份至今),多多少少積累了一些使用的經驗,在此做一下總結,并想和大家一起分享,就當是抛磚引玉吧。

二、常見問題及處理方法

1、IReport制作報表pageheader隻在第一頁出現的解決辦法

解決方法:隻要打開ireport,pageheader的屬性,在print when expression設定$V{PAGE_NUMBER}.equals(1);

2、IReport如何實作變量字段$F{propertyName}指派為一個NULL對象時不顯示”null”, 而顯示為空白?

解決方法:選中動态單元格,右鍵選擇屬性,在彈出對話框TextField頁籤中選中Blank when null。

思考:以往我們為IReport中變量字段指派時會在程式或報表Textfield expression中用三目符号去判空,用IReport此功能既可以提高準确度,又可以減少工作量。

3、 IReport中如果動态單元格中$F{propertyName}顯示的字過長,如何換行?

解決方法:選中動态單元格,右鍵選擇屬性,在彈出對話框TextField頁籤中将選中StretchWith Overflow。

思考:有很多bug都是因為動态文字($F{propertyName})顯示不全而造成的,而且這些bug的修改方式也不是根本解決辦法,因為就算拉長單元格對于動态字過多時也會出現同樣的問題,而且現場也會出現同樣的問題。有了“動态長度超過文本框長度會自動換行”這個功能就會解決此問題。

4、iReport中一個單元格由于内容太多而換行了,而其它沒換行那麼其顯示高度肯定不一緻了,如何解決換行導緻的單元格對不齊問題?

解決方法:把同行所有單元格的屬性Stretch Type="RelativeToBbandHheight "。選擇同一行所有單元格,點選右鍵選擇屬性,在彈出對話框Common頁籤中選中将Stretch Type屬性設為"RelativeToBbandHheight"。

思考:有了此功能,我們使列印格式顯示得更加整齊,就像一個表格框着每個單元格一樣。

5、iReport中當單元格中的文字出現換行跨頁的情況,如何保證換行的字段能夠正常顯示,并且保證換行後同行的高度保持一緻?

解決方法:選擇同行所有單元格,點選右鍵選擇屬性,在彈出對話框Common頁籤中選中Print when detail over。

思考:以前出現翻頁列印時常出現列印内容缺失、列印格式不對齊的bug。此功能可以解決上訴問題。

6、iReport中的子報表如何實作根據其上部是否有列印資料而變列印位置?

解決方法:選中子報表,右鍵選擇屬性,在Common頁籤中将Position type屬性置為Float,将Stretch Type屬性置為RelativeToTallestObject。

思考:當第一頁列印基本資訊在上部,子報表在下部,子報表資料很多需要翻頁,并且翻頁後需要頂頁列印子報表的内容,這時利用此功能最恰當不過了。如果動态文本框因為換行而出現文字重疊也同樣可以選擇“FLOAT”解決此問題。

7、列印時經常遇到翻頁列印,而且每一頁列印的内容不一緻,iReport如何實作此功能?

解決方案:建立多個Frame,每個Frame上可以有不同的列印布局,通過控制Frame的顯示頁數來控制翻頁後不同的顯示内容。具體操作:選擇Frame,右鍵選擇屬性,在Common頁籤中的Print When excepression文本框中輸入控制代碼,如“new Boolean($V{PAGE_NUMBER}.intValue()>1)”表示超過一頁時才顯示此Frame上的内容。

思考:此功能可以更靈活地滿足翻頁列印不同内容的需求

8、以往一些需要列印變量的格式化工作往往在程式實作,實際上最好在模闆中去進行格式化(代碼複用、去除耦合),那麼iReport為能夠提供哪些格式化規則呢,我們又怎樣能利用它們呢?

解決方法:IReport的每個變量單元格都有許多為格式化規則可以選擇(如下圖),而且我們也可以增加自己的格式化規則,具體步驟:選中單元格,右鍵選擇屬性,在Text Field頁籤中點選Create按鈕為變量添加格式化規則(變量類型要與格式化規則對應)。每一項格式化規則這裡就不再贅述了。

思考:列印需求變化最大就是格式了,我們往往因為格式的變化而增加重複代碼或者列印項,而模闆是客戶化的,在模闆上格式化可以最大程度上避免這個問題,例如,日期可以格式化各種形式來顯示,貨币符号用那種、千分位是否分割都可以通過此功能實作。

9、IReport中大小寫問題:

1、parameter中如果小寫,引用也小寫

2、$F{},一般都大寫

3、子報表中引用父報表中查詢出來的值時,隻需要小寫即可,即在子報表的parameter中隻需要小寫

10、設定共幾頁,第幾頁

$V{PAGE_NUMBER} 表示目前是第幾頁 ,在text field 的 選項evaluation time選report是共幾頁,now表是目前頁。頁碼可在IReport裡直接設定。 

11、多份報告靈活組合在一起輸出,僞代碼如下:

Map<String, Object> map = new HashMap<String, Object>();
ResultSet rs = stmt.executeQuery(sql);// 執行query語句得到結果
JRDataSource jrDataSource = new JRResultSetDataSource(rs);
JasperPrint jasperPrintone = JasperFillManager.fillReport(fileName1, map, jrDataSource);
ResultSet rstwo = stmt.executeQuery(sqltwo);// 執行query語句得到結果
JRDataSource jrDataSourcetwo = new JRResultSetDataSource(rstwo);
JasperPrint jasperPrinttwo = JasperFillManager.fillReport(fileName2, map, jrDataSourcetwo);
jasperPrintList.add(jasperPrinttwo);
// 輸出報告
ServletOutputStream outputStream = response.getOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();
outputStream.flush();
outputStream.close();      

13.填充空白行怎麼辦?

如果是resultSet資料源,可以通過union添加;如果是javabean資料源,可以給集合添加空對象

12、案例如下圖:

IReport常見問題及處理方法

以上這些内容都是我在​​開源位元組低代碼平台​​中實際應用ireport所總結出來的一些經驗,有更好的解決方案大家可以積極交流,在下定當謙虛心接受。