2010-04-08 34 views
6

我正在評估JasperReport和iReport,要求可以生成多頁報告,其中每個頁面都包含不同的報告。JasperReports具有不同內容的多頁報告

示例:
第1頁包含一個客戶
第一個實際的發票2包含客戶
第3頁發票列表逐年
第4頁包含發票量的曲線圖只包含固定的文本(說操作員指令...)

是否有可能創建這樣一個獨特的報告,而不是創建四個獨立的報告,然後合併PDF文件。

非常感謝。

弗朗西斯

回答

1

是的,這是可能的。您可以將整個報告創建爲四個獨立子報告的組合。這將使他們的可重用性和關注點分離。

0

是的,您甚至可以包含與客戶「無關」的報告。

此外,爲了讓事情更具娛樂性,完成此報告後,您可以將其放在另一個父母報告中,然後您將爲多個客戶獲得相同的報告。

8

我嘗試了一些不同的東西。

我使用了Ireport 4.1.3,如果你右鍵單擊detail1部分,你可以添加另一個細節部分。

添加喙頁並完成。

希望它能幫助:) 問候

+0

這不適用於可變數量的細節部分嗎? – CodeMonkey 2016-08-30 22:57:45

3

是的,你可以通過創建一個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); 
      } 
     } 
    } 

} 
相關問題