JasperReport庫(kù)是世界上最流行的開(kāi)源報(bào)告引擎。它完全用Java編寫(xiě)爱葵,可以使用任何數(shù)據(jù)源的數(shù)據(jù)生成像素級(jí)的完美文檔施戴。然后,可以以各種格式(包括HTML萌丈、PDF赞哗、Excel、OpenOffice和Word)查看辆雾、打印或?qū)С鲞@些文檔肪笋。
關(guān)于Jaspersoft Studio的安裝可以參考我們一位同事的文章JasperReport 中踩過(guò)的坑
以及官方文檔,安裝社區(qū)版即可。
Jasper的頁(yè)面設(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ù)方便前端開(kāi)發(fā)快速開(kāi)始罚勾,官方文檔中又無(wú)詳細(xì)介紹,因此本文以json為例吭狡,創(chuàng)建一個(gè)jasper report.
數(shù)據(jù): valuation-list-data.json
{
"valuationOrder": {
"company": {
"nameCN": "珠海仁孚南星",
"nameSuffix": "汽車(chē)銷(xiāo)售服務(wù)有限公司",
"nameEn": "Zhuhai Zungfu NanXing Co.,Ltd",
"address": "珠海市香洲區(qū)南屏科技園西路1號(hào)華科汽車(chē)城內(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": "原廠(chǎng)G",
"quantity": 1.00,
"unitPrice": 70.00,
"discount": 0.71556,
"salePrice": 9999999.99
}
]
}
- 新建一個(gè)jasper report文件尖殃,data source 這里選擇
new
,再選擇json文件划煮。
- 點(diǎn)擊 next 后送丰,填寫(xiě)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類(lèi)似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)變量的長(zhǎng)度未知時(shí)锭部,勾選上stretch with overflow
選項(xiàng), text filed的高度會(huì)隨文本的長(zhǎng)度而相應(yīng)增高面褐。
當(dāng)需要在一個(gè)text filed內(nèi)對(duì)文本使用不用的樣式時(shí)拌禾,可以將
style
標(biāo)簽寫(xiě)進(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í),可以通過(guò)如下步驟實(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泽篮,可解決此問(wèn)題。
-
在
fonts
設(shè)置中選擇導(dǎo)入的的font柑船,點(diǎn)擊edit
-
將字體嵌入到pdf中
-
在report目錄中引入自添加的字體
-
導(dǎo)出字體(如果已有字體壓縮包帽撑,可跳過(guò)此步)
在fonts
中選中字體,點(diǎn)擊export
鞍时,導(dǎo)出字體
-
引入字體
右鍵report所在目錄亏拉,選擇properties
選擇Java Build Path
->Libraries
->Add external JARs...
,讀取字體壓縮包逆巍。
點(diǎn)擊apply
及塘,即可引入字體。
-
table
對(duì)于valuationOrder.lineItems
這類(lèi)的數(shù)組數(shù)據(jù)锐极,常見(jiàn)的需求是通過(guò)table來(lái)展示笙僚。
我們可以使用 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類(lèi)似
選擇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的名字無(wú)關(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)分頁(yè)雨涛。下圖分別為分頁(yè)后的table的第一頁(yè)和最后一頁(yè):
可以看到,table header
只在表格第一頁(yè)顯示懦胞,table footer
只在表格最后一個(gè)顯示替久,column header
和column footer
在表格的每一頁(yè)顯示,column header
為“表頭”躏尉。
為了使表格更美觀(guān)蚯根,我們需要給表格添加樣式。除了在創(chuàng)建table時(shí)的layout中可以添加樣式胀糜,還可以在design
模式下雙擊表格颅拦,進(jìn)入table,左下角可以看到table的結(jié)構(gòu)教藻,選擇table中的元素距帅,編輯其樣式。
當(dāng)然也可以在
source
中直接編輯table代碼括堤。
參考鏈接
- http://www.reibang.com/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