具有多个子报表的 Jasper 报表
Jasper Report with multiple Subreport
我是 jasper 报告的新手,我正在创建一个 java 程序,它将报告导出到 pdf 文件,我正在使用带有多个子报告的 jasper 报告,
我正在使用 jaspersoft studio 创建 jrxml 文件。
这是我的主报表 jrxml 文件中的子报表部分
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA["ClaimHistory.jasper"]]></subreportExpression>
</subreport>
和另外一个子报表部分
<subreport>
<reportElement positionType="Float" x="18" y="2" width="522" height="65" uuid="a70d75e0-b9d0-4f52-bb84-090993c2e90b"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA["ClaimDetail.jasper"]]></subreportExpression>
</subreport>
每个子报表都使用 JRBeanCollectionDataSource(list) 作为数据,
这就是我将 jasper 导出为 pdf 文件的方式
String jasperFile = "E:/jasper/jasperFile.jrxml";
FileInputStream inputStream = new FileInputStream(jasperFile);
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
jasperPrintList.add(print);
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList)); //Set as export input my list with JasperPrint s
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("E:/output.pdf")); //or any other out streaam
exporter.exportReport();
我目前的技能只能通过使用此 JRBeanCollectionDataSource(list) 作为数据源来制作 pdf 而无需使用子报表。 (数据打印成功)
谁能告诉我如何制作包含多个子报表的 pdf 报表,我的主 jrxml 文件和子报表 jrxml 文件中应该包含什么,java 代码中应该包含什么?,以及如何使用多个 JRBeanCollectionDataSource(list)?,
我唯一知道的是使用 Map params = new HashMap();但是怎么做呢?
谢谢。
- 对不起,我的英语不好。
首先定义子报表的数据源为主报表中的字段(main.jrxml)
<field name="claimHistoryDataSource" class="java.util.ArrayList">
<fieldDescription><![CDATA[claimHistoryList}]]></fieldDescription>
</field>
<field name="claimDetailDataSource" class="java.util.ArrayList">
<fieldDescription><![CDATA[claimDetailList}]]></fieldDescription>
</field>
claimHistoryList
和 claimDetailList
是 java class 中定义的 ArrayLists,用作主报表的数据源。
然后用dataSourceExpression
传递给子报表
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{claimHistoryDataSource})]]></dataSourceExpression>
<subreportExpression><![CDATA["ClaimHistory.jasper"]]></subreportExpression>
</subreport>
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{claimDetailDataSource})]]></dataSourceExpression>
<subreportExpression><![CDATA["ClaimDetail.jasper"]]></subreportExpression>
</subreport>
我是 jasper 报告的新手,我正在创建一个 java 程序,它将报告导出到 pdf 文件,我正在使用带有多个子报告的 jasper 报告, 我正在使用 jaspersoft studio 创建 jrxml 文件。
这是我的主报表 jrxml 文件中的子报表部分
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA["ClaimHistory.jasper"]]></subreportExpression>
</subreport>
和另外一个子报表部分
<subreport>
<reportElement positionType="Float" x="18" y="2" width="522" height="65" uuid="a70d75e0-b9d0-4f52-bb84-090993c2e90b"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA["ClaimDetail.jasper"]]></subreportExpression>
</subreport>
每个子报表都使用 JRBeanCollectionDataSource(list) 作为数据, 这就是我将 jasper 导出为 pdf 文件的方式
String jasperFile = "E:/jasper/jasperFile.jrxml";
FileInputStream inputStream = new FileInputStream(jasperFile);
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
jasperPrintList.add(print);
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList)); //Set as export input my list with JasperPrint s
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("E:/output.pdf")); //or any other out streaam
exporter.exportReport();
我目前的技能只能通过使用此 JRBeanCollectionDataSource(list) 作为数据源来制作 pdf 而无需使用子报表。 (数据打印成功)
谁能告诉我如何制作包含多个子报表的 pdf 报表,我的主 jrxml 文件和子报表 jrxml 文件中应该包含什么,java 代码中应该包含什么?,以及如何使用多个 JRBeanCollectionDataSource(list)?, 我唯一知道的是使用 Map params = new HashMap();但是怎么做呢? 谢谢。 - 对不起,我的英语不好。
首先定义子报表的数据源为主报表中的字段(main.jrxml)
<field name="claimHistoryDataSource" class="java.util.ArrayList">
<fieldDescription><![CDATA[claimHistoryList}]]></fieldDescription>
</field>
<field name="claimDetailDataSource" class="java.util.ArrayList">
<fieldDescription><![CDATA[claimDetailList}]]></fieldDescription>
</field>
claimHistoryList
和 claimDetailList
是 java class 中定义的 ArrayLists,用作主报表的数据源。
然后用dataSourceExpression
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{claimHistoryDataSource})]]></dataSourceExpression>
<subreportExpression><![CDATA["ClaimHistory.jasper"]]></subreportExpression>
</subreport>
<subreport>
<reportElement positionType="Float" x="18" y="1" width="522" height="65" uuid="f3063ed3-775f-47df-8306-a939aecc9d89"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{claimDetailDataSource})]]></dataSourceExpression>
<subreportExpression><![CDATA["ClaimDetail.jasper"]]></subreportExpression>
</subreport>