无法在JasperReports中使用子报表

时间:2012-07-12 12:07:38

标签: java jasper-reports ireport subreport

我创建Jasper报告的java代码是

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

当我在不使用子报告的情况下创建报告时,它成功运行。当我插入任何子报表时,我的代码失败,异常显示

  

原因:null

     

MESSAGEnull

     

LOCAL MESSAGEnull

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

我已经在某个地方读过这条线来使用子报告。

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

我是否还需要使用此代码?我是一名PHP开发人员。不太了解Java。我使用了Jasper报告,因为我们需要创建大型PDF。这个工具给了我们很多帮助。但是现在我遇到了一个新报告,我需要使用子报告。

3 个答案:

答案 0 :(得分:1)

我正在使用IREPORT 4.1.3并且我的java代码中的jar文件是Jasperreports-3.7.6.jar我多次读过它们的版本应该是相同的。所以我尝试了并下载了jasperreports-4.1.3.jar并使用它。这很有效。现在,子报告没有问题。

答案 1 :(得分:1)

这让我感到非常困惑,但我们走了。

首先,您应该选择是否从 .jrxml .jasper

获取报告

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

JasperReport report = JasperCompileManager.compileReport(jrxml);

您可能已经注意到您已经这样做了,所以如果您想以相同的方式加载子报表,您可以以相同的方式传递子报表的JRXML文件并将其放入另一个变量中:

JasperReport subReport = JasperCompileManager.compileReport(subReportjrxml);

当我需要在主报表中放置子报表时,我只是将jasper文件作为参数传递给我的HashMap,如下所示:

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

params.put("SUB_REPORT", subReport);

(你在fillReport方法中添加了“params”,但是你必须只填充mainReport,因为当你将subReport作为参数传递时,它也应该被填充)

在iReport编辑器中,在主报表中,您创建了一个名为“SUB_REPORT”的参数,您可以在reportInspector(或类似的东西)中将此类型作为Object。

选择你的subReportElement并转到属性,在那里你可以看到一个名为SubReport Expression的属性,你可以在那里放置你创建的参数。

答案 2 :(得分:1)

我相信D.罗德里格斯实际上已经给了你正确的解决方案,我在过去的三天里一直在研究一个类似的问题而没有运气,最后根据D.罗德里格斯的建议解决了这个问题。我意识到这是一年前发布的帖子,我发布这个帖子是因为我希望将来有人会遇到类似的问题。

我的情况是:我有一个包含多层子报表的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个子报告)

由于您将子报表作为“参数”传递,因此您需要在报表中包含这些参数,并且需要确保这些参数到达使用它们的图层,对于我的图层,图层是 主要 SUB1 分公司2 Sub3,Sub4

所以在我的main上,我有参数:sub1,sub2,sub3,sub4,在参数类中将它们全部设置为“Object”,将subrepot表达式设置为“$ P {sub1}”,这将调用子报告“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

我很想看看我能做些什么!