我正在使用JasperReportsPdfView在我的Spring Boot项目中生成报告。 目前我有1个主报告,主报告有很多子报告
所以,主报告 - >分报告1,分报告2等......
我EntityA
Detail
和Details2
现在我使用JRDataSource将数据源传递给每个子报告,如...
EntityA entityA = findById(1);
JasperReportsPdfView view = new JasperReportsPdfView();
view.setUrl("classpath:report/main_report.jrxml");
view.setApplicationContext(appContext);
List<Detail> details = entityA.getDetails();
List<Detail2> details2 = entityA.getDetails2();
JRDataSource subReportDetail1Source = new JRBeanCollectionDataSource(details);
JRDataSource subReportDetail2Source = new JRBeanCollectionDataSource(details2);
final Map<String, Object> params = new HashMap<>();
params.put("subReportData2", subReportDetail1Source);
params.put("subReportData3", subReportDetail2Source);
return new ModelAndView(view, params);
现在我想为每个EntityA
创建许多主报告,因此我会列出EntityA
列表
List<EntityA> listOfEntityA = findAll();
如何为listOfEntityA中的每个EntityA重复创建主报告?
我想让我当前的MainReport成为另一个MainReport的子报告,但我不知道如何传递每个detail1和detail2的数据源
答案 0 :(得分:1)
在这种情况下,你不应该传递subReportData2
和subReportData3
作为参数,将它们定义为jrxml中的字段。
您的主数据源将是
new JRBeanCollectionDataSource(istOfEntityA);
在你的jrxml中定义为字段Detail
和Detail2
列表,因此EntityA
上的getter
<field name="details" class="java.util.List"/>
<field name="details2" class="java.util.List"/>
然后将子报告添加到详细信息区域并将数据源表达式设置为:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{details})
这样,报告将迭代 EntityA 列表中的详情带, 并使用详细信息列表和详细信息2 调用子报表 EntityA 类作为数据源