0

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

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

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

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

4

2 回答 2

0

唉,这不支持 BIRT。

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

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

于 2015-04-29T06:27:37.593 回答
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 添加页面变量。

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

于 2015-04-29T13:21:32.023 回答