当路径指向JAR文件内时,将SUBREPORT_DIR传递给子报告[Jasper Reports 4.5]

时间:2012-05-24 14:30:01

标签: java jasper-reports ireport

我在将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>

4 个答案:

答案 0 :(得分:2)

完全删除SUBREPORT_DIR可能最简单。默认情况下,iReport会添加它以方便跟踪子报表。但你不需要保留它。

在您的情况下,报告位于同一目录和.jar中,因此它们将位于类路径中。将.jrxml中的引用从$P{SUBREPORT_DIR} + "mysubreport.jasper"更改为简单"mysubreport.jasper"。然后从报告中删除该参数,并删除试图找出要使用的目录的代码。

答案 1 :(得分:2)

我的主要问题是,我使用的是Jasper不知道的自定义JAR加载程序。好消息是,也可以将子报告作为java.net.URLjava.io.InputStream传递:

Java代码:

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>

答案 2 :(得分:1)

如果我没有弄错,你应该能够根据jar中编译的jasper文件的位置引用子报表。例如,如果子报表位于名为test.reports的{​​{1}}值的包中,则应该能够传入SUBREPORT_DIR

如果不起作用,请尝试将已编译的报告移至默认包中,然后将/test/reports/设置为SUBREPORT_DIR

答案 3 :(得分:0)

在主文件内子报表对象的“ KEY”属性中,尝试分配在子报表文件中定义的子报表名称,这样子报表值将返回到主报表。