2

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

4 回答 4

3

我的主要问题是,我使用的是 Jasper 不知道的自定义 JAR 加载器。好消息是也可以将子报告作为java.net.URLor传递java.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>
于 2012-05-30T07:10:36.337 回答
2

完全删除它可能是最容易的SUBREPORT_DIR。iReport 默认添加它是为了方便跟踪您的子报表。但你不需要保留它。

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

于 2012-05-25T00:11:03.940 回答
1

如果我没记错的话,您应该能够仅根据 jar 中已编译 jasper 文件的位置来引用子报告。例如,如果子报表位于以您应该能够传入test.reports的值命名的包中。SUBREPORT_DIR/test/reports/

如果这不起作用,请尝试将编译的报告移动到默认包中,然后设置SUBREPORT_DIR/

于 2012-05-24T21:33:02.583 回答
0

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

于 2019-09-10T14:51:32.700 回答