使用 JasperReport 报告图书 - 如何使用 $V{MASTER CURRENT_PAGE} 忽略索引页
Report Books with JasperReport - How to use $V{MASTER CURRENT_PAGE} ignoring index pages
我正在 JasperReport,
中开发 Report Books
我需要每个页面在 页脚 带中都有其页码,我一直在尝试使用 PAGE_NUMBER 变量和 Now, Report, Page, etc Evaluation time,但是页码总是不正确。
我在 Report Books 中读到,您应该使用 $V{MASTER CURRENT_PAGE} 变量和 Master Evaluation Time,我工作得很好,但是当我使用这个变量时,计数从第一页开始(自然是这样工作的),但是我有封面和索引页,我希望编号在索引页之后开始。
我想这样解决我的问题:
$V{MASTER CURRENT_PAGE} - 2
但是像索引页可以有更多的页,这肯定会失败。
有人知道如何将 $V{MASTER CURRENT_PAGE} 配置为在索引之后开始。
问候。
您可以使用一个变量来存储索引部分的页数,然后从 $V{MASTER_CURRENT_PAGE}
中减去它
为此,您需要在 master/book 报告中创建一个变量,例如:
<variable name="IndexPages" class="java.util.concurrent.atomic.AtomicInteger" calculation="System">
<initialValueExpression>new java.util.concurrent.atomic.AtomicInteger()</initialValueExpression>
</variable>
请注意,我们将 AtomicInteger
用作可变整数,我们需要一个对象来更新其中的值。
那么要将变量作为参数传递给索引部分作为参数:
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd" usingCache="true">
<subreportParameter name="IndexPages">
<subreportParameterExpression>$V{IndexPages}</subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[...]]></subreportExpression>
</p:subreportPart>
索引报表需要定义参数,用表达式设置对象中的$V{PAGE_NUMBER}
值。表达式应该属于打印在报表最后一页上的元素或带,例如页面 header/footer:
中元素表达式时的打印
<parameter name="IndexPages" class="java.util.concurrent.atomic.AtomicInteger"/>
...
<reportElement ...>
<printWhenExpression><![CDATA[$P{IndexPages}.getAndSet($V{PAGE_NUMBER}) > 0]]></printWhenExpression>
然后相同的变量需要以同样的方式作为参数传递给其他报表部件,需要声明参数然后显示$V{MASTER_CURRENT_PAGE} - $P{IndexPages}.get()
作为页码。
我正在 JasperReport,
中开发 Report Books我需要每个页面在 页脚 带中都有其页码,我一直在尝试使用 PAGE_NUMBER 变量和 Now, Report, Page, etc Evaluation time,但是页码总是不正确。
我在 Report Books 中读到,您应该使用 $V{MASTER CURRENT_PAGE} 变量和 Master Evaluation Time,我工作得很好,但是当我使用这个变量时,计数从第一页开始(自然是这样工作的),但是我有封面和索引页,我希望编号在索引页之后开始。
我想这样解决我的问题:
$V{MASTER CURRENT_PAGE} - 2
但是像索引页可以有更多的页,这肯定会失败。
有人知道如何将 $V{MASTER CURRENT_PAGE} 配置为在索引之后开始。
问候。
您可以使用一个变量来存储索引部分的页数,然后从 $V{MASTER_CURRENT_PAGE}
为此,您需要在 master/book 报告中创建一个变量,例如:
<variable name="IndexPages" class="java.util.concurrent.atomic.AtomicInteger" calculation="System">
<initialValueExpression>new java.util.concurrent.atomic.AtomicInteger()</initialValueExpression>
</variable>
请注意,我们将 AtomicInteger
用作可变整数,我们需要一个对象来更新其中的值。
那么要将变量作为参数传递给索引部分作为参数:
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd" usingCache="true">
<subreportParameter name="IndexPages">
<subreportParameterExpression>$V{IndexPages}</subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA[...]]></subreportExpression>
</p:subreportPart>
索引报表需要定义参数,用表达式设置对象中的$V{PAGE_NUMBER}
值。表达式应该属于打印在报表最后一页上的元素或带,例如页面 header/footer:
<parameter name="IndexPages" class="java.util.concurrent.atomic.AtomicInteger"/>
...
<reportElement ...>
<printWhenExpression><![CDATA[$P{IndexPages}.getAndSet($V{PAGE_NUMBER}) > 0]]></printWhenExpression>
然后相同的变量需要以同样的方式作为参数传递给其他报表部件,需要声明参数然后显示$V{MASTER_CURRENT_PAGE} - $P{IndexPages}.get()
作为页码。