1

我通过PHP/Java Bridge使用JasperReports API。这意味着PHP端与Java端位于另一台机器上,并且这两个端不共享相同的文件系统。

要加载报告,我必须在PHP中读取.jasper文件并将其转换为实例并使用静态方法加载它。java.io.InputStreamnet.sf.jasperreports.engine.util.JRLoader::loadObject

因此,在我的报告有报告引用Java端无权访问的文件之前,一切正常。所以我的解决方案是访问所有子报表(使用net.sf.jasperreports.engine.util.JRElementsVisitor类),评估子报表表达式,使用与主报表相同的方法加载报表,但它在主报表的参数中。

然后,这是我的问题,我不知道如何更改JRBaseSubreport表达式以指向新添加的参数。

所以我的问题是,如何更改JRBaseSubreport表达式?

4

1 回答 1

0

我不确定这是否是您的意思,但是您实际上可以将 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 交换JasperReportString实例iReport以绕过它。

于 2012-10-26T17:34:38.437 回答