背景: 使用Java + BIRT生成报告。 在查看器中生成报告,并允许用户选择将其导出为不同的格式(pdf,xls,word ...)。
所有节目都在"布局","母版页"中没有节目。 有1"数据集"。 "布局"中的字段参考这个DS。 在一个字段中有"布局",gropu。 在" Group Header"中,我创建了一个用作页码的单元格。 "页面:MyPageNumber"。 " MyPageNumber"是我定义的字段,它将在组标题中+1。
问题: 当我使用第一种方法生成报告时," MyPageNumber"无法正确显示。因为组头只为每个组加载一次。它总是显示1。
问题: 据我所知,"重新启动组中的页码"在Crystal报道中。如何在BIRT中重启页面? 我想在1个报告文件中显示不同组的数据,并且每个组的页码从1开始。
答案 0 :(得分:0)
唉,BIRT不支持。
这可能不是你所希望的答案,但这是事实。 这是BIRT远远落后于其他报告生成器工具的极少数方面之一。
但是,根据您将BIRT集成到您的环境中的方式,我们在解决方案中使用的PDF导出可以采用解决方法并取得巨大成功。 我们的想法是让BIRT根据分组生成PDF大纲。 BIRT报告在ReportContext中创建有关在何处以及如何显示页码的信息。 在BIRT生成PDF之后,自定义PDFPostProcessor使用PDF大纲和ReportContext中的信息来添加带有iText的页码。 如果这种解决办法适合您,请随时与我联系。
答案 1 :(得分:0)
您可以使用页面变量对BIRT报告执行此操作。例如:
在报告beforeFactory中添加脚本:
prevGroupKey = "";
groupPageNumber = 1;
reportContext.setGlobalVariable("gGROUP_NAME", "");
reportContext.setGlobalVariable("gGROUP_PAGE", 1);
在onPageEnd报告中添加脚本:
var groupKey = currGroup;
var prevGroupKey = reportContext.getGlobalVariable("gGROUP_NAME");
var groupPageNumber = reportContext.getGlobalVariable("gGROUP_PAGE");
if( prevGroupKey == null ){
prevGroupKey = "";
}
if (prevGroupKey == groupKey)
{
if (groupPageNumber != null)
{
groupPageNumber = parseInt(groupPageNumber) + 1;
}
else {
groupPageNumber = 1;
}
}
else {
groupPageNumber = 1;
prevGroupKey = groupKey;
}
reportContext.setPageVariable("GROUP_NAME", groupKey);
reportContext.setPageVariable("GROUP_PAGE", groupPageNumber);
reportContext.setGlobalVariable("gGROUP_NAME", groupKey);
reportContext.setGlobalVariable("gGROUP_PAGE", groupPageNumber);
var groupTotalPage = reportContext.getPageVariable("GROUP_TOTAL_PAGE");
if (groupTotalPage == null)
{
groupTotalPage = new java.util.HashMap();
reportContext.setPageVariable("GROUP_TOTAL_PAGE", groupTotalPage);
}
groupTotalPage.put(groupKey, groupPageNumber);
在主页上的onRender脚本中添加以下脚本:
var totalPage = reportContext.getPageVariable("GROUP_TOTAL_PAGE");
var groupName = reportContext.getPageVariable("GROUP_NAME");
if (totalPage != null)
{
this.text = java.lang.Integer.toString(totalPage.get(groupName));
}
在表组标题onCreate事件中,添加以下脚本,将“COUNTRY”替换为您要分组的列的名称:
currGroup = this.getRowData().getColumnValue("COUNTRY");
查看这些链接,了解有关BIRT页面变量的更多信息: