iReport通常是一個設計階段的工具,用來設計出報表的排版和内容,報表的動态生成需要程式來實作(畢竟報表的資料是動态的,數量是很多的,不可能用iReport Preview的方式一個個手工去生成)。利用上一篇iReport5.6.0linechart制作方法(http://blog.csdn.net/hbsong75/article/details/39992475)生成.jasper文檔後,就可以通過Java程式的方法來動态生成linechart報表了。
程式生成報表的要素主要是下面三點:
1. iReport 通過parameters擷取資料;
1) 主報告Parameters增加resultsList 參數

這個參數接下來要用來接收從程式的MAP中傳過來的子資料集;
2) 子資料集(subDataSet)配置Parameter
在Summary band中選擇linechart元素,右鍵選擇“CharData“,在彈出的對話框中選擇”Parameters” tab 頁,在這裡我們将要配置如何從程式中接收子資料集的資料源:
點選“Add”添加參數:
按上圖藍色數字編号依次配置好,這一步的關鍵是:$P{REPORT_PARAMETERS_MAP}.get("resultsList"),其中在後面的程式中傳遞資料源的鍵值需要時“resultsList”,跟這裡的key值要一緻,否則就擷取不到傳遞的資料了。
配置完成後點選“CompileReport“,重新生成.jasper檔案。
2. 調用JasperRunManager的幾個靜态方法,如runReportToPdf,runReportToHtmlFile等;
示例程式如下:(TestBean.java參考上文)
package com.report.linechart;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class TestReportGenerator {
/**
* @param args
*/
public static void main(String[] args) {
List<TestBean> testBeans = new ArrayList<TestBean>();
TestBean tb1 = new TestBean();
tb1.setCat("1");
tb1.setValue(1);
testBeans.add(tb1);
TestBean tb2 = new TestBean();
tb2.setCat("2");
tb2.setValue(2);
testBeans.add(tb2);
File reportFile = new File("D:\\workspace\\jasperreport\\linecharReport\\testLineReport.jasper");
File reportPdfFile = new File("D:\\workspace\\jasperreport\\linecharReport\\testLineReport.pdf");
Map<String,Object> parameters=new HashMap<String,Object>();
JRBeanCollectionDataSource resultsList = new JRBeanCollectionDataSource(testBeans);
parameters.put("resultsList", resultsList);
parameters.put("reportTitle", "This is a test report");
try {
byte[] reportStream = JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,new JREmptyDataSource());
FileOutputStream fw = new FileOutputStream(reportPdfFile);
fw.write(reportStream);
fw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3. 通過iReport的Parameters關聯資料源
可以看到,resultsList是JRBeanCollectionDataSource類型,程式中通過 parameters.put("resultsList",resultsList),将linechart需要用到的TestBean資料集合進行了傳遞;相對應的,iReport的配置中$P{REPORT_PARAMETERS_MAP}.get("resultsList") 擷取了該資料集。
最後執行該測試程式,可以發現在D:\workspace\jasperreport\linecharReport目錄下生成了testLineReport.pdf檔案,打開該PDF檔案,看到與在iReport中Preview的一緻(測試資料一樣):