当主报表查询有多个结果集且子报表输入作为参数时无法生成PDF?
When main report query have multiple results sets and subreport input as parameter could not generate PDF?
我的 JasperReports 报表有子报表。使用ByteArrayInputStream
参数进入主报表,主报表查询结果多行无法生成pdf。但是主报表查询结果集只有一个结果集PDF生成没有报错
我的Java传递子报表的代码:
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("subreportParameter", subreportinputstream)
参数声明在jrxml:
<parameter name="subreportParameter" class="java.io.ByteArrayInputStream"/>
这就是我调用子报表的方式:
<subreport>
<reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
<subreportParameter name="reportid">
<subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="currencycode">
<subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="taxcode">
<subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>
当子报表第二次呈现时,它会尝试从 $P{subreportParameter}
输入流加载报表,但是该流已经在第一次呈现子报表时被读取,因此再次读取它不会产生任何数据。
解决此问题的最简单方法是为子报表设置 isUsingCache
标志:
<subreport isUsingCache="true">
...
或者,您可以自己从流中加载 JasperReport
对象,方法是 JRLoader.loadObject(subreportinputstream)
并将 JasperReport
对象作为报告参数而不是流传递。
我的 JasperReports 报表有子报表。使用ByteArrayInputStream
参数进入主报表,主报表查询结果多行无法生成pdf。但是主报表查询结果集只有一个结果集PDF生成没有报错
我的Java传递子报表的代码:
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("subreportParameter", subreportinputstream)
参数声明在jrxml:
<parameter name="subreportParameter" class="java.io.ByteArrayInputStream"/>
这就是我调用子报表的方式:
<subreport>
<reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
<subreportParameter name="reportid">
<subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="currencycode">
<subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="taxcode">
<subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>
当子报表第二次呈现时,它会尝试从 $P{subreportParameter}
输入流加载报表,但是该流已经在第一次呈现子报表时被读取,因此再次读取它不会产生任何数据。
解决此问题的最简单方法是为子报表设置 isUsingCache
标志:
<subreport isUsingCache="true">
...
或者,您可以自己从流中加载 JasperReport
对象,方法是 JRLoader.loadObject(subreportinputstream)
并将 JasperReport
对象作为报告参数而不是流传递。