我创建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。这个工具给了我们很多帮助。但是现在我遇到了一个新报告,我需要使用子报告。
答案 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
我很想看看我能做些什么!