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>
谢谢你的回答。但我担心您给出的解决方案只适用于简单的报告。我已经意识到,当我们希望在子报告页面上包含页码时,简单的拖放操作不起作用。如果需要提供更多信息,请告诉我。谢谢您的回答。但是我担心你给出的解决方案只适用于简单的报告。我已经意识到,当我们需要页面时,简单的拖放是不起作用的