我正在使用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
尚未解析,或未正确使用以生成子子报表的名称。
有什么我想念的吗?应如何处理这种情况?
答案 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”将起作用