1

我用于创建 Jasper 报告的 java 代码是

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

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

原因:空

MESSAGEnull

本地消息null

请告诉我是否需要更改我的 Java 代码?

我在某处读过这一行以使用子报表。

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

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

4

3 回答 3

1

我使用的是 IREPORT 4.1.3,我在 java 代码中的 jar 文件是 Jasperreports-3.7.6.jar 我读了很多次,两者的版本应该是相同的。于是我试了一下,下载了jasperreports-4.1.3.jar并使用了。这行得通。现在子报表没有问题了。

于 2012-07-12T19:21:46.657 回答
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(或类似的东西)中执行此操作,将类型作为对象。

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

于 2012-07-12T21:02:22.077 回答
1

我相信 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

我很想看看我能做什么!

于 2014-07-11T14:22:07.690 回答