1. 程式人生 > >【JasperReport+Ireport】jasperreport+ireport解決中文不顯示問題 (史上最全例子)

【JasperReport+Ireport】jasperreport+ireport解決中文不顯示問題 (史上最全例子)

最近專案需要java+jasperreport生成pdf並下載,琢磨了若干天終於研究出來。

如果你JDK環境不是1.8,可以忽略此行,在jdk1.8環境下開啟irport時,圖示會一閃而過,然後沒任何反映。

原因及解決方法:

原因:

iReport-5.6.0不支援jdk1.8,所以我們只好用jdk1.7的環境。

解決方法:

到iReport安裝目錄中找到\etc\ireport.conf檔案,編輯下面檔案中的

#jdkhome="/path/to/jdk" 改為你的JDK7的路徑。

比如:jdkhome="C:\Program Files\Java\jdk1.7.0_05"

然後就可以正常啟動iReport了。

ireport佈局介紹:

各塊區域------
Title----報表名,只在第一頁顯示
pageHeader-----放頁碼,時間,建立人,每一頁都會顯示出來
columnHeader-----列名
detail----迴圈的資料,比如說我們直接從資料庫中得到資料,只用將欄位拖到此區域,那麼就會將所有的這個欄位的值進行迴圈了。
-----需要注意的是:table中因為放了資料,也會將這些資料接著迴圈。到頭來,本來一個table已經將資料給迴圈完了,但是又由於detail的迴圈性質,將整個table又迴圈了。所以table是不能放在detail中的。這回迴圈table。
columnFooter-----與columnHeader相反,可以用來統計此列資料。
pageFooter-------每頁底部都會顯示的,如頁碼
lastPageFooter----最後一頁的底部,如日期,簽名.....
Summary--------可能需要對幾頁(你的報表可能有幾個頁組成)的統計值。比如50個銷售記錄共佔用了3頁,那麼放置這些統計記錄的統計值最好的地方就是summary。     
Summary只在最後一頁出現。

欄位,變數,引數,傳參

Fields  欄位

Variables  變數

Parameters 傳參

可右擊新增和命名對應的對像,在此就不講述.

在ireport中如何引用欄位,變數,引數?
引用欄位使用 $F{field_name}
引用變數使用 $V{variable_name}
引用引數使用 $P{param_name}  或 $P!{param_name}
$P!{param_name}一般用於拼接sql語句,它的值可以與sql語句拼接後,再去執行查詢.
例:定義一個引數名為 where 型別為String 預設值為 "where id=100"
有一查詢語句:select * from user $P!{where}
則執行查詢時會替換成:select * from user where id=100

$P{param_name}在sql語句中使用時,也有一特殊情況.
例:有一引數名為 id,型別為Integer,預設值為 new Integer(100)
有一查詢語句:select * from user where id=$P{id}
執行查詢可正常查詢,但如果有一引數名為 name,型別為String,預設值為"zhanngle"
有一查詢語句:select * from user where name=$P{name}
執行查詢時出錯,不知道為什麼(即使資料庫中有該條記錄),不知是不是bug,還是自已哪裡弄錯了.解決辦法是,將查詢語句改為:select * from user where name='$P!{name}'
可以證明$P!{}語法,只做替換操作,如上只將$P!{name}替換成zhanngle.
也可以證明$P{}語法,在sql語句中使用時,值為數字型別還可以正常執行,如為字串型別則會出錯.

在程式中如何傳參?
如上例定義了一個name引數,那麼在程式中如何動態傳參查詢出不同的記錄呢,也很簡單.
程式程式碼如下:
Map params=new HashMap();
params.put("name","zhanngle");
JasperPrint print=JasperFillManager.fillReport(jasper, params,conn);

就是將引數名和值put進入一map,然後再填充報表時將map傳過去就行了。

畫好模板後,我們開始解決中文問題:

首先從網上或c:/windows/font得到你想用的字型,如果你的字型為ttf,可忽略此節,若是ttc,請祥看:

jasperreort只支援ttf的字型,所以,我們需要用軟體來從ttc字型中提取出ttf字型

首先解決IReport中的字型:

第一步:將IReport的Fonts資料夾新增到classpath中,新增後點確定。

第二步,安裝字型。從c:\windows\fonts目錄拷貝字型檔案到一個零時目錄,比如微軟雅黑,拷貝後是兩個ttf檔案,一個普通字型,一個加粗。

在IReport中的font標籤配置

完成後出現微軟雅黑,並勾選下方的font選項

完成上述操作後,新增字型就可以選擇了

在屬性列表下方還有一個pdffontname屬性,這裡不需要修改。因為新增字型的時候已經embedded到pdf上了。

自此,在IReport中就可以將中文字型輸出到PDF了

下面解決JasperReports程式設計中的PDF中文問題。

需要將字型打包加入工程,如圖:

選擇一個目錄儲存成jar檔案,到工程中再引入些jar

然後執行程式就可以了。