over 3 years ago

此篇採用Java Bean做為資料來源,相較於直接下SQL產出報表的做法慢,但優點為彈性較大,再難的資料結構你都可以組合好再送出去產生報表。

1.下載iReport Designer 跟 JasperReports Library
下載網址
這邊要注意的是版本必須一致,目前官方最新版本為5.5

2.先進行iReport Designer安裝
直接下一步到底後,會看到程式捷徑像這樣就完成工具安裝啦

3.點開報表設計工具後你應該看到這樣子


開始設計我們的報表啦!!

4.設計報表
檔案->NEW->這邊選擇好要輸出的格式我選A4直式後,按Open this Template

再接下選擇你報表檔案名稱及儲存的位置->下一步->完成

接下來你會得到一個空白報表

這邊採用的是母子報表,也就是將報表以及資料展現分開來,如果之後一份報表內有多種表格格式你可以彈性增加。
所以我們要增加兩個Parameter


作為子報表的資料來源
Name=LIST,Parameter Class=net.sf.jasperreports.engine.data.JRMapCollectionDataSource

需要嵌入的子報表
Name=SUB_REPORT,Parameter Class=net.sf.jasperreports.engine.JasperReport

接下來從調色盤中將Subreport拉到Detail裡面


會出現Subreport wizard,此時我們選「Create a new report」並下一步直到「Connection exp」選項






選擇「Use a JRDatasource expression」並選擇 $P{LIST} 表示接收資料來源

新增完子報表後,先回到父報表,修改Subreport的屬性
Subreport Expression=$P{SUB_REPORT}
Expression Class=net.sf.jasperreports.engine.JasperReport

接下來再回子報表新增三個Filds,注意要符合之後將來要傳入的資料類型




再將三個Field拉到報表中排好

之後還要將母子報表個別Compile Report

你會得到編譯完成的report.jasper 跟 report_subreport1.jasper 檔案

5.程式部分
使用到的函式庫
commons-collections-2.1.1.jar
commons-digester-2.1.jar
commons-logging-1.1.1.jar
groovy-all-2.0.1.jar
iText-2.1.7.js2.jar
jasperreports-5.5.0.jar
servlet-api-2.4.jar

測試程式

MainTest.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

public class MainTest {

    public static void main(String[] args) {
        String mrFile = "D:/workspace/ireport/DailyReport.jasper";
        String srFile = "D:/workspace/ireport/DailyReport_Trans.jasper";
        String outFile = "D:/workspace/ireport/report6j.pdf";
        try {
            Map parameters = new HashMap();

            //讀取子報表,並作為參數設定進母報表

            JasperReport subreport = (JasperReport) JRLoader.loadObjectFromFile(srFile);
            parameters.put("SUB_REPORT", subreport);

            //乘載資料的List

            ArrayList list = new ArrayList();
            //塞入測試資料

            for (int i = 0; i < 20; i++) {
                Map data = new HashMap();
                data.put("ordersn", String.valueOf((i + new Long("20131118000001"))));
                data.put("orderamount", (i + 500));
                data.put("orderstatus", "授權成功");
                list.add(data);
            }
            //使用JRMapCollectionDataSource打包成JRDataSource介接資料

            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();
        }    
    }
}

執行後就可以產出報表了

← 處理HttpServletRequest request jasperreport 中文顯示 →
 
comments powered by Disqus