如何将jasper文件路径传递给子报表的子报表

时间:2010-09-13 16:49:38

标签: java jasper-reports

我正在使用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尚未解析,或未正确使用以生成子子报表的名称。

有什么我想念的吗?应如何处理这种情况?

5 个答案:

答案 0 :(得分:5)

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

您会将“ MasterReport SUBREPORT_DIR参数作为参数传递给“ Subreport1 ”。 创建此条目:

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

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

答案 1 :(得分:4)

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

例如:

“COM / mycomp / MyApp的/报告/”

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

希望这有帮助。

答案 2 :(得分:2)

作为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},否则不会传递参数(仅设置<subreportParameter name="SUBREPORT_DIR"/>是不够的。)

答案 3 :(得分:0)

$P{SUBREPORT_DIR}设置为提示并传递您的值(目录的路径可能不是 有效期为c:\something.jasper而不是c:\\something.jasper

答案 4 :(得分:0)

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

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