我相信 D. Rodrigues 实际上给了你正确的解决方案,过去三天我一直在研究类似的问题,但没有运气,最后在 D. Rodrigues 的建议下解决了。我意识到这是一年前的帖子,我发布此帖子是因为我希望它对将来遇到类似问题的人有所帮助。
我的情况是:我有一个包含多层子报表的 JasperReport,我想在 Netbeans 构建的 Java 应用程序中运行它。最初,我将 getResources() 用于我的主报告,当我运行它时,它在 IDE 中运行良好,但是当我构建它并从 jar 运行时,它给出了“找不到文件异常”,我尝试了替代方法使用“输入流”,并将子报表用作输入组,它总是给出“错误加载输入流”,经过几天的研究,我很沮丧,它与这个一起工作。
所以想法是您需要获取主要报告
JasperReport main = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper"));
和所有子报表作为资源
JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper"));
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper"));
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper"));
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper"));
(上例中有 4 个子报表)
由于您将子报表作为“参数”传递,因此您需要在报表中包含这些参数,并且您需要确保这些参数到达使用它们的层,对于我来说,这些层是 Main Sub1 Sub2 Sub3, Sub4
所以在我的main上,我有参数:sub1,sub2,sub3,sub4,在参数类中将它们全部设置为“Object”,将subrepot表达式设置为“$P{sub1}”,它将在运行时调用subreport“Sub1”,并在子报表参数中添加 $P{sub2}、$P{sub3}、$P{sub3},因为您在子报表中使用此参数,但在 Java 代码中,您只是主报表的可能值
之后的层等等,我在 Java 中的最终代码是:
JasperReport jr = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper"));
JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper"));
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper"));
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper"));
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper"));
Map para = new HashMap();
para.put("Sub1", sub1);
para.put("Sub2", sub2);
para.put("Sub3", sub3);
para.put("Sub4", sub4);
JasperPrint jp = JasperFillManager.fillReport(jr, para, conn);
JasperViewer.viewReport(jp, false);
它就像魔术一样工作!
如果仍然无法正常工作,请发表评论或发送电子邮件至:smilelrnr@hotmail.com
我很想看看我能做什么!