无法在JasperReports中使用子报表

我创建Jasper报告的java代码是

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

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

原因:null

MESSAGEnull

LOCAL MESSAGEnull

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

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

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

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

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

这对我来说变得很烦人,但我们走了。

首先,您应该选择是从.jrxml还是.jasper获取报告

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

 JasperReport report = JasperCompileManager.compileReport(jrxml); 

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

 JasperReport subReport = JasperCompileManager.compileReport(subReportjrxml); 

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

 Map params = new HashMap; params.put("SUB_REPORT", subReport); 

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

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

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

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

我的情况是:我有一个包含多层子报表的JasperReport,我想在Netbeans内置的Java应用程序中运行它。 最初,我使用getResources()作为我的主报告,当我运行它时,它在IDE中工作正常,但是当我构建它并从jar运行时,它给出了“文件未找到exception”,我尝试了替代方案使用“输入流”,并使用子报告作为输入组,它总是给出“错误加载输入蒸汽”,经过几天的研究后我感到很沮丧,并且它与这个一起工作。

所以你的想法是你需要获得主要报告

 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}”,这将在运行时调用子报告“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

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