拉報表
- 建立空白主報表。
- 新增兩個從 Java 傳進來的 Parameter
- LIST,型別為 net.sf.jasperreports.engine.data.JRMapCollectionDataSource,作為子報表Detail 的資料來源。
- SUB_REPORT,型別為 net.sf.jasperreports.engine.JasperReport。
- 從調色板將 Subreport 拉到 Detail 裡,彈出 Subreport Wizard,選擇「Create a new report」,一直按下一步到最後一頁「Connection exp」,勾選「Use a JRDatasource expression」,輸入「$P{LIST}」,這就是剛建立的 parameter。
- 完成後會先跳到子報表,這時先回到主報表繼續做設定,可以在 Designer 看到 Subreport 元件,這邊的尺寸不重要,一定會依 Subreport 實際的內容佔滿需要的空間。
- 再來修改 Subreport 的屬性,將 Subreport Expression 修改為 $P{SUB_REPORT},也就是最前面建立的第二個 parameter,再將 Expression Class 修改為 net.sf.jasperreports.engine.JasperReport。
- 切換到子報表,像 使用 Java 輸出資料到 Jasperreports 主報表表身(Detail) 所說的建立三個 field,並指明型別,需與 Java 程式一致。
- 再將三個 field 拉到 Designer 裡排排站。
- 完成後編譯主報表與子報表,得到兩個 jasper 檔後,就可以開始寫程式了。
Java 程式
和一般沒有子報表的程式差別在於,新增子報表並塞到主報表的參數裡,其餘都一樣。
String mrFile = "D:/_Download/report6.jasper"; String srFile = "D:/_Download/report6_subreport1.jasper"; String outFile = "D:/_Download/report6j.pdf"; try { Map<String, Object> parameters = new HashMap<String, Object>(); // 讀入子報表,並塞到主報表的參數裡 JasperReport subreport = (JasperReport) JRLoader.loadObjectFromFile(srFile); parameters.put("SUB_REPORT", subreport); // Map 表示一筆資料,再用 List 裝起來,表示所有資料 Collection<Map<String, ?>> list = new ArrayList<Map<String, ?>>(); // 塞入測試資料 for (int i = 0; i < 20; i++) { Map<String, Object> data = new HashMap<String, Object>(); data.put("id", new BigDecimal(i + 1)); data.put("title", "中文 字串 String " + i); data.put("date", new Date(112, 9, i + 1)); list.add(data); } // 使用 JRMapCollectionDataSource 打包資料成 JRDataSource 介面 // 子報表的 data 一樣塞到主報表的參數裡 parameters.put("LIST", new JRMapCollectionDataSource(list)); // 產出報表 JasperPrint print = JasperFillManager.fillReport(mrFile, parameters, new JREmptyDataSource()); JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFile); exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); exporter.exportReport(); } catch (JRException e) { e.printStackTrace(); }噹,收工。
其實有一個很有趣的地方,Jasperreports 的子報表其實也是一張可以獨當一面的報表,換句話說,任何報表都是可以作為子報表的。
---
---
---
回覆刪除現在開源報表軟件大勢已去,沒有好的技術支持,時間成本和學習成本太高,不如直接買一個合適的商業報表
而且在功能上面也不如商業報表,比如jasperreport和finereport的對比:
http://www.finereport.com/tw/knowledge/acquire/jasperreportsireport.html