如何在BIRT报告的不同组中重新启动1的页码

时间:2015-04-28 02:54:30

标签: java pdf-generation birt page-numbering birt-deapi

背景: 使用Java + BIRT生成报告。 在查看器中生成报告,并允许用户选择将其导出为不同的格式(pdf,xls,word ...)。

所有节目都在"布局","母版页"中没有节目。 有1"数据集"。 "布局"中的字段参考这个DS。 在一个字段中有"布局",gropu。 在" Group Header"中,我创建了一个用作页码的单元格。 "页面:MyPageNumber"。 " MyPageNumber"是我定义的字段,它将在组标题中+1。

问题: 当我使用第一种方法生成报告时," MyPageNumber"无法正确显示。因为组头只为每个组加载一次。它总是显示1。

问题: 据我所知,"重新启动组中的页码"在Crystal报道中。如何在BIRT中重启页面? 我想在1个报告文件中显示不同组的数据,并且每个组的页码从1开始。

2 个答案:

答案 0 :(得分:0)

唉,BIRT不支持。

这可能不是你所希望的答案,但这是事实。 这是BIRT远远落后于其他报告生成器工具的极少数方面之一。

但是,根据您将BIRT集成到您的环境中的方式,我们在解决方案中使用的PDF导出可以采用解决方法并取得巨大成功。 我们的想法是让BIRT根据分组生成PDF大纲。 BIRT报告在ReportContext中创建有关在何处以及如何显示页码的信息。 在BIRT生成PDF之后,自定义PDFPostProcessor使用PDF大纲和ReportContext中的信息来添加带有iText的页码。 如果这种解决办法适合您,请随时与我联系。

答案 1 :(得分:0)

您可以使用页面变量对BIRT报告执行此操作。例如:

  1. 添加2个页面变量... Group_page,Group_name。
  2. 添加1个报告变量... Group_total_page。
  3. 在报告beforeFactory中添加脚本:

    prevGroupKey = "";
    groupPageNumber = 1;
    reportContext.setGlobalVariable("gGROUP_NAME", "");
    reportContext.setGlobalVariable("gGROUP_PAGE", 1);
    
  4. 在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);
    
  5. 在主页上的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));
    }
    
  6. 在表组标题onCreate事件中,添加以下脚本,将“COUNTRY”替换为您要分组的列的名称:

    currGroup = this.getRowData().getColumnValue("COUNTRY");
    
  7. 在母版页中,在页眉或页脚中添加网格,并为Group_page和Group_total_page添加自动文本变量。也可以为Group_name添加页面变量。
  8. 查看这些链接,了解有关BIRT页面变量的更多信息: