JasperReports:找不到子报告
Posted
技术标签:
【中文标题】JasperReports:找不到子报告【英文标题】:JasperReports: Can't locate subreport 【发布时间】:2013-09-10 10:48:09 【问题描述】:这让我发疯.. 上一小时我试图弄清楚为什么我的报告在我添加子报告后立即停止工作.. 我已经检查并尝试了所有类似的问题here、here 和here。 没有成功..子报表肯定在同一目录中.. 定义如下:
<subreport isUsingCache="false">
<reportElement uuid="db816b3c-a13d-440f-a6a2-f899762e61e4" x="0" y="89" />
<subreportParameter name="footerAddress">
<subreportParameterExpression><![CDATA[$PfooterAddress]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="footerManager">
<subreportParameterExpression><![CDATA[$PfooterManager]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="footerContact">
<subreportParameterExpression><![CDATA[$PfooterContact]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="footerBank">
<subreportParameterExpression><![CDATA[$PfooterBank]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$PSUBREPORT_DIR]]></subreportExpression>
</subreport>
其中 $PSUBREPORT_DIR 是 "/valid/path/sub.report.jasper"
我仍然收到错误:Resource not found at /valid/path/sub.report.jasper
为什么??
【问题讨论】:
会不会是 *nix 操作系统的权限问题? @AlexK 我不这么认为.. 我可以从同一个报告中访问同一文件夹或内部文件夹中的图像..sub.report.jasper
- 是文件名,不是文件夹?
有时您必须更改主报告才能重新编译并包含修改后的子报告。你试过吗?
【参考方案1】:
在第一条消息中作者说:
$PSUBREPORT_DIR
是“/valid/path/sub.report.jasper
”
$PSUBREPORT_DIR
是一个目录,而不是一个文件名。这是第一个错误。
第二个:有时jasper找不到子报表,连路径都正确。
解决这个问题的方法:
-
将
$PSUBREPORT_DIR
传递到main 报告(在本例中:“/valid/path/
”),将此参数放入HashMap<String, Object>
- 将参数传递到jasper 的标准方式。
将$PSUBREPORT_DIR
从主报告 传入子报告作为参数:$PSUBREPORT_DIR
主报告 -> 子报告的$PSUBREPORT_DIR
(这种方式在存在子报告时使用,即从子报表调用)
在主报表中将子报表的表达式设置为$PSUBREPORT_DIR
+ "sub.report.jasper
"
【讨论】:
$PSUBREPORT_DIR is a directory, but not filename. It is first error.
- 是的,参数名称错误(该值不是文件夹名称)。但是你可以给任何你想要的名字。为什么会出错?
我写的不全。这是潜在的错误。 Jasper 在 $PSUBREPORT_DIR 路径中搜索子报表。因此最好将此参数定义为目录。
JR引擎不知道$PSUBREPORT_DIR
,它不是内置参数。
哇!你说的对。 iReport 在创建子报表时生成此参数。我经常使用它,以至于我什至没有考虑它 :) 所以,使用目录是我的信仰 :) 但这真的很有用。例如,这在我的消息的第二项中有所描述
@lealceldeiro 。谢啦。我有同样的问题,我解决了。你真的帮了我【参考方案2】:
我之前遇到过这个问题。
我的方法是 - 我在参数中发送绝对文件夹,比如 folder_path。然后在我使用的子报告表达式中new File(($Pfolder_path + "*.jasper" )
。这个 *.jasper 文件可以替换为 "\\inner_folder\\*.jasper"
。
这非常有效
【讨论】:
【参考方案3】:这种情况时常发生在我身上,它始终是一个平台操作系统,它是决定某些代码为何有效而其他代码无效的关键因素。然而,一直有效的是相对引用而不是绝对引用。
如果 cjava 的解决方案不起作用,我的建议是找出 JasperReports 在磁盘上所做的事情。根据您的平台、*nix、Windows,您可能需要弄清楚 JasperReports 正在运行的系统调用以找到它正在使用的路径。在我的应用程序中,我发现即使我指定了以前有效的无路径引用,某些平台也会以不同的方式进行路径搜索并且无法找到报告。
关于如何解决系统调用的其他一些问题:
*nix - Strace
strace java applet
Windows - 进程监视器
On Windows, how can I find what files a given process is using? Is there software that does this?
Mac - DTruss
ltrace equivalent for osx?
祝你好运。
【讨论】:
【参考方案4】:尝试从代码中发送 SUBREPORT_DIR 参数。也许它不见了…… 如果你使用 maven,请检查 pom.xml 中的资源目录标签并进行比较。
params.put("SUBREPORT_DIR", "reports/report/blablaFolder/");
【讨论】:
以上是关于JasperReports:找不到子报告的主要内容,如果未能解决你的问题,请参考以下文章