是否可以在放置在详细信息区域中的帧中连接subReports?目标是在模板的详细信息部分中显示这些子报表和先前定义的元素。
如果我使用dynamicReportBuilder.setTemplateFile(TEMPLATE);
和dynamicReportBuilder.addConcatenatedReport(subreport);
在从模板加载的详细报告中插入子报告,则报告模板的详细信息选项中先前定义的元素会消失。所以我正在寻找保存这些元素的方法。
答案 0 :(得分:1)
根据您的评论,似乎发生了两件事之一。
1)您在模板文件的Detail
范围内定义了子报告。
在这种情况下它不起作用。模板文件中的Detail
条带应为空。如果是这种情况,很可能只是忽略了你在那里所做的一切并做了其他事情。有关详细信息,请查看HOW-TO Use custum jrxml templates。
2)dynamicReportBuilder.addConcatenatedReport(subreport);
没有按照你的想法行事。
此方法将第二个报告附加到第一个报告的末尾。把它想象成一批。与直接使用Jasper Reports API时将JASPER_PRINT_LIST
的值设置为导出参数相同。有关详细信息,请查看HOW-TO Add Concatenated Reports。
<小时/> 动态Jasper是一个很棒的库,但实际上只能用于标准的表格报告。它支持一些高级功能,包括子报告,但它可能是有限的。
从目前为止我发现,您似乎只能将子报告添加到群组页眉和群组页脚。因此,在您的情况下,您可能需要首先使用GroupBuilder
添加一个组进行报告。然后,您可以将子报表添加到组尾。该小组的诀窍是通过选择要分组的相应字段来确保每一行最终成为自己的组。
您可以查看HOW-TO Add labels in group header and footer中的代码示例,了解如何构建组。
要了解如何向报告添加子报告,您可以使用DynamicReportBuilder.addSubreportInGroupFooter()
方法。有关此部分和示例的更多详细信息,请查看HOW-TO Add Subreports (fast way)。
您拥有的另一个选择是不要将Dynamic Jasper用于此特定报告,只需使用jrxml文件和Jasper Report的API自行完成。根据您的设置,它可能会或可能不会更容易。
答案 1 :(得分:0)
里卡多·马里亚卡。这段代码是解决方案,感谢里卡多和动态报告
private void build() {
try {
JasperPdfExporterBuilder pdfExporterBuilder = export
.pdfExporter(PDF_FILE);
JasperReportBuilder jasperReportBuilderMain = report()
.columns(
col.column("Item", "item", type.stringType()),
col.column("Quantity", "quantity",
type.integerType()),
col.column("Unit price", "unitprice",
type.bigDecimalType()))
.setDataSource(createSubreportDataSource())
// .detail(cmp.subreport(createSubreport()))
.setWhenNoDataType(WhenNoDataType.ALL_SECTIONS_NO_DETAIL);
JasperReportBuilder jasperReportBuilderDisclaimer = report()
.setPageFormat(PageType.A4, PageOrientation.LANDSCAPE)
.summary(cmp.subreport(jasperReportBuilderMain))
.summaryWithPageHeaderAndFooter()
.setWhenNoDataType(WhenNoDataType.ALL_SECTIONS_NO_DETAIL)
.columnHeader(
cmp.text("first page header").setFixedHeight(50))
.columnFooter(
cmp.text(DISCLAIMER).setStretchWithOverflow(true)
.setFixedHeight(250))
.pageHeader(
Templates
.createTitleComponent("Ricardo Mariaca Approach"))
.pageFooter(Templates.footerComponent).show()
.toPdf(pdfExporterBuilder);
} catch (DRException e) {
e.printStackTrace();
}
}
private JRDataSource createSubreportDataSource() {
DRDataSource dataSource = new DRDataSource("item", "quantity",
"unitprice");
for (int i = 0; i < 180; i++) {
dataSource.add("Book", (int) (Math.random() * 10) + 1,
new BigDecimal(Math.random() * 100 + 1));
}
return dataSource;
}
}