JasperReports版本為4.0.1。
首先介紹Java程式碼。
製作Subreport(子報表)的方式之一,
是使用JRMapCollectionDataSource作為Subreport的data source(資料來源)
根據官方API文件,
JRMapCollectionDataSource建構子的參數為Collection,
所以,將資料放在List裡,List中的每一個元素,則用Map來存放,
因此,存放資料的Collection的結構為:
然後,將資料塞進這個list:
就可以把list放到JRMapCollectionDataSource中:
以上,可以想像成JRMapCollectionDataSource是Database,
List是Table,Map則是Record。
完整的程式碼如下:
第二部份是iReport設計畫面。
首先,在主報表中新增parameter,用來接收程式傳送過來的參數,
透過介面來新增parameter的方式,就我所知有二種,
其一為Report query介面,其二為Report Inspector,
在這裡先使用第一種方式來新增參數。
1. 點選Report query按鈕:
2. 在Report query介面中,點選New parameter:
3. 新增二個參數,分別為SUB_REPORT和LIST。
SUB_REPORT的Value expression為net.sf.jasperreports.engine.JasperReport。
在Java程式碼中,會將子報表以InputStream的方式當作參數,傳送到主報表中。
LIST的Value expression為net.sf.jasperreports.engine.data.JRMapCollectionDataSource。
主報表會從Java程式碼中,接收二個參數,一個是子報表,另一個是資料集。
參數新增完後,接著來建立子報表。
子報表顧名思義,會依附著主報表,
所以子報表會是主報表中的一個Element(元素),
因此,建立子報表的步驟為:
1. 首先從Report Elements面板中,選擇Subreport:
2. 將Subreport這個element拖曳到主報表的Detail band中:
之後會跳出Subreport wizard,
請根據指示,一步步往下做(如果你有不清楚的就直接按下一步)
3. 到了第七個步驟,選擇Use a JRDatasource expression,輸入$P{LIST}
(還記得先前在Java程式碼中設定的參數嗎?)
4. 接著,修改subreport的屬性,
將Subreport Expression變更成${SUB_REPORT}
Expression Class變更成net.sf.jasperreports.engine.JasperReport
到上圖為止,主報表的設計告一段落。
接下來,開始設計子報表。
1. 首先,利用Report Inspector來新增Field,
在這邊我們新增三個Fields,名稱分別為field1, field2和field3。
按右鍵,點選加入Fields:
總共新增3個Fields,其Field Class須與Java程式碼中的資料一致。
這三個Fields與其Field Class,正是對應到Java程式碼中的Map。
亦即,field1~3的類別依序為BigDecimal, String和BigDecimal:
2. 然後在Subreport中,新增3個text field,用來顯示資料。
到這裡,一切設定就緒。
去執行你的程式吧!
執行結果:
我在
回覆刪除new JRMapCollectionDataSource(list);
會有錯誤耶
The constructor JRMapCollectionDataSource(List>) is undefined
list必須是如下的型態才行哦
刪除java.util.Collection<java.util.Map<java.lang.String,?>>
例如
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
所以請先確定型態是否正確。
作者已經移除這則留言。
回覆刪除感谢,帮助很大
回覆刪除