2011年4月11日 星期一

如何在JasperReports中製作Subreport

本文介紹分成二部份,分別是Java程式碼和iReport設計畫面。

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,用來顯示資料。


到這裡,一切設定就緒。

去執行你的程式吧!

執行結果:


4 則留言:

  1. 我在
    new JRMapCollectionDataSource(list);
    會有錯誤耶
    The constructor JRMapCollectionDataSource(List>) is undefined

    回覆刪除
    回覆
    1. list必須是如下的型態才行哦

      java.util.Collection<java.util.Map<java.lang.String,?>>

      例如

      List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

      所以請先確定型態是否正確。

      刪除
  2. 作者已經移除這則留言。

    回覆刪除