使用JasperReports为每个报告打印应用程序版本

时间:2017-06-06 08:01:44

标签: jasper-reports

我们正在使用JasperReports 6.0.0,并且有大约30个模板用于几乎没有任何共同点的不同报告。今天,我们要求在每个报告的每页底部打印应用程序版本。

如果不修改每个模板文件,我找不到任何好的解决方案。 JasperReport是否允许为所有模板指定总体布局?是否有任何解决方案可以在不修改现有模板的情况下为每个页面添加标签?

1 个答案:

答案 0 :(得分:2)

一些方法:

  • 修改所有.jrxml个文件,并手动为每个文件添加页脚。
  • 使用XSLT修改所有.jrxml模板并添加页脚。
  • 生成报告PDF后,使用iText修改报告输出。
  • 使用JasperReports API以编程方式在编译和执行之前将页脚带注入内存中模板。
  • 使用JasperReports API以编程方式将页脚带注入每个.jrxml文件,并将文件保存回磁盘。
  • 创建主模板并包含参数化子报表。

最后一种方法将有一个主模板,如下所示:

 -----------
|  Title    |
 -----------
| Subreport |
 -----------
|  Footer   |
 -----------

然后,在运行报告时,传入一个参数,指示要包含的子报告(即30个中的一个)。以这种方式,所有30个报告共享标题带和页脚带。它的工作量更大,但最终是最灵活的解决方案。

如果标题区域在所有报告中完全不同,请将其参数化以使用子报告。

这是包含子报表的主报表的屏幕截图,该子报表作为参数提供。在屏幕截图中,标题区域不包括子报告,因为几个报告中的每一个看起来都相同(人类可读的报告标题也是参数)。应该很容易看出,如果Title Band必须为每个报告更改其布局,那么使用子报告将有助于这样的解决方案:

Master Report

但是,如屏幕截图所示,页脚是您问题的一个可能答案。

您可能需要定义一个允许计算页码的变量:

<variable name="V_CURRENT_PAGE_NUMBER" class="java.lang.Integer" resetType="Page">
    <variableExpression><![CDATA[1]]></variableExpression>
    <initialValueExpression><![CDATA[$V{PAGE_NUMBER}+1]]></initialValueExpression>
</variable>

以及引用页码的相应文本字段:

msg("Page {0} of {1}", $V{V_CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER})

请记住,JasperReports使用绝对路径,定义一些参数以避免硬编码子报告的位置。例如:

$P{P_REPORT_SUBREPORTS_PATH} + $P{P_SUBREPORT_NAME} + ".jasper"

此处,P_REPORT_SUBREPORTS_PATH是根据P_REPORT_BASE变量定义的:

$P{P_REPORT_BASE} + "subreports/"

这允许报表IDE使用与Web服务器不同的目录,为P_REPORT_BASE提供不同的值,具体取决于上下文。

最后,请记住,可能看似不同的报告可能是参数化报告。 JasperReports允许自定义样式,这使得动态更改报表外观成为可能(例如,文本对齐,字体,强调,边框等)。例如,在屏幕截图中,报告标题会随着多个报告中的每一个而更改 - 但它们都共享相同的标题区域,因为报告标题是作为String参数传递的。