JasperReports具有不同内容的多页报告

我正在评估JasperReport和iReport,要求是可以生成多页报告,其中每个页面都包含不同的报告。

例:
第1页包含客户的实际发票
第2页包含客户的发票清单
第3页包含按年份列出的发票金额
第4页只包含固定文本(比如操作员说明……)

是否可以创建这样一个独特的报告,而不是创建四个独立报告,然后合并pdfs。

非常感谢。

弗朗切斯科

我尝试了不同的东西。

我使用了Ireport 4.1.3,如果你右键单击detail1部分,你可以添加另一个细节部分。

添加一个beak页面就完成了。

希望它有所帮助:)问候

是的,您可以通过为主报表中的每个子报表创建dataSource和Parameters映射

数据源包含将在报告中显示为表的列表

参数映射包含报表中文本字段的键和值

好消息是,您可以在每个参数图中包含所有页面的所有参数,然后在报表处理中,每个页面都会提取其参数并忘记其他页面:)

示例:

List> ParamList = new ArrayList>(); List SourceList = new ArrayList(); Map params = new HashMap(); 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> ParamList, List SourceList){ JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath()); Map 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); } } } } 

对的,这是可能的。 您可以将整个报表创建为四个单独的子报表的组合。 这将使他们的可重用性和关注点分离。

是的,您甚至可以包含与客户无关的报告“如果有意义”。

此外,为了使事情变得更有趣,在完成此报告后,您可以将其放在另一个报告中,然后您将为多个客户获得相同的报告。