我通过 PHP / Java Bridge 使用 JasperReports API 。这意味着 PHP 端位于 Java 端的另一台机器上,并且两端不共享相同的文件系统。
要加载报告,我必须阅读 PHP 中的 .jasper 文件,并将其转换为 java.io.InputStream
实例,使用 net.sf.jasperreports.engine.util.JRLoader::loadObject
静态方法加载它。
所以一切正常,直到我的报告子报告引用 Java 方无法访问的文件。所以我的解决方案是访问所有子报告(使用 net.sf.jasperreports.engine.util.JRElementsVisitor
类),评估子报告表达式,使用相同的方法加载报告作为主要报告,但它在主要报告的参数中。
然后,这是我的问题,我不知道如何更改 JRBaseSubreport 表达式以指向新添加的参数。
所以我的问题是,如何更改 JRBaseSubreport 表达式?
答案 0 :(得分:0)
我不确定这是不是您的意思,但实际上您可以更改JRXML中子报表的定义,从使用String
到使用net.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
传递。因此,请将参数更改为:
<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
中运行,但我通常只是将参数从JasperReport
交换为String
实例在iReport
中进行测试以解决问题。