【问题标题】:how to pass jasper file path to subreport of subreport如何将jasper文件路径传递给子报表的子报表
【发布时间】:2010-09-13 16:49:38
【问题描述】:

我将 iReport 工具与 JasperReports 1.3.4 结合使用。

我有一个主报告,其中包含两个子报告。这些子报表之一具有嵌入式子报表。所有 .jasper 文件都位于同一目录中。

iReport 生成了名为SUBREPORT_DIR 的参数。 subreportExpression 将子报表文件名表示为![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]

从 iReport 中生成报告时一切正常。但是,我有一个小型 Java Web 应用程序,我正在尝试使用它来生成报告。我将"SUBREPORT_DIR" 参数传递给JasperFillManager.fillReport(String sourceFileName, Map parameters, JRBeanCollectionDatasource)。这个SUBREPORT_DIR设置为主报告所在的目录。

fillReport 抛出异常:

 net.sf.jasperreports.engine.JRException: Could not load object from location :
    .sub-subreport.jasper.

似乎第一个子报表正在尝试处理其subreport(embedded subreport),但SUBREPORT_DIR 没有被解析,或者没有被正确用于生成子子报表的名称。

我有什么遗漏吗?这种情况应该如何处理?

【问题讨论】:

  • 从异常消息看来,您使用的是“。”作为 SUBREPORT_DIR 参数。如果是这样,请尝试使用“./”或仅使用“.”
  • 把“./”放在哪里?我很困惑
  • 现在我想你正在使用:parameters.put("SUBREPORT_DIR", "."); JasperFillManager.fillReport(String sourceFileName, Map parameters, JRBeanCollectionDatasource);尝试使用:parameters.put("SUBREPORT_DIR", "");
  • 在 java 类 Param 中,我将参数设置为 ..param.put("SUBREPORT_DIR",filepath) where filepath =request.getSession(true).getServletContext().getRealPath("/jsps/ jrxmls/") 。根据您的建议,我如何将其更改为“”。然后它将传递空值对吗?
  • 它将传递一个空字符串值。这将使主报表在其当前路径中查找其子报表。另外,您的 .jasper 文件是否与 .jrxml 文件位于同一文件夹中?

标签: java jasper-reports


【解决方案1】:

点击Subreport1,转至properties tab -> Subreport properties -> Parameters

您将把您的“MasterReportSUBREPORT_DIR 参数作为参数传递给“Subreport1”。 创建此条目:

姓名:SUBREPORT_DIR 表达式:$P{SUBREPORT_DIR}

不要忘记重新编译您的报告并确保在应用程序服务器中重新发布您的网络应用程序。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,将 SUBREPORT_DIR 设置为包含我的报告的完整包名称。

    例如:

    “com/mycomp/myapp/reports/”

    我们的设置相似,因为您将所有报告都放在同一个目录中。不同之处在于我从桌面(Java SE)运行我的应用程序。但是,我的报告位于 jar 文件中。当我尝试将 SUBREPORT_DIR 设置为 c:\path\to\app\myapp.jar!\com\mycomp\myapp\reports Jasper 未能找到该文件。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      作为Marcio already explained,您的SUBREPORT_DIR 参数必须从调用报告传递到子报告。 使用 ../ 的相对路径并不可靠,总是首选绝对路径。

      所以你必须在你的jrxml文件中写:

      <subreport isUsingCache="false">
          <subreportParameter name="SUBREPORT_DIR">
              <subreportParameterExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportParameterExpression>
          </subreportParameter>
          <subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "mySubreport.jasper"]]></subreportExpression>
      </subreport>
      

      你必须通过subreportParameterExpression$P{SUBREPORT_DIR}传递参数,否则它不会传递参数(仅设置&lt;subreportParameter name="SUBREPORT_DIR"/&gt;是不够的)。

      【讨论】:

        【解决方案4】:

        只需将$P{SUBREPORT_DIR} 设置为提示并传递您的值(目录的路径可能不是 像c:\something.jasper 一样有效,而不是c:\\something.jasper)

        【讨论】:

          【解决方案5】:

          把你编译好的subReport放在你的java类路径下,例如:Resources/subreport/test.jasper

          将您的子报告称为“subreport/test.jasper”将起作用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-19
            • 1970-01-01
            相关资源
            最近更新 更多