不能在JasperReports的使用子报表(Not able to use subreports

2019-09-19 09:31发布

我创建Jasper报表的Java代码

JasperReport report = JasperCompileManager.compileReport(jrxml);
JasperPrint print = JasperFillManager.fillReport(report,parameters, conn);
JasperExportManager.exportReportToPdfFile(print,filename);

它的成功运行,当我米创建不使用子报表报告。 当我插入任何报表我的代码失败,并说例外

原因:空

MESSAGEnull

LOCAL MESSAGEnull

请告诉我,如果我需要改变我的Java代码?

我看了这条线的地方使用子报表。

JasperReport subreport = (JasperReport)JRLoader.loadObjectFromLocation("ProductReport.jasper");

难道我还需要使用此代码? 我是一个PHP开发人员。 不知道很多关于Java。 我用碧玉报告,因为我们需要创造大PDF。 这个工具帮助我们这么多。 但现在我坚持了一个新的报告,我需要使用报表的事情。

Answer 1:

我用iReport的4.1.3,并在Java代码中我的jar文件是JasperReports的-3.7.6.jar我读了很多次,这两个版本应该是相同的。 所以,我想它和下载JasperReports的-4.1.3.jar,并用它。 这个工作。 现在有与子报表没有问题。



Answer 2:

这成为很多confunsing我,但在这里我们去。

首先,你应该选择,如果你从以.jrxml开发文件得到您的报告

如果您选择JRXML你必须编译它,这是代码JRXML:

JasperReport report = JasperCompileManager.compileReport(jrxml);

你可以发现,你已经这样做了,所以如果你想加载你以同样的方式子报表,你可以通过你的报表的JRXML文件以同样的方式,把这个到另一个变量:

JasperReport subReport = JasperCompileManager.compileReport(subReportjrxml);

当我需要把我的报表主报告里面我刚刚通过了碧玉文件作为我的HashMap内的参数,如下所示:

Map<String, Object> params = new HashMap<String, Object>;

params.put("SUB_REPORT", subReport);

(你把“PARAMS”在fillReport方法,但是你必须填写只有mainReport,因为当你通过子报表作为一个参数应该也填写)

里面的iReport的编辑器,在主报告中,您必须创建具有相同的名称“SUB_REPORT”,你可以在reportInspector做到这一点(或类似的东西)的参数把类型为对象。

选择您subReportElement并进入属性,那里你可以看到一个名为子报表Expression属性,还有你把你所创建的参数。



Answer 3:

我相信D.罗德里格斯实际上已经给你正确的解决方案,在过去的三天里,没有运气,我一直在研究类似的问题,并最终把它修好与D.罗德里格斯的建议。 我意识到这是后在一年前,我张贴这是因为我希望它可以帮助别人遇到类似问题在未来。

我的情况是:我有包含子的多层的JasperReport的,我想在一座建于Netbeans的Java应用程序运行它。 起初,我用getResources()对我的主报告,当我运行它,它工作正常,在IDE中,但是当我建立并从罐子里运行,它提供了一个“文件未发现异常”,我试过的替代使用“的InputStream”,并使用报表作为inputsteam,它总是给“错误加载输入蒸汽”,我研究了几天之后很沮丧,并与这一个工作。

这样的想法是,你需要让主报告

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子报告在上面的例子)

既然你逝去的子报表的“参数”,所以你需要在报表中有这些参数,你需要确保这些参数达到,他们使用的层,矿山,层是主要Sub1的分公司2 Sub3中,Sub4中

所以,在我的主,我有参数:SUB1,SUB2,SUB3,SUB4,将它们都作为参数类“对象”,设置subrepot表达为“$ P {SUB1}”,运行时会调用子报表“Sub1的”,和子报表参数添加$ P {} SUB2,$ P {} SUB3,$ P {} SUB3,becasue您在子报表,但是,Java代码中使用这个参数,你只可能值主报告

等等等等的后层,我在Java中finaly代码:

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);       

和它的作品像魔术!

如果仍然没有工作,请留言或发email给我在:smilelrnr@hotmail.com

我很乐意看到我能做什么!



文章来源: Not able to use subreports in JasperReports