在 JasperReports 中,我喜欢以 current-page/total-pages 样式呈现页码。
研究官方演示,您可以使用三个 TextFields
找到以下解决方案(因为没有内置变量
页数)
<!-- Right aligned current page -->
<textField>
<reportElement x="100" width="40" .../>
<textElement textAlignment="Right" ... />
<textFieldExpression class="java.lang.String">
<![CDATA[String.valueOf($V{PAGE_NUMBER})]]>
</textFieldExpression>
</textField>
<!-- Centered aligned slash -->
<staticText>
<reportElement x="140" width="5" .../>
<textElement textAlignment="Center" ... />
<text>
<![CDATA[/]]>
</text>
</staticText>
<!-- Left aligned total number pages (evaluationTime="Reports") -->
<textField evaluationTime="Report">
<reportElement x="145" width="40"/>
<textElement textAlignment="Left" ... />
<textFieldExpression class="java.lang.String">
<![CDATA[String.valueOf($V{PAGE_NUMBER})]]>
</textFieldExpression>
</textField>
但是,这仅在完整的分页信息相对于页面居中(中间有斜杠)时才有效。
我想要实现的是以总页数与右边框具有恒定距离的方式右对齐整个组。
如何实现这一目标?
最佳答案
乍一看,这是一个更难的问题。当您尝试更精确地说明“页数没有内置变量”这一说法时,关键问题就变得清晰了。所有变量都有一个评估时间。所以变量 $V{PAGE_NUMBER}
确实是页数的内置变量……但仅当在报告时对其进行评估。
因此,您的总页数字段必须在 Report Time
处进行评估。 .
同样,完全相同的变量 $V{PAGE_NUMBER}
确实是当前页码的内置变量...但仅当在 Now
处评估时或 Page
(或其他合适的时间)。
因此您的当前页面字段必须被评估 Now
或 Page
.
因此,这些变量必须位于不同的文本字段中,以便可以在不同的时间进行评估。
但这与您的要求相冲突。由于您不能将它们放入同一个文本字段中,因此您不能将最右侧的项目右对齐并且使其左侧的项目完美地流入其中。
根据您的具体情况,您可能能够实现可接受的解决方法。但我的猜测是,解决方法所涉及的工作量太大了。例如,您可以想象一个在完成报表填写后运行的脚本。它可以通过报表解析找到字段“xxx 的第 3 页”并将 xxx 替换为正确的总数。我不确定这到底是如何工作的;这听起来主要是坏消息。我不推荐它。
或者,也许您可以以某种方式从外部计算总页数,并将其作为参数传递给报告。例如,如果页数直接取决于行数,它将起作用。但这只能在非常特殊的情况下起作用。这是一个黑客。
您当然应该记录增强请求。我可以想象一个特殊的变量,当放入一个在神奇时间进行评估的文本字段中时,它可以执行您想要的操作 Auto
.但是现在我没有看到任何简单的方法来获得你想要的东西。
关于jasper-reports - JasperReports 中的右对齐页码信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10189474/