如何在主节点和子节点之间添加页码

时间:2012-03-07 07:16:26

标签: jasper-reports subreport

我有一个要求,我需要在报告中显示当前页码和总页数。我有一份主报告和两份子报告。我无法确定如何在主页和子报表中显示正确的页面编号。 如果你能帮助我,那将是很棒的。 感谢

3 个答案:

答案 0 :(得分:1)

打开Ireport并转到Window->选项板选项可以在工具类别中查看页码和总页面元素。现在只需拖放到要打印页码的位置即可。

答案 1 :(得分:0)

首先,您需要在主raport页面中向页脚添加文本字段,表达式应为:$V{PAGE_NUMBER}+" /" 然后在第一个旁边添加其他文本字段,表达式应为:" " + $V{PAGE_NUMBER}这将如下所示:1/2 但重要的是那个;

  1. 设置第一个文本字段评估时间:" 现在"来自物业 窗口。
  2. 设置第二个文本字段评估时间:" 报告"从 属性窗口。
  3. 然后,在子报告页面上正确查看这些页码; 单击并选择左侧“报表检查器”窗口顶部的主报表名称。 确保选中并从属性窗口中选择了此选项:

      

    页眉和页脚的摘要

    这将使您的子报表正确显示页码。 确保您的子报表具有汇总带以获得结果。

    无需将参数传递给子报表,甚至无需将这些文本字段添加到子报表页面以显示页码。

    子报告将自动识别页码。

答案 2 :(得分:0)

您可以使用$ V {PAGE_NUMBER}变量,但是在有子报表的情况下,它可以为您提供当前的子报表页码或全部的子报表。报告页数。问题在于Jasper Reports不能直接允许您将当前页码从主报告传递到子报告。

一种简单的解决方案是仅包含在主报表中打印当前页码的功能。由于您失去了管理每个子报表中打印页码的详细信息的能力,因此这行得通,但不是灵活的方式。

最终,我提出了使用脚本的更好的解决方案。主要思想是将包含必要信息的scriptlet实例传递给子报表。

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"/>

子报告中,从脚本中检索页码

 <textFieldExpression><![CDATA["($P{pg_num}.getPageNum())"]]></textFieldExpression>