- 問題:IReport如何實現變量字段$F{ propertyName}賦值為一個NULL對象時不顯示”null”,?而顯示為空白?
解決方法:選中動態單元格,右鍵選擇屬性,在彈出對話框TextField選項卡中選中Blank when null。
思考:以往我們為IReport中變量字段賦值時會在程序或報表Textfield expression中用三目符號去判空,用IReport此功能既可以提高准確度,又可以減少工作量。
2. 問題:IReport中如果動態單元格中$F{propertyName}顯示的字過長,如何換行?
解決方法:選中動態單元格,右鍵選擇屬性,在彈出對話框TextField選項卡中將選中Stretch With Overflow。
思考:有很多bug都是因為動態文字($F{propertyName})顯示不全而造成的,而且這些bug的修改方式也不是根本解決辦法,因為就算拉長單元格對於動態字過多時也會出現同樣的問題,而且現場也會出現同樣的問題。有了“動態長度超過文本框長度會自動換行”這個功能就會解決此問題。
3、問題:iReport中一個單元格由於內容太多而換行了,而其它沒換行那么其顯示高度肯定不一致了,如何解決換行導致的單元格對不齊問題?
解決方法:把同行所有單元格的屬性Stretch Type=" RelativeToBbandHheight "。選擇同一行所有單元格,點擊右鍵選擇屬性,在彈出對話框Common選項卡中選中將Stretch Type屬性設為"RelativeToBbandHheight"。
思考:有了此功能,我們使打印格式顯示得更加整齊,就像一個表格框着每個單元格一樣。
4、問題:iReport中當單元格中的文字出現換行跨頁的情況,如何保證換行的字段能夠正常顯示,並且保證換行后同行的高度保持一致?
解決方法:選擇同行所有單元格,,點擊右鍵選擇屬性,在彈出對話框Common選項卡中選中Print when detail over。
思考:以前出現翻頁打印時常出現打印內容缺失、打印格式不對齊的bug。此功能可以解決上訴問題。
5、問題:iReport中的子報表如何實現根據其上部是否有打印數據而變打印位置?
解決方法:選中子報表,右鍵選擇屬性,在Common選項卡中將Position type屬性置為Float,將Stretch Type屬性置為RelativeToTallestObject。
思考:當第一頁打印基本信息在上部,子報表在下部,子報表數據很多需要翻頁,並且翻頁后需要頂頁打印子報表的內容,這時利用此功能最恰當不過了。如果動態文本框因為換行而出現文字重疊也同樣可以選擇“FLOAT”解決此問題。
6、問題:打印時經常遇到翻頁打印,而且每一頁打印的內容不一致,iReport如何實現此功能?
解決方案:創建多個Frame,每個Frame上可以有不同的打印布局,通過控制Frame的顯示頁數來控制翻頁后不同的顯示內容。具體操作:選擇Frame,右鍵選擇屬性,在Common選項卡中的Print When excepression文本框中輸入控制代碼,如“new Boolean($V{PAGE_NUMBER}.intValue()>1)”表示超過一頁時才顯示此Frame上的內容。
思考:此功能可以更靈活地滿足翻頁打印不同內容的需求
7、問題:以往一些需要打印變量的格式化工作往往在程序實現,實際上最好在模板中去進行格式化(代碼復用、去除耦合),那么iReport為能夠提供哪些格式化規則呢,我們又怎樣能利用它們呢?
解決方法:iReport的每個變量單元格都有許多為格式化規則可以選擇(如下圖),而且我們也可以增加自己的格式化規則,具體步驟:選中單元格,右鍵選擇屬性,在Text Field選項卡中點擊Create按鈕為變量添加格式化規則(變量類型要與格式化規則對應)。每一項格式化規則這里就不再贅述了。
思考:打印需求變化最大就是格式了,我們往往因為格式的變化而增加重復代碼或者打印項,而模板是客戶化的,在模板上格式化可以最大程度上避免這個問題,例如,日期可以格式化各種形式來顯示,貨幣符號用那種、千分位是否分割都可以通過此功能實現。
8、問題:ireport中大小寫問題:
1、parameter中如果小寫,引用也小寫
2、$F{},一般都大寫
3、子報表中引用父報表中查詢出來的值時,只需要小寫即可,即在子報表的parameter中只需要小寫
一、iReport 中獲取系統當前時間
1、選擇TextField類型為 java.util.Date,選擇TextField的Expression Class(類型)為 java.util.Date
2、在pattern中選擇時間格式
3、在TextField Expression中寫 java.util.Calendar.getInstance().getTime()
二、避免為空
方法一、在屬性選項中找到blank when null即可
方法二、$F{ABB614}?$F{ABB614}:""
三、設置時間格式
方法一、可以使用內嵌函數截取字符串來顯示
1、利用substring來截取 (針對String類型)
$F{AAE036}(($F{AAE036}.toString()).substring(0,4)+"年"+ ($F{AAE036}.toString()).substring(4,6)+"月"+ ($F{AAE036}.toString()).substring(6,8)+"日"):""
2、利用內置的函數來取 (針對date類型)
"日期"+ ($F{ABB017}?String.valueOf($F{ABB017}.getYear()+1900)+" 年"+String.valueOf($F{ABB017}.getMonth()+1)+" 月"+$F{ABB017}.getDate():"")+"日
方法二、設置 Exception class 為date類型,然后在pattern中設置時間格式,可以自己寫,例如××××年××月××日,但是要注意,如果為空無法用$F{ABB614}?$F{ABB614}:"",只能使用blank when null這種方法
四、在ireport中使用html中的標簽
例如:
1、找到屬性面板中的markup選擇為html
2、在需要的地方加入
五、使某個字段中的數據在特定條件下才打印出來
通過設置字段的PrintWhenExpression,我們可以限定只有在某些特定的條件下字段值才會被打印出來,在PrintWhenExpression 中需要設置Boolean 型的表達式,如:new java.lang.Boolean($F{type}.trim().equals("mod_cook"))
六、嵌套子報表
1、在面板屬性中找到Subreport,然后拖進你 要放入的地方,放開鼠標后,會有一個新建報表。新建完報表之后會有個名為SUBREPORT_DIR 的Parameter,string類型,他會有個默認路徑,指的是子報表的路徑。由於子報表往往有多條數據,故最好單獨放在一個detail中(例如: 查詢出來有多條數據,那么會循環顯示在detail中)。
2、如果子報表中需要傳入數據,那么就先點中子報表,然后在屬性欄(不是參數里)中找到“parameters”,新建一個,例如:
name為abz050??,Expression為$F{ABZ050},因為這里的值是父報表查詢的出來之后的值,所以不是用Parameter,而是Field。
3、在子報表中引用值,首先在子報表中定義一個變量Parameter,然后引用即可。
那為什么能找到呢?
因為:你在創建子報表的時候,也會自動創建一個Parameter,名稱默認為SUBREPORT_DIR,它里面有個默認路徑(新傳入的路徑會覆蓋該默認路徑)。
同時,可以點中子報表查看他的屬性,里面有個Subreport Exception的值為$P{SUBREPORT_DIR} + "子報表名稱.jasper",這樣系統就能找到了。當然系統還會自動配置一些其他子報表屬性,具體的自己新建一個看看吧。
七、自動換行
如果不處理一下,有些字段的內容太長了就會顯示不全。選中該字段,右擊->屬性,在Text Field把Stretch with overflow勾上。
同時把該行所有的字段選上,右擊->屬性,在Common的Stretch Type選擇Relative to tallest object。
八、內嵌函數的使用
舉例:($F{ABB617}).toString()).substring(0,4)+"年" 把ABB617(Date類型)先轉化成String然后截取年
ireport中使用內嵌函數只要在字段上看看他有哪些方法,然后直接使用即可。
九、高度根據內容自動變高
1、選中主鍵,在屬性中找到 Stretch With Overflow並選中。並把他單獨放在一個Detial或者其他 里面即可。
2、還有一個屬性叫Stretch type,默認的值是No Stretch,可以改成Relative To Band Height。
第二個步驟我個人認為可做可不做。
當然第二個步驟的功能在做表格的時候很有用,例如:表格是2列,那么兩邊的數據肯定不一樣,或者是左邊就是靜態的,那么如果不選擇這個屬性,你就會發現,右邊的數據很多的時候會擴充,但是左邊不會,這個時候,我們就可以設置該屬性,並把它們放到一個單獨Detial或者其他容器中,那樣 左右兩邊 就會等高了
十、設置共幾頁,第幾頁
$V{PAGE_NUMBER} 表示當前是第幾頁 ,在text field 的 選項evaluation time選report是共幾頁,now表是當前頁。頁碼可在ireport里直接設置。? “共幾頁 第幾頁”
我是寫在page footer 中。
十一、表達式值為NaN的處理方法
在JasperReports中,假設有兩個Field:HGS和ZS,分別表示合格數和總數,
並定義了變量 hglv表示合格率,則hglv的表達式是 $F{HGS}/$F{ZS}。
可能會出現$F{ZS}的值是0情況,即總數和合格數都是0,我們希望這時的合格率為0%,但$F{HGS}/$F{ZS}返回的卻是Double.NaN。
此時在導出的報表中,內容為$V{hglv}的Text Field將會顯示成一個小方塊,如何讓內容為$V{hglv}的Text Field顯示為0%而不是小方塊呢?
方法:因為hglv的表達式只能是表達式,所以我們不能做if--else--的判斷,不過我們可以借助於條件表達式,hglv的表達式可以這樣定義:
Double.isNaN($F{HGS}/$F{ZS})?0:$F{HGS}/$F{ZS}
這樣當$F{HGS}/$F{ZS}返回Double.NaN時,就會用0替代了。
十二、主模板加載子模板時,子模板Detail的內容都不顯示,空白的。
(1)、主報表一定要有數據庫,例如 select 1 from dual
(2)、在主模板設置子模板的Connection type 和connection Expression
(3)、要在jasperServer上運行,直接在main——report上preview是找不到sub_report的。
十三、拼接動態sql
如定義一個參數P_FSIntro ,也是綁定多選下拉列表的一個參數。
1、在參數Default Value Expression 屬性 寫要拼接的字符串。例如拼接 t.field in('x1','x2',.....)
"".equals($P{P_FSIntro}) || (null == $P{P_FSIntro}) ? "1=1":"t2.fSIntor in ('" +org.apache.commons.lang.StringUtils.join(org.apache.commons.lang.StringUtils.stripAll(
($P{P_FSIntro}.trim().indexOf(",") == 0? $P{P_FSIntro}.trim().substring(1) : $P{P_FSIntro}.trim()).split(",")),"','") + "')"