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

Java 如何将jasper文件路径传递到子报表的子报表,java,jasper-reports,Java,Jasper Reports,我将iReport工具与JasperReports 1.3.4结合使用 我有一个主报告,其中包含两个子报告。其中一个子报表具有嵌入式子报表。所有.jasper文件都位于同一目录中 iReport生成了名为子报表\u DIR的参数。子报表表达式将子报表文件名表示为![CDATA[$P{SUBREPORT\u DIR}+“SUBREPORT.jasper”] 当从iReport中生成报告时,一切都很好。但是,我有一个小型Java web应用程序,我正试图使用它来生成报告。我将“SUBREPORT\u

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

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

iReport生成了名为
子报表\u DIR
的参数。子报表表达式将子报表文件名表示为
![CDATA[$P{SUBREPORT\u DIR}+“SUBREPORT.jasper”]

当从iReport中生成报告时,一切都很好。但是,我有一个小型Java web应用程序,我正试图使用它来生成报告。我将
“SUBREPORT\u DIR”
参数传递给
JasperFillManager.fillReport(字符串源文件名、映射参数、JRBeanCollectionDatasource)
。此
子报告\u DIR
设置为主报告所在的目录

fillReport引发异常:

 net.sf.jasperreports.engine.JRException: Could not load object from location :
    .sub-subreport.jasper.
第一个子报表似乎正在尝试处理其
子报表(嵌入子报表)
,但未解析
子报表\u DIR
,或未正确使用该子报表来生成子报表的名称


是否有我遗漏的内容?该如何处理此场景?

单击
子报表1
,转到
属性选项卡->子报表属性->参数

您将把“主报告
子报告_DIR
参数作为参数传递给“子报告1”。 创建此条目:

名称:
SUBREPORT\u DIR
表达式:
$P{SUBREPORT\u DIR}


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

我也遇到了同样的问题,并将子报告目录设置为包含我的报告的完整包名

例如:

“com/mycomp/myapp/reports/”

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

希望这有帮助。

因为,您的
子报表\u 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>


您必须使用
$p{SUBREPORT\u DIR}
传递
子报表参数expression
,否则它不会传递参数(仅设置
是不够的)。

只需将
$p{SUBREPORT\u DIR}
设置为提示并传递您的值(目录路径可能不正确)
类似于
c:\something.jasper
而不是
c:\\something.jasper

将编译的子报表放在java类路径下,例如:Resources/subReport/test.jasper


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