Вы можете использовать переменную $ 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.
В разделе подчиненного отчета основного отчета передать экземпляр сценария в подчиненный отчет
<subreportParameter name="pg_num" ><subreportParameterExpression>
$P{REPORT_SCRIPTLET}.getScriptlet()
</subreportParameterExpression> </subreportParameter>
Объявить параметр скриптлета в подчиненном элементе .отчет
<parameter name="pg_num" class="my.example.ExampleScriptlet"/>
В подотчете получить номер страницы из скриптлета
<textFieldExpression><![CDATA["($P{pg_num}.getPageNum())"]]></textFieldExpression>