【问题标题】:Analyse JasperReports export output [closed]分析 JasperReports 导出输出 [关闭]
【发布时间】:2013-04-05 10:36:51
【问题描述】:

再次 - Jasperreports...

因此,我们得到了包含类似于以下图表和表格的报告:

JAN | FEB | MAR | ... | DEC | SUM
----+-----+-----+-----+-----+----
 5  |  1  |  9  | 120 | 20  | 155
(Numbers represent amounts of vehicles)

在这些表格下方有多个表格,其中包含上表中更详细的数据(以向下钻取的方式)。

我们将这些报告导出为 PDF,并在网络应用程序中作为可下载文档提供。所需的数据是在专门的 Java 工厂中计算出来的。根据报告,有一个工厂提供带有哑数据对象的列表。这些对象包含显示在图表和表格中的汇总数字。

此外,数字是超链接。他们转发到一个 servlet,该 servlet 提供一个 XLS 导出,其中包含有关每辆车的详细数据。当然,每个超链接都有一堆 servlet 的参数。

我们想要的:

执行以下操作的全自动测试:

  • 检查每个表的数据完整性(求和列中的数字真的是之前每列的总和)
  • 检查明细表相对于上级表的数据完整性(JAN列总和=上级表JAN列数)
  • 获取每个号码的超链接,并将其提供给 XLS 导出,以检查 XLS 中的车辆数量是否等于表格中显示的数量

所以测试应该类似这样:

Test -> generate PDF report -> check table integrity -> parse links -> check XLS -> assertEverythingLooksFine()

我们的尝试:

目前,PDF 报告被写入ByteArrayOutputStream 以将数据转发到PdfReader,后者使用SimpleTextExtractionStrategy 对其进行解析。这样虽然很麻烦,但可以检查表的完整性。此外,无法获取超链接。另一个想法是将报告导出为 HTML 而不是 PDF 以获取超链接。检查表的完整性更加麻烦,因为 JasperReports 不会生成 HTML 表,而是生成一堆 DIV。

补充说明:

  • 是的,也可以根据工厂的输出来检查表的完整性——我在写这个问题时想到了这个想法。但真正重要的测试点是 XLS 导出,导出的参数是在 JasperReports 中生成的
    • 是的,生成导出参数也可以在工厂完成,但我认为它不属于那里(层架构等)
  • 我知道,在单元测试中分析二进制格式的输出是个坏主意,但是 JasperReports 是一个相当黑的盒子,我们在 jrxml-stuff 中做了很多工作
  • 我还想到了某种格式化程序/定制程序,它在生成时访问元素
  • 我已阅读http://whathaveyoutried.com 并尽我所能;)

我的问题:

  • 您如何看待这种方法?合理吗?
  • 我是否遗漏了一些可以做得更好的地方?
  • JasperReports 是否有某种 API 或接口可以访问以更轻松地访问生成的输出?也许是格式化程序/定制程序方法?
  • 有没有更好的阅读 PDF 的 API?
  • 我是否忘记了合理的问题? ;)

我们使用哪些版本:

  • Java 1.6
  • 兴趣点 3.8
  • iText 5.1.3
  • JasperReports 4.7.1

我希望这个问题不要太乱,你不要在口头上把我打死;)

【问题讨论】:

  • 您好,SO 采用简单的方案,一问一答。如果你有这么多话题,最好的方法是联系 JasperSoft 的人。他们是非常乐于助人的人。

标签: java unit-testing pdf jasper-reports


【解决方案1】:

正如@Vash 所说,这里不是可以回答/讨论此类话题的地方。

不过,如果有人遇到类似问题并找到此站点,我会发布我们的解决方案。

获取所需 - 通过 JasperReports 生成 - 输出

生成 HTML 代替 PDF 或使用某种 API 解析最终的 PDF 文档都不是一个真正令人满意的解决方案。我们所做的是编写一个链接到报告的脚本。在报告中,在显示车辆数量的地方调用 scriplet。车辆数量和生成的链接作为参数传递给脚本,该方法再次返回该数量。

现在脚本有一个静态Map<String, Double>,它收集所有链接和数字。生成报告后,我们可以抓取这个Map 并分析相应的 XLS 导出。这样我们就可以比较 PDF 和 XLS 中的车辆数量。

这种方法的缺点是,PDF 报告生成为一个空的OutputStream

检查表数据的完整性

幸运的是,显示的数据是在 java 工厂中生成的。所以我们所要做的就是实例化它并检查它的输出,这些输出是在特殊的数据类和集合中传递的。这样我们就可以隐式验证报表中的数据是否正确。

使用由三个报告和大约 240 个 XLS 文档组成的设置运行完整的单元测试大约需要五分钟。作为副产品,我们有一堆 XLS 表(也写入空的 OutputStreams),这不是很好,但另一方面,它只是一个单元测试,不必非常高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2011-11-16
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多