4

In JasperReports, I like to render page numbers in the style current-page / total-pages . Studying the official demos you can find the following solution using three TextFields (because there is no built-in variable for number of pages )

<!-- 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>

However, this only works fine when the complete paging information is centered with respect to the page (with the slash in the middle). What I like to achieve is to right-align the whole group in a way that the total-pages has a constant distance to the right border.

How to achieve this?

4

2 回答 2

4

乍一看,这是一个更难的问题。当您尝试更准确地了解此声明时,关键问题变得清晰,“没有用于页数的内置变量”。所有变量都有一个评估时间。因此,该变量$V{PAGE_NUMBER}确实是页数的内置变量……但仅在报告时对其进行评估时。

因此,您的总页数字段必须在 评估Report Time

同样,相同的变量$V{PAGE_NUMBER}实际上是当前页码的内置变量……但仅在NowPage(或其他适当时间)进行评估时。

因此,必须评估您的当前页面字段NowPage

因此,这些变量必须位于不同的文本字段中,以便可以在不同时间对它们进行评估。

但这与您的要求相冲突。由于您不能将它们放入同一个文本字段中,因此您不能让最右边的项目右对齐并且让其左侧的项目完美地流入其中。

根据您的具体情况,您可能能够实现可接受的解决方法。但我的猜测是,解决方法所涉及的工作量太高了。例如,您可以想象一个在报告完成填充后运行的小脚本。它可以解析报告以找到字段“第 3 页,共 xxx”,并将 xxx 替换为正确的总数。我不确定这到底是如何工作的。这听起来像是坏消息。我不推荐它。

或者,也许您可​​以在外部以某种方式计算总页数,并将其作为参数传递给报告。例如,如果页数直接取决于行数,它将起作用。但这只能在非常特殊定义的情况下工作。这是一个黑客。

您当然应该记录增强请求。我可以想象一个特殊的变量,当放置在一个在神奇时间进行评估的文本字段中时,它会执行您想要的操作Auto。但是现在我没有看到任何简单的方法来获得你想要的东西。

于 2012-04-18T18:23:02.760 回答
2

我在http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=68429找到了解决方案。

秘密似乎是您evalutionTime="Auto"在 text field 中定义的Page {X} of {Y}

这是它对我的工作方式(再次归功于http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=68429

首先定义变量CURRENT_PAGE_NUMBER

Variable class: java.lang.Integer
Calculation: Nothing
Reset type: Page
Variable Expression: $V{PAGE_NUMBER}

这只是复制页码。(有趣的是,论坛帖子说,Reset type: None如果您想Page {X} of {Y}在详细信息带中显示,应该设置哪个有效,但如果您喜欢我希望它显示在页面标题带中,则不起作用。)

在此之后,你应该在你想要的地方放置一个文本字段Page {X} of {Y}——在我的例子中,在页面标题的右侧,输入表达式:

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

并设置

evaluationTime="Auto"

由于您现在在一个文本字段中同时拥有当前页数和总页数,因此您可以轻松地以任何您喜欢的方式对齐它。

于 2012-08-01T14:45:12.070 回答