如何使用JasperReports API更改JRBaseSubreport表达式

时间:2012-10-23 17:29:43

标签: java jasper-reports subreport php-java-bridge

我通过 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 表达式?

1 个答案:

答案 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中进行测试以解决问题。