我在将SUBREPORT_DIR
路径传递到我的子报表时遇到问题。这些报告实际上位于同一文件夹中,但位于 JAR 文件中。我尝试过这样的事情(可能不准确):
parameterList = new HashMap<String, Object>();
URL mainReport = this.getClass().getResource("mainReport.jasper");
String mainReportPath = mainReport.getPath();
String subreportDir = mainReportPath.substring(0, mainReportPath.lastIndexOf("/")+1);
parameterList.put("SUBREPORT_DIR", subreportDir);
此路径指向 JAR 文件内部,但我在生成报告时会得到net.sf.jasperreports.engine.JRException: Resource not found at : ...
。我怎样才能做到这一点?
编辑:
我试图在没有SUBREPORT_DIR
的情况下定义我的子报表,但没有运气:
<subreport>
<reportElement x="0" y="32" width="475" height="17"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{current})]]></dataSourceExpression>
<subreportExpression><![CDATA["mysubreport.jrxml"]]></subreportExpression>
</subreport>
我的主要问题是,我使用的是自定义JAR加载器,而Jasper不知道。好消息是,也可以将子报告作为java.net.URL
或java.io.InputStream
传递:
爪哇代码:
InputStream subInputStream = this.getClass().getResourceAsStream("sub.jasper");
parameterList.put("SUBREPORT_INPUT_STREAM", subInputStream);
JRXML:
<subreportExpression class="java.io.InputStream"><![CDATA[$P{SUBREPORT_INPUT_STREAM}]]></subreportExpression>
完全删除SUBREPORT_DIR
可能是最简单的。 iReport 默认添加它是为了方便跟踪您的子报表。但是你不需要保留它。
在您的情况下,报告位于同一目录和.jar中,因此它们将位于类路径中。将 .jrxml 中的引用从 $P{SUBREPORT_DIR} + "mysubreport.jasper"
更改为简单"mysubreport.jasper"
。然后从报告中删除该参数,并删除尝试确定要使用的目录的代码。
没记错的话,您应该能够仅根据编译的 jasper 文件在 jar 内的位置来引用子报告。例如,如果子报表位于名为 test.reports
的包中,用于SUBREPORT_DIR
值,您应该能够传入/test/reports/
。
如果这不起作用,请尝试将已编译的报告移动到默认包中,并改为SUBREPORT_DIR
设置为/
。
在主文件中子报表对象的"KEY"属性中,尝试分配子报表文件中定义的子报表名称,以便将子报表值返回到主报表。