2010-04-08 109 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); 
      } 
     } 
    } 

}