【问题标题】:How to restart page number from 1 in different group of BIRT report如何在不同组的 BIRT 报告中从 1 重新开始页码
【发布时间】:2015-07-06 17:12:31
【问题描述】:

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

所有程序都在“布局”中,“母版页”中没有程序。 有 1 个“数据集”。 “布局”中的字段参考此 DS。 “布局”中有组,按一个字段分组。 在“组页眉”中,我创建了一个单元格用作页码。 “页面:MyPageNumber”。 “MyPageNumber”是我定义的一个字段,它会在组标题中 +1。

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

问题: 据我所知,水晶报表中有“重新开始组中的页码”。如何在 BIRT 中重新启动页面? 我想在 1 个报告文件中显示不同组的数据,每个组的页码从 1 开始。

【问题讨论】:

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


    【解决方案1】:

    唉,BIRT 不支持这个。

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

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

    【讨论】:

    • 感谢您的解决方案。请问您“让BIRT根据分组生成PDF大纲”的想法是使用BIRT API生成PDF吗?如果是的话,你能帮忙分享一些详细的代码吗?你能帮忙建议在哪里使用 PDFPostProcessor 吗?
    • 抱歉这么晚的回复:不需要“编程”,这是报表设计器 IDE 的一个功能:如果您使用组,BIRT 默认会自动生成 PDF 大纲。然后,TOC 级别表示组的嵌套级别。您也可以手动添加 TOC 条目(参见布局项目的“目录”属性)。关于 PDFPostProcessor:请注意,我们没有使用 WebViewer,而是使用 RunAndRenderTask 调用 BIRT 生成的 PDF。任务完成后,BIRT 已生成 PDF。然后我们使用 iText 修改这个 PDF。
    【解决方案2】:

    您可以使用页面变量来处理 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 添加页面变量。

    查看这些链接以获取有关 BIRT 页面变量的更多信息:

    【讨论】:

    • 应该注意的是,页面变量只能在单独的 RunTask 和 RenderTask 中按预期工作,您通常不想使用它们,因为它会对性能产生负面影响,而且它显然存在分页错误.
    • @user3660637 感谢您的解决方案。将这些代码应用于我的 BIRT 报告后,当我将“GROUP_PAGE”放入“母版页”-> 标题-> 网格-> 测试(HTML)-> 时,它可以显示每个组的总页码GROUP_PAGE。它仍然无法为每个组显示 1、2、...。例如,我有 2 个组(A 组有 3 页,B 组有 2 页)。当我像上面提到的那样输入“GROUP_PAGE”时,我可以在A组的每个页面中看到3,在B组的每个页面中看到2。页码显示为3、3、3、2、2。你能帮忙吗?建议如何让它们显示为 1、2、3、1、2?
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多