最近些日子一直在研究報表生成的模塊,用的是jasperreport,用ireport來設計報表模板,涉及到後臺像子報表傳遞參數。 java
後臺採用的是springmvc+spring+spring data jpa, spring
在後臺向子報表傳遞map參數時的步驟是: express
1.在Parameters添加一個同後臺傳遞到子報表map同名的parameter mvc
2.設置subMap的屬性 spa
3.設置子報表的屬性 設計
Parameters Map Expression屬性填寫$P{subMap}, code
(tips:此項只能用來向子報表傳遞普通的參數,好比string類型參數subparam) ip
Map<Object, Object> subMap = new HashMap<Object, Object>(); subMap.put("subparam", "subparam display");
Connection type屬性選擇Use a datasource expression 開發
(tips:此項向子報表傳遞數據集,即List類型等可迭代的集合類型參數) get
而後再Data Source Expression中填寫
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(((Map<String,List>)$P{subMap}) .get("persons1"))
個人後臺代碼是
Map<Object, Object> mainMap = new HashMap<Object, Object>(); List<Persons> persons1 = (new PersonsFactory()).getPersons(); subMap.put("persons1", persons1); mainMap.put("subMap", subMap);
其中困擾了我好久的一點就是,按照高洪巖寫的《Jasperreports + ireport報表開發詳解》書中data source expression屬性填寫的格式爲
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{subMap}.get("persons1"))
如此填寫的後果實jasper文件編譯沒法經過,會報錯
說object類型沒有get()方法,並且Parameters參數類型中沒有map類型,
只能選擇父類型object,因此我把Object參數$P{subMap}強制轉換爲Map<String,List>,再去獲取其中的List,
((Map<String,List>)$P{subMap}).get("persons1")
編譯不報錯,成功編譯完成,
子報表map中List<Persons>也能夠正常傳遞顯示。