JasperReport庫是世界上最流行的開源報(bào)告引擎。它完全用Java編寫,可以使用任何數(shù)據(jù)源的數(shù)據(jù)生成像素級(jí)的完美文檔。然后,可以以各種格式(包括HTML、PDF、Excel、OpenOffice和Word)查看、打印或?qū)С鲞@些文檔。
關(guān)于Jaspersoft Studio的安裝可以參考我們一位同事的文章JasperReport 中踩過的坑
以及官方文檔,安裝社區(qū)版即可。
Jasper的頁面設(shè)計(jì)分為9個(gè)Bands。關(guān)于Bands的基本介紹請(qǐng)閱讀官方文檔:Understanding Bands
。
本文主要記錄下我們使用JSON格式的數(shù)據(jù)創(chuàng)建JasperRepor時(shí)遇到的一些坑和經(jīng)驗(yàn)。
json data adapter
創(chuàng)建jasper report時(shí)需要選擇data source

可選的數(shù)據(jù)鏈接有csv文件,jdbc連接,java beans,json等等

json數(shù)據(jù)方便前端開發(fā)快速開始,官方文檔中又無詳細(xì)介紹,因此本文以json為例,創(chuàng)建一個(gè)jasper report.
數(shù)據(jù): valuation-list-data.json
{
"valuationOrder": {
"company": {
"nameCN": "珠海仁孚南星",
"nameSuffix": "汽車銷售服務(wù)有限公司",
"nameEn": "Zhuhai Zungfu NanXing Co.,Ltd",
"address": "珠海市香洲區(qū)南屏科技園西路1號(hào)華科汽車城內(nèi)",
"postCode": "519000",
"phone": "+86-756-8520011",
"fax": "+86-756-8520011"
},
"customer": {
"name": "王圓圓",
"gender": "女士"
},
"id": "39524395243952",
"operator": "parts manager",
"printDatetime": "2010/04/11 14:09:45",
"totalPrice": 1111111111165.69,
"lineItems": [
{
"id": "2",
"stock": "y",
"name": "2010087/氣缸蓋密封",
"identify": "原廠G",
"quantity": 1.00,
"unitPrice": 70.00,
"discount": 0.71556,
"salePrice": 9999999.99
}
]
}
- 新建一個(gè)jasper report文件,data source 這里選擇
new,再選擇json文件。
- 點(diǎn)擊 next 后,填寫data adapter名字,選擇導(dǎo)入json文件,并選擇
Use the report JSON expression when filling the report選項(xiàng)。
- 點(diǎn)擊 finish 后雙擊
valuationOrder,query valuationOrder.
-
點(diǎn)擊next選擇需要的fields
- 點(diǎn)擊next,按需求選擇以哪些fields進(jìn)行分組。最后選擇next -> finish.
創(chuàng)建好jasper report后可以直接將field拖拽至需要的位置,也可以添加Text Filed后雙擊,選擇要展示的數(shù)據(jù)。
點(diǎn)擊preview可進(jìn)行預(yù)覽
注意到,valuationOrder中的customer和company都是對(duì)象,要展示其中的字段時(shí),直接創(chuàng)建field,輸入要?jiǎng)?chuàng)建的field的名字和class即可。
elements
jaspersoft studion提供了一些常用的elements,如可插入變量的text field和靜態(tài)文本static filed. image, line, list, chart, tabl, page number等等。frame類似div,可將elements在bands內(nèi)分組。

我們可以在三種模式下操作元素:
design
design模式下可以直接拖拽元素進(jìn)行設(shè)計(jì)布局,在右下角可以對(duì)元素進(jìn)行定位,設(shè)置大小,顏色,border, padding等操作。

source
source模式下可以利用代碼編輯、更改元素。

design
design模式預(yù)覽report,查看元素渲染。
text field
當(dāng)變量的長度未知時(shí),勾選上stretch with overflow選項(xiàng), text filed的高度會(huì)隨文本的長度而相應(yīng)增高。

當(dāng)需要在一個(gè)text filed內(nèi)對(duì)文本使用不用的樣式時(shí),可以將
style標(biāo)簽寫進(jìn)text field,如:
<textField>
<reportElement x="314" y="133" width="100" height="30" uuid="f1bebe59-b953-4449-bdde-6bbc70fc89d1"/>
<textFieldExpression><![CDATA["<style size='14' >" + $F{customer.name} + "</style> <style size='10' >" + $F{customer.gender} + "</style>"]]></textFieldExpression>
</textField>
對(duì)customer.name和customer.gender采用不同的字號(hào)。
此時(shí),text field的Markup需為styled.

customer font
當(dāng)我們要引入jaspersoft studio未提供的字體時(shí),可以通過如下步驟實(shí)現(xiàn):
Jaspersoft Studio -> Preferences -> Jaspersoft Studio -> fonts,選擇要導(dǎo)入的字體的路徑

添加成功后apply,導(dǎo)入的字體即可使用。
注意:
導(dǎo)入的customer字體位于font下拉列表的最前面!
當(dāng)我們要將jasper reposrt導(dǎo)出為pdf時(shí),可能會(huì)出現(xiàn)customer font導(dǎo)致的錯(cuò)誤,因?yàn)閜df格式有自己的font set。將customer font添加至pdf font,可解決此問題。
-
在
fonts設(shè)置中選擇導(dǎo)入的的font,點(diǎn)擊edit
-
將字體嵌入到pdf中
-
在report目錄中引入自添加的字體
-
導(dǎo)出字體(如果已有字體壓縮包,可跳過此步)
在fonts中選中字體,點(diǎn)擊export,導(dǎo)出字體
-
引入字體
右鍵report所在目錄,選擇properties
選擇Java Build Path->Libraries->Add external JARs...,讀取字體壓縮包。
點(diǎn)擊apply,即可引入字體。
-
table
對(duì)于valuationOrder.lineItems這類的數(shù)組數(shù)據(jù),常見的需求是通過table來展示。
我們可以使用 columnHeader, detail, columnFooter等bands組合創(chuàng)建table,eg: create a new report,也可以使用jaspersoft studio提供的table元素。
以下為table元素的添加步驟:
-
選擇、添加table
-
table元素需要dataset(可以創(chuàng)建新dataset或者使用已存在的dataset)
-
創(chuàng)建dataset,步驟和創(chuàng)建data adapter類似
選擇lineItems
選擇dataset的fields
選擇dataset分組的fields
選擇table的dataset的連接。
因?yàn)槲覀兊臄?shù)據(jù)是json格式,因此選擇Use a JRDatasource express, 填入
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("lineItems")
其中lineItems為json中數(shù)組的key,與dataset的名字無關(guān)。

-
選擇需要在table中要展示的columns
- 選擇布局
layout中可以選擇是否需要table header、table footer、column header、column footer、group header和group footer;設(shè)置table中單元格的顏色和border.
點(diǎn)擊finish,完成table的添加。當(dāng)table的dataset數(shù)據(jù)很多時(shí),table會(huì)自動(dòng)分頁。下圖分別為分頁后的table的第一頁和最后一頁:
第一頁
最后一頁
可以看到,table header只在表格第一頁顯示,table footer只在表格最后一個(gè)顯示,column header和column footer在表格的每一頁顯示,column header為“表頭”。
為了使表格更美觀,我們需要給表格添加樣式。除了在創(chuàng)建table時(shí)的layout中可以添加樣式,還可以在design 模式下雙擊表格,進(jìn)入table,左下角可以看到table的結(jié)構(gòu),選擇table中的元素,編輯其樣式。

當(dāng)然也可以在
source 中直接編輯table代碼。
參考鏈接
- http://www.itdecent.cn/p/b46b158a8289
- https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v630/creating-new-report#jss-user-basicreport_293982575_1024061
- https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v720/design-tab-3
- https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v720/working-font-extensions-0
- http://jasperreports.sourceforge.net/sample.reference/jsondatasource/index.html
- https://stackoverflow.com/questions/42821983/display-json-array-in-table-on-jasper-report
- https://stackoverflow.com/questions/42821983/display-json-array-in-table-on-jasper-report




























