我想创建一个包含
Page X of Y
的文本字段,而不按照常见的解决方案将其分成两部分。我的文本字段包含 "Page " + $V{currentPage} + " of " + $V{PAGE_NUMBER}"
和 evaluationTime=auto
。
假设我有一份 10 页的报告。三个是标题带,六个是详细信息带,一个是摘要带。我的结果显示
"Page 0 of 10"
代表标题带,详细带的正确计数,然后"Page 0 of 10"
代表摘要带。
如何确保变量在各处计算,而不仅仅是在Detail Band?
对于 Jaspersoft Studio v6,或者如果首页页码重复,请尝试此解决方案,它使用
$V{MASTER_CURRENT_PAGE}
和 $V{MASTER_TOTAL_PAGE}
,评估时间为 Master
。
对于 Jaspersoft Studio 的其他版本,请尝试后续小节中概述的步骤。
创建变量如下:
V_CURRENT_PAGE_NUMBER
1
$V{PAGE_NUMBER}
0
,请使用 $V{PAGE_NUMBER} + 1
。1 of Y
,请将 表达式 设置为 $V{PAGE_NUMBER}
而不是初始值表达式,并将初始值表达式留空。Page
这些设置如下图所示:
将 Expression 设置为
1
可防止其值为 null
。也就是说,如果页脚显示 Page null of 4,则可能意味着 Expression 尚未设置。
变量已创建。
添加页脚带,如下所示:
页脚已添加。
创建一个文本字段,如下所示:
msg("Page {0} of {1}", $V{V_CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER})
Auto
这些设置如下图所示:
单个文本字段已创建。
对于包含三页加一个摘要页的报告,预览报告会显示:
摘要页面显示:
我尝试了这种方法,但最终得到了不正确的页码:{1/7、1/7、2/7、3/7、4/7、5/7、6/7}。
对于 JasperReports 6+,请使用
MASTER_CURRENT_PAGE
和 MASTER_TOTAL_PAGES
系统变量,并记住将文本字段评估时间设置为 Master
:
<textField evaluationTime="Master">
<textElement textAlignment="Right"/>
<textFieldExpression><![CDATA[msg("Page {0} of {1}", $V{MASTER_CURRENT_PAGE}, $V{MASTER_TOTAL_PAGES})]]></textFieldExpression>
</textField>
参见:http://jasperreports.sourceforge.net/sample.reference/book/index.html
正如您提到的,常见方法使用两个单独的文本字段:
当前页码
$V{PAGE_NUMBER}
评估时间:现在
总页数
$V{PAGE_NUMBER}
评估时间:报告
对于页面历史记录显示如下:页面:第 1 页(共 5 页)
将文本字段值设置为如下所示,并将评估时间更改为
Master
:
"Page: "+$V{MASTER_CURRENT_PAGE}+" of "+$V{MASTER_TOTAL_PAGES}
来源:
<textField evaluationTime="Master">
<reportElement x="224" y="0" width="186" height="15" uuid="6641bb8b-9f48-4832-942b-8b04220030e6">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<font size="8"/>
</textElement>
<textFieldExpression><![CDATA["Page: "+$V{MASTER_CURRENT_PAGE}+" of "+$V{MASTER_TOTAL_PAGES}]]></textFieldExpression>
</textField>
关于当前页码,
evaluationTime=now
和$V{PAGE_NUMBER}
就是你的答案。
不幸的是,我认为您无法实现您想要的目标,因为当“详细信息”区域启用“允许拆分”时,PAGE_COUNT 中存在错误。否则
evaluationTime=now
和 "Page " + $V{PAGE_NUMBER} + " of " + $V{PAGE_COUNT}"
可能会起作用。
这应该会有所帮助,通过使用 evaluationTime 作为 Report
<textField>
<reportElement x="497" y="0" width="32" height="12" forecolor="#7E8083"
uuid="ef663cfd-4058-40bb-a6d9-de7f9a8164be"/> --update your elements here
<textElement textAlignment="Right" verticalAlignment="Middle">
<font fontName="SansSerif" size="7" pdfFontName="OpenSans-Regular.ttf"/>
</textElement>
<textFieldExpression>
<![CDATA["Page " + $V{PAGE_NUMBER} + " of"]]>
</textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="529" y="0" width="7" height="12" forecolor="#7E8083"
uuid="ef663cfd-4058-40bb-a6d9-de7f9a8164be"/> --update your elements here
<textElement textAlignment="Right" verticalAlignment="Middle">
<font fontName="SansSerif" size="7" pdfFontName="OpenSans-Regular.ttf"/>
</textElement>
<textFieldExpression>
<![CDATA[$V{PAGE_NUMBER}]]>
</textFieldExpression>
</textField>
我花了一个小时在 JasperStudio 7.0.0 上解决这个问题,你找到的所有答案都是片面的。
对我来说,正确的解决方案是在带有评估时间主控的文本字段中使用主控变量。不需要声明任何变量,任何增量类型,任何东西。这是工作页面页脚带的示例:
<pageFooter height="50">
<element kind="textField" uuid="8f531472-05b2-4dba-bc70-1ea4f358ecd9" x="290" y="0" width="210" height="30" evaluationTime="Master">
<expression><![CDATA["Page " + $V{MASTER_CURRENT_PAGE} + " of " + $V{MASTER_TOTAL_PAGES}]]></expression>
</element>
</pageFooter>