我不确定这是否是您的意思,但是您实际上可以将 JRXML 中子报告的定义从使用 aString
更改为 usingnet.sf.jasperreports.engine.JasperReport
例如,当您添加子报表时,它通常会在您的报表中添加以下参数:
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["C:\\reports\\"]]
</defaultValueExpression>
</parameter>
对于子报表元素本身,它将添加如下内容:
<subreport>
<reportElement uuid="64d21a88-9389-49f5-ba63-1f33aac5a39f" x="821" y="0" width="200" height="100"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "report4_subreport1.jasper"]]></subreportExpression>
</subreport>
SUBREPORT_DIR
而不是在编译的JasperReport
对象中传递 int 。因此,将您的参数更改为:
<parameter name="SUBREPORT" class="net.sf.jasperreports.engine.JasperReport" isForPrompting="false"/>
然后是子报表元素:
<subreport>
<reportElement uuid="64d21a88-9389-49f5-ba63-1f33aac5a39f" x="821" y="0" width="200" height="100"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[$P{SUBREPORT}]]></subreportExpression>
</subreport>
然后只需要知道特定报告需要哪些子报告。
注意:这确实有它没有运行的不幸副作用iReport
,但我通常只是在测试时将参数从 a 交换JasperReport
到String
实例iReport
以绕过它。