JasperReports入門教程(四):多數據源
背景
在報表使用中,一個頁面需要打印多個表格,每個表格分別使用不同的數據源是很常見的一個需求。假如我們現在有一個需求如下:需要在一個報表同時打印所有老師的數據,再打印每個年級的學生的數據。那么本章我們就用這個例子來實現多數據源。
方案分析
通過上一篇基礎組件的介紹,我們知道一個JasperReport報表中可以有多個Detail的Band,但是卻共享一個主數據源,多個Detail是共享這個主數據源。查看Paramter和Field發現他們都支持java.util.List
類型。那么我們可不可以用一個List類型的Paramter做老師的數據源,一個List類型的Field來做學生的數據源,這樣就解決了數據源的問題。
我們來看看如何打印,Detail都是讀取主數據源的數據,直接通過Detail來打印行不通,我們發現一個表格組件Table
,這個組件的用DataSet
來做報表設計的源。而那么思路就明確了。用Paramter和Field來做數據源,用Table
作為打印組件,用DataSet
來填充Table
中要打印的字段。
添加多數據源
1.在Paramters中新增一個teachList
的屬性,類型為java.util.List
。如下圖所示
2.在Fields新增一個studentList
的字段,類型為java.util.List
。如下圖所示
添加DataSet
1.在Outline上右鍵Create Dataset
創建一個teachDataset
2.如法炮制,在創建一個studentDataset
的Dataset。
3.在teachDataset
中的Field
上增加需要打印的字段name,job
4.在studentDataset
中的Field
上增加需要打印的字段name,age,sex
添加Table組件
1.從右側的basic Elements
工具框增加一個Table組件到 Page Header 的Band。選擇Create a Table using an existing dataset
,選擇teachDataset
,並點擊next
按鈕。
2.選擇 Use a JRDatasource expression
,填寫new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{teachList})
數據,點擊next
按鈕。
這里是把teachList
屬性包裝為一個JRBeanCollectionDataSource
集合對象作為Table的數據源
3.把左邊的Field全部選到右邊,點擊next
按鈕
4.下面的界面是設置Table組件需要展示的布局和樣式,我們只選擇Add Column Header
只增加一個列頭。大家可以根據需要來設置,並點擊完成
5.雙擊Table
可進入Table的編輯界面,在這個界面可以增加,減少列,設置樣式
6.同樣的方式,在Detail1新增一個Table組件,綁定studentDataset
7.Table
組件設置Dataset
如下圖所示
代碼開發
核心代碼就是給屬性teachList
和字段studentList
賦值,和前幾章類似,比較簡單就不貼代碼了