Jasper reports JasperReports以不同的内容报告多页报告

Jasper reports JasperReports以不同的内容报告多页报告,jasper-reports,ireport,Jasper Reports,Ireport,我正在评估JasperReport和iReport,一个需求是生成多页报告的可能性,其中每个页面都包含不同的报告 示例: 第1页包含客户的实际发票 第2页包含客户的发票列表 第3页包含按年份划分的发票金额图表 第4页仅包含固定文本(如操作说明…) 是否可以创建这样一个唯一的报告,而不是创建四个独立的报告,然后合并PDF。是的,这是可能的。您可以将整个报告创建为四个子报告的组合。这将实现它们的可重用性和关注点的分离。是的,您甚至可以包含与客户无关的报告,“如果这样做有意义的话” 此外,为了使事情更

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

示例:
第1页包含客户的实际发票
第2页包含客户的发票列表
第3页包含按年份划分的发票金额图表
第4页仅包含固定文本(如操作说明…)


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

是的,这是可能的。您可以将整个报告创建为四个子报告的组合。这将实现它们的可重用性和关注点的分离。

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


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

我尝试了不同的方法:

我使用了Ireport 4.1.3,如果右键单击detail1部分,您可以添加另一个detail部分


添加一个中断页就完成了。

是的,您可以为主报表中的每个子报表创建数据源和参数映射

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

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

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

例如:

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);

}
List ParamList=new ArrayList();
List SourceList=new ArrayList();
Map params=新的HashMap();
参数put(“第1页参数1”、“值1”);
参数put(“第1页参数2”、“值1\u 2”);
参数put(“第1页参数3”、“值1\u 3”);
..
参数put(“第2页参数1”、“值2\u 1”);
参数put(“第2页参数2”、“值2”);
参数put(“第2页参数3”、“值2\u 3”);
..
参数put(“第3页参数1”、“值3\u 1”);
参数put(“第3页参数2”、“值3\u 2”);
参数put(“第3页参数3”、“值3”);
..
..
List listResult_1=//例如选择表sql
List listResult_2=//例如选择表sql
List listResult_3=//例如选择表sql
JRDataSource dataSource_1=新列表的Arraydatasource(
listResult_1,新字符串[]{“LastName”、“FirstName”、“address”});
JRDataSource dataSource_2=新列表的Arraydatasource(
listResult_2,新字符串[]{“LastName”、“FirstName”、“address”});
JRDataSource dataSource_3=新列表的Arraydatasource(
listResult_3,新字符串[]{“LastName”、“FirstName”、“address”});
//是的,我知道D,正如我之前所说的那样,我们放置了相同的参数列表,因为每个子报表都将采用自己的参数值,所以不要担心这个任务;)
ParamList.add(params);
ParamList.add(params);
ParamList.add(params);
SourceList.add(数据源_1);
SourceList.add(dataSource_2);
SourceList.add(数据源_3);
File reportFile=//报告的jrxml文件模板
//我们还可以使用reportFile的列表,这样每个页面都使用自己的模板: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);
             }
        }
    }

}
Public void CreateReport(文件reportFile,列表ParamList,列表SourceList){
JasperReport JasperReport=(JasperReport)JRLoader.loadObject(reportFile.getPath());
映射参数=paramList.get(0);
jrdasource datasource=datasourceList.get(0);
jasperPrint=JasperFillManager.fillReport(jasperReport,参数,数据源);
如果(paramList.size()>1){
对于(int i=1;i
您可以在jasper reports中使用报告簿,并在需要时将单个报告添加到报告簿中

您可以在这里找到说明:


这对数量可变的细节部分不起作用,对吗?