我正在評估JasperReport和iReport,要求可以生成多頁報告,其中每個頁面都包含不同的報告。JasperReports具有不同內容的多頁報告
示例:
第1頁包含一個客戶
第一個實際的發票2包含客戶
第3頁發票列表逐年
第4頁包含發票量的曲線圖只包含固定的文本(說操作員指令...)
是否有可能創建這樣一個獨特的報告,而不是創建四個獨立的報告,然後合併PDF文件。
非常感謝。
弗朗西斯
我正在評估JasperReport和iReport,要求可以生成多頁報告,其中每個頁面都包含不同的報告。JasperReports具有不同內容的多頁報告
示例:
第1頁包含一個客戶
第一個實際的發票2包含客戶
第3頁發票列表逐年
第4頁包含發票量的曲線圖只包含固定的文本(說操作員指令...)
是否有可能創建這樣一個獨特的報告,而不是創建四個獨立的報告,然後合併PDF文件。
非常感謝。
弗朗西斯
是的,這是可能的。您可以將整個報告創建爲四個獨立子報告的組合。這將使他們的可重用性和關注點分離。
是的,您甚至可以包含與客戶「無關」的報告。
此外,爲了讓事情更具娛樂性,完成此報告後,您可以將其放在另一個父母報告中,然後您將爲多個客戶獲得相同的報告。
我嘗試了一些不同的東西。
我使用了Ireport 4.1.3,如果你右鍵單擊detail1部分,你可以添加另一個細節部分。
添加喙頁並完成。
希望它能幫助:) 問候
是的,你可以通過創建一個DataSource和參數映射爲在主報告中的每個子報告,
數據源包含將顯示爲列表報告
參數映射包含在報告中鍵和文本框的值的表
好消息是,你可以includ E在每個參數的所有網頁的所有參數報告,然後映射處理每個頁面將提取它的參數和別人忘記:)
例子:
List<Map<String, Object>> ParamList = new ArrayList<Map<String, Object>>();
List<JRDataSource> SourceList = new ArrayList<JRDataSource>();
Map<String, Object> params = new HashMap<String, Object>();
params.put("Page1_param1", "value1_1");
params.put("Page1_param2", "value1_2");
params.put("Page1_param3", "value1_3");
..
params.put("Page2_param1", "value2_1");
params.put("Page2_param2", "value2_2");
params.put("Page2_param3", "value2_3");
..
params.put("Page3_param1", "value3_1");
params.put("Page3_param2", "value3_2");
params.put("Page3_param3", "value3_3");
..
..
List listResult_1 = //select table sql for example
List listResult_2 = //select table sql for example
List listResult_3 = //select table sql for example
JRDataSource dataSource_1 = new ListOfArrayDataSource(
listResult_1, new String[] {"LastName", "FirstName", "address"});
JRDataSource dataSource_2 = new ListOfArrayDataSource(
listResult_2, new String[] {"LastName", "FirstName", "address"});
JRDataSource dataSource_3 = new ListOfArrayDataSource(
listResult_3, new String[] {"LastName", "FirstName", "address"});
// Yes i know ! :D , we put the same params list then as i said befor every sub report will take its own parameters values, so don't worry about this task ;)
ParamList.add(params);
ParamList.add(params);
ParamList.add(params);
SourceList.add(dataSource_1);
SourceList.add(dataSource_2);
SourceList.add(dataSource_3);
File reportFile = // the jrxml file template of the report
// We can use also a list of reportFile, so that every page uses his own template :D
CreateReport(jasperReport, ParamList, SourceList);
}
現在我們創建的每個子報告並將其追加到主要報告:
Public void CreateReport(File reportFile, List<Map<String, Object>> ParamList, List<JRDataSource> SourceList){
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
Map<String, Object> parameters = paramList.get(0);
JRDataSource datasource = datasourceList.get(0);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datasource);
if(paramList.size()>1){
for(int i=1; i < paramList.size(); i++)
{
JasperPrint jasperPrint_next = JasperFillManager.fillReport(jasperReport, paramList.get(i), datasourceList.get(i));
List pages = jasperPrint_next.getPages();
for (int j = 0; j < pages.size(); j++) {
JRPrintPage object = (JRPrintPage) pages.get(j);
jasperPrint.addPage(object);
}
}
}
}
這不適用於可變數量的細節部分嗎? – CodeMonkey 2016-08-30 22:57:45