我正在评估JasperReport和iReport,要求是可以生成多页报告,其中每个页面都包含不同的报告。
例:
第1页包含客户的实际发票
第2页包含客户的发票清单
第3页包含按年份计算的发票金额图表
第4页只包含固定文本(比如操作员说明......)
是否可以创建这样一个独特的报告,而不是创建四个独立报告,然后合并pdfs。
非常感谢。
Francesco
答案 0 :(得分:9)
我尝试了不同的东西。
我使用了Ireport 4.1.3,如果你右键点击detail1部分,你可以添加另一个细节部分。
添加一个beak页面并完成。
希望有帮助:) 此致
答案 1 :(得分:3)
是的,您可以为主报告中的每个子报告创建一个dataSource和参数地图,
数据源包含将在报告中显示为表格的列表
参数map包含报告中文本字段的键和值
好消息是,您可以在每个参数图中包含所有页面的所有参数,然后在报表处理中,每个页面都会提取其参数并忘记其他页面:)
示例:
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);
}
}
}
}
答案 2 :(得分:2)
答案 3 :(得分:1)
是的,有可能。您可以将整个报表创建为四个单独的子报表的组合。这将使他们的可重用性和关注点分离。
答案 4 :(得分:0)
是的,您甚至可以包含与客户无关的报告“如果有意义”。
此外,为了使事情变得更有趣,在完成此报告后,您可以将其放入另一个父报告中,然后您将为多个客户获得相同的报告。