iReport 4.5.0:页脚页面计数器制作及特定页面组件显示问题
解决iReport 4.5.0中特定页面显示组件的思路
嘿,我之前维护老版本iReport报表时也踩过这个PAGE_NUMBER的坑,print when表达式里拿不到正确值确实闹心,给你几个针对4.5.0版本亲测有效的方案:
方案1:调整组件的「Evaluation Time」属性(最简便)
很多时候不是PAGE_NUMBER用不了,而是表达式的求值时机不对。iReport 4.5.0里,默认的求值时机是「Now」,如果组件在细节带这类早期渲染的区域,PAGE_NUMBER还没完成计算。
- 选中需要控制显示的组件,打开右侧属性面板
- 找到「Evaluation Time」选项,选择「Page」
- 然后在「Print When Expression」里直接写
$V{PAGE_NUMBER} == 2(比如要在第2页显示),就能正常拿到当前页码了
方案2:自定义页面计数变量(稳定可靠)
如果调整求值时机不管用,手动维护一个页面计数器变量是稳妥的做法,之前你可能没踩对变量的配置细节:
- 右键报表根节点 → 「Add Variable」
- 变量命名:比如
customPageCounter,类型选java.lang.Integer - 计算类型(Calculation)选「Count」,重置类型(Reset Type)选「Page」
- 变量表达式(Variable Expression)填
new Integer(1) - 把这个变量拖到页脚带区(确保每一页都会触发计数)
- 回到组件的「Print When Expression」,写
$V{customPageCounter}.intValue() == 3(指定页码)
⚠️ 注意:别把重置类型设成「Report」或者「Group」,必须是「Page」,否则计数器不会每页重置。
方案3:用Scriptlet自定义页面逻辑(复杂场景适用)
如果需要更灵活的页面控制(比如跳过某些空白页计数),可以用自定义Scriptlet:
- 写一个Java类继承
net.sf.jasperreports.engine.JasperScriptlet,示例代码大概是这样:
public class PageCounterScriptlet extends JasperScriptlet { private int currentPage = 0; @Override public void beforePageInit() throws JRScriptletException { currentPage++; } public int getCurrentPage() { return currentPage; } }
- 把编译后的class文件放到iReport的classpath里(比如报表项目的lib目录)
- 在报表的「Properties」里找到「Scriptlet Class」,填入这个类的全路径
- 然后在组件的「Print When Expression」里写
((PageCounterScriptlet)$P{REPORT_SCRIPTLET}).getCurrentPage() == 5
常见坑提醒
- 别把组件放在「Title」或者「Summary」带区,这些带区的页码计算逻辑特殊,PAGE_NUMBER可能不生效
- 自定义变量时,确保变量的「Calculation」类型是「Count」,不要用「Sum」或者其他类型
- 如果报表有多列,要区分「PAGE_NUMBER」和「COLUMN_NUMBER」,别搞混了
内容的提问来源于stack exchange,提问作者Fábio Coelho
相关产品推荐
相关产品推荐

