Jasper reports 如何在主报表和子报表之间添加页码

Jasper reports 如何在主报表和子报表之间添加页码,jasper-reports,subreport,Jasper Reports,Subreport,我有一个要求,我需要显示当前页码和总页码的会计报表。我有一份主报告和两份子报告。我无法确定如何在主报表和子报表中显示正确的页码。 如果你能帮助我,那就太好了。 谢谢打开Ireport并转到窗口->调色板选项,在这里您可以看到工具类别中的页码和总页面元素。现在,只需将鼠标拖放到要打印页码的位置。打开Ireport并转到“窗口->调色板”选项,您可以在“工具”类别中看到页码和总页面元素。现在只需拖放到要打印页码的位置。首先,您需要在主raport页面的页脚中添加一个文本字段,表达式应该是:$V{pa

我有一个要求,我需要显示当前页码和总页码的会计报表。我有一份主报告和两份子报告。我无法确定如何在主报表和子报表中显示正确的页码。 如果你能帮助我,那就太好了。
谢谢

打开Ireport并转到窗口->调色板选项,在这里您可以看到工具类别中的页码和总页面元素。现在,只需将鼠标拖放到要打印页码的位置。

打开Ireport并转到“窗口->调色板”选项,您可以在“工具”类别中看到页码和总页面元素。现在只需拖放到要打印页码的位置。

首先,您需要在主raport页面的页脚中添加一个文本字段,表达式应该是:
$V{page\u NUMBER}+“/”
然后在第一个文本字段旁边添加另一个文本字段,表达式应该是:
”+$V{PAGE_NUMBER}
这看起来像这样:1/2 但重要的是,

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

    带有页眉和页脚的摘要

    这将使子报表正确显示页码。 确保您的子报表具有摘要栏以获取结果

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


    子报表将自动识别页码

    首先,您需要在主raport页面的页脚中添加一个文本字段,表达式应该是:
    $V{page\u NUMBER}+“/”
    然后在第一个文本字段旁边添加另一个文本字段,表达式应该是:
    ”+$V{PAGE_NUMBER}
    这看起来像这样:1/2 但重要的是,

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

    带有页眉和页脚的摘要

    这将使子报表正确显示页码。 确保您的子报表具有摘要栏以获取结果

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


    子报表将自动识别页码

    您可以使用$V{PAGE_NUMBER}变量,但对于子报表,它只提供当前子报表页码或子报表总页数。问题是Jasper Reports不允许您直接将当前页码从主报表传递到子报表

    简单的解决方案是,只需将打印主报告中当前页码的功能合并在一起。这是可行的,但并不灵活,因为您失去了管理每个子报表中打印页码的详细信息的能力

    最终,我利用Scriptlet提出了更好的解决方案。主要思想是将包含必要信息的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;
    }}
    
    在主报告中,将
    scriptletClass=“my.example.ExampleScriptlet”
    放入jasperReport标记中

    在主报表的子报表部分,将scriptlet的实例传递给子报表

    <subreportParameter name="pg_num" ><subreportParameterExpression>
                    $P{REPORT_SCRIPTLET}.getScriptlet()
                </subreportParameterExpression> </subreportParameter>
    
    
    $P{REPORT_SCRIPTLET}.getScriptlet()
    
    在子报表中声明scriptlet参数

    <subreportParameter name="pg_num" ><subreportParameterExpression>
                    $P{REPORT_SCRIPTLET}.getScriptlet()
                </subreportParameterExpression> </subreportParameter>
    
    
    
    在子报表中,从scriptlet检索页码

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

    您可以使用$V{PAGE_NUMBER}变量,但对于子报表,它只提供当前子报表页码或子报表总页数。问题是Jasper Reports不允许您直接将当前页码从主报表传递到子报表

    简单的解决方案是,只需将打印主报告中当前页码的功能合并在一起。这是可行的,但并不灵活,因为您失去了管理每个子报表中打印页码的详细信息的能力

    最终,我利用Scriptlet提出了更好的解决方案。主要思想是将包含必要信息的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;
    }}
    
    在主报告中,将
    scriptletClass=“my.example.ExampleScriptlet”
    放入jasperReport标记中

    在主报表的子报表部分,将scriptlet的实例传递给子报表

    <subreportParameter name="pg_num" ><subreportParameterExpression>
                    $P{REPORT_SCRIPTLET}.getScriptlet()
                </subreportParameterExpression> </subreportParameter>
    
    
    $P{REPORT_SCRIPTLET}.getScriptlet()
    
    在子报表中声明scriptlet参数

    <subreportParameter name="pg_num" ><subreportParameterExpression>
                    $P{REPORT_SCRIPTLET}.getScriptlet()
                </subreportParameterExpression> </subreportParameter>
    
    
    
    在子报表中,从scriptlet检索页码

     <textFieldExpression><![CDATA["($P{pg_num}.getPageNum())"]]></textFieldExpression>
    
    
    
    谢谢你的回答。但我担心您给出的解决方案只适用于简单的报告。我已经意识到,当我们希望在子报告页面上包含页码时,简单的拖放操作不起作用。如果需要提供更多信息,请告诉我。谢谢您的回答。但是我担心你给出的解决方案只适用于简单的报告。我已经意识到,当我们需要页面时,简单的拖放是不起作用的