2017-06-06 211 views
1

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

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

回答

2

一些方法:

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

最后一种办法将有一个主模板如下:

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

然后,运行报表时,在通过指示哪些子报表包括参数(即三十之一)。以这种方式,标题带和页脚带由所有三十个报告共享。这是更多的工作,但最终是最灵活的解决方案。

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

下面是主报告的屏幕截图,其中包含一个作为参数给出的子报告。在屏幕截图中,标题栏不包含子报表,因为每个报表看起来都是相同的(人类可读的报表标题也是一个参数)。它应该很容易看出,如果标题带过,到改变其布局为每个报表,然后使用报表,而不是将有助于这样的解决方案:

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_BASE} + "subreports/" 

这允许报告IDE通过提供不同的值使用不同的目录Web服务器的:

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

这里,P_REPORT_SUBREPORTS_PATHP_REPORT_BASE变量来定义的对于P_REPORT_BASE,取决于上下文。

最后,请记住,看似不同的报告可能是参数化报告。 JasperReports允许自定义样式,这使得可以动态地改变报告外观(例如,文本对齐,字体,重点,边界等等)。在屏幕截图中,例如,报告标题随着几个报告中的每一个而改变 - 但它们都共享相同的标题带,因为报告标题作为字符串参数传入。