我有一份报告,显示其应有的项目。 现在我需要在主要报告中添加3个子报告。
为此,我使用了iReports。
我的问题是,如何将项目列表传递给子报告??? 我找到了一些教程,但在这些情况下,子报告的数据是在第一批报告中。
在我的情况下,我有一个包含4个细节带的报告,其中3个带有子报告。
我的代码:
JRBeanCollectionDataSource beanCollection = new JRBeanCollectionDataSource(report.getList());
jasperPrint = JasperFillManager.fillReport("C:\\Users\\Desktop\\Report.jasper", new HashMap(), beanCollection) ;
HttpServletResponse http = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
http.addHeader("Content-disposition", "attachment; filename=report.pdf");
ServletOutputStream stream = http.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, stream);
我正在使用jsf 2.0。
ps:我看到我可以创建4个jasperPrint,并将每个页面添加到主报告中,但我想知道它是否可能是我想要的。
问候。
答案 0 :(得分:0)
假设您的数据源具有以下结构
public class MyPOJO{
private List<POJOSubData1> sub1;
private List<POJOSubData2> sub2;
private List<POJOSubData3> sub3;
//getters & setters
...
}
您可以通过为子报表的属性指定以下内容,将所需的数据源传递到子报表
Connection type : Use a datasource expression
Data Source Expression : $F{sub1} //or sub2 or sub3
Field Class
的{{1}}应为sub1
。
此外,您不需要将isolate 1子报告放到1个细节带中,您可以将所有子报告放在一个细节带中。
答案 1 :(得分:0)
如果您使用Ireport创建报告,则在Ireport中打开主报告并选择子报告并转到报告的属性部分,单击“参数”属性并单击“从主文件复制”选项卡,从那里您可以选择要传递给太阳报告的参数。
答案 2 :(得分:0)
我最终做了什么:
for(JRPrintPage p : jasperPrint1.getPages()){
jasperPrint.addPage(p);
}
其中jasperPrint是主报告,jasperPrint1是子报告(这是一个自己的报告)。通过这种方式,我可以将项目列表正常传递给所有报告。
JRBeanCollectionDataSource beanCollection1 = new JRBeanCollectionDataSource(report.getSections().get(1).getRowsReports());
JasperPrint jasperPrint1 = JasperFillManager.fillReport("C:\\Users\\Desktop\\Meeting.jasper", new HashMap(), beanCollection1) ;