【发布时间】:2012-03-07 07:16:25
【问题描述】:
我有一个要求,我需要在报告中显示当前页码和总页码。我有一个主报告和 2 个子报告。我无法确定如何在主报表和子报表中显示正确的页码。 如果你能帮助我,那就太好了。 谢谢
【问题讨论】:
我有一个要求,我需要在报告中显示当前页码和总页码。我有一个主报告和 2 个子报告。我无法确定如何在主报表和子报表中显示正确的页码。 如果你能帮助我,那就太好了。 谢谢
【问题讨论】:
Open Ireport and Go to Window-> Palette 选项在这里您可以看到工具类别中的页码和总页元素。现在只需拖放到要打印页码的位置即可。
【讨论】:
首先,您需要在主报告页面的页脚中添加一个文本字段,表达式应为:$V{PAGE_NUMBER}+" /"
然后在第一个文本字段旁边添加其他文本字段,表达式应为:" " + $V{PAGE_NUMBER} 这将如下所示:1 / 2
但重要的是;
然后,为了在子报表页面上正确查看这些页码; 单击并选择左侧报告检查器窗口顶部的主报告名称。 确保您从属性窗口中检查并选择了此选项:
带有页眉和页脚的摘要
这将使您的子报表正确显示页码。 确保您的子报表具有汇总带以获得结果。
不需要向子报表传递参数,甚至不需要将这些文本字段添加到子报表页面以显示页码。
子报表会自动识别页码。
【讨论】:
您可以使用 $V{PAGE_NUMBER} 变量,但如果是子报告,它会为您提供当前子报告页码或总子-报告页数。问题是 Jasper Reports 不允许您将当前页码从主报告传递到子报告。
简单的解决方案是在主报告中加入打印当前页码的功能。这可行,但方式不灵活,因为您无法管理在每个子报告中打印页码的详细信息。
最终我想出了更好的利用脚本的解决方案。主要思想是将包含必要信息的脚本实例传递给子报表。
public class ExampleScriptlet extends JRDefaultScriptlet {
private Integer page_number;
public void afterPageInit() throws JRScriptletException {
this.page_number = (Integer) this.variablesMap.get("PAGE_NUMBER").getValue();
}
public String getPageNum() throws JRScriptletException {
return String.valueOf(page_number);
}
public ExampleScriptlet getScriptlet() throws JRScriptletException {
return this;
}}
在 master 报告中将 scriptletClass = "my.example.ExampleScriptlet" 放入 jasperReport 标记中。
在主报告的子报告部分将scriptlet的实例传递给子报告
<subreportParameter name="pg_num" ><subreportParameterExpression>
$P{REPORT_SCRIPTLET}.getScriptlet()
</subreportParameterExpression> </subreportParameter>
在子报告中声明scriptlet参数
<parameter name="pg_num" class="my.example.ExampleScriptlet"/>
在子报告中从scriptlet中检索页码
<textFieldExpression><![CDATA["($P{pg_num}.getPageNum())"]]></textFieldExpression>
【讨论】: