[]
        
(Showing Draft Content)

按页面数据分页

概述

按页面数据分页的方式,适合生成固定格式呈现的报表,例如发票,其需要以特定数据字段进行分组。

请注意,只有 TemplateOptions.PaginationMode 设置为 true,开启分页模式后,才可以使用按页面数据分页。

按页面数据分页

按页面数据分页,需要使用 CountPerPage 属性显示指定每一页,数据区域所最大包含的数据数量,在填充时,则会根据最大包含数据量,来判断创建新的工作表,以填充分页后的数据。

假如,生成一个发票报表,发票的格式如下图所示。

image

希望导出的结果如下(下图是第一页和第二页的发票结果):

  • 发票要完整的显示在一个页面中,清单数据的表格大小是固定的 (A16 : L26)。

  • 当数据超出表格范围时,则新建一张发票页面用来填充。

  • 每一个页面会包含在一个工作表中。

  • 希望能知道当前发票是第几页,总共有几页发票

image

为了满足以上示例,以及该场景下的其他需求,GcExcel 模板提供以下属性及方法:

属性:

  • CountPerPage

  • RepeatType

  • RepeatWithGroup

  • NoRepeatAction

方法:

  • PageCount

  • PageNumber

CountPerPage 属性

语法:

image

  • Integer:数字表示一页最多能显示的数据行数,例如 10,表示最多为10行数据

  • *:当值为 * 时,只要纸张上有可用空间,就可以继续填充单元格。

当使用 CountPerPage 属性后,模板在展开时如果超过属性所指定的值,会创建具有相同布局的新页面(包括页眉和页脚)。CountPerPage 所判断的数据量,会因为 Group 的属性而不同,当 Group 属性为 List(没有合并时),则判断的是数据量的记录数。如果 Group 属性为 Normal,Merge 或 Repeat,则 CountPerPage 判断的是分组数。

如下图所示:左边以分组数计算,合并后的两行 '展示贴纸-红' 数据仅会被计算 1 行,但右边以记录数作为计算时,没有合并的 '展示贴纸-红' 会被算做 2 行。

image

注意:

  • 一个工作表中的仅有一个单元格可以设置 CountPerPage 属性。

  • 实现 CountPerPage 时,将忽略按纸张大小分页。

  • 当 CountPerPage(CP) 的值设置为 '*' 时,FillMode(FM) 只能设置为 Insert

  • 当单元格的 FillMode 属性设置为 OverwriteCountPerPage 属性有值时,则无需设置 FillRange 属性,GcExcel 将根据 CountPerPage 的值来判断。

示例:

image

结果如下(图中仅包含第一页和第二页):

image

RepeatType 属性

语法:

image

RepeatType 表示当前单元格及其子孙单元格,在分页时的重复显示的方式。

  • PerPage(默认值):区域的值在每页都显示

  • FirstPage:区域的值在仅在第一页出现

  • LastPage:区域的值在仅在最后一页出现

示例:

如下图所示,在 F6 单元格,设置了 {{(R=A6:L15, RepeatType = FirstPage)}} 在第一页显示 A6:L15 的内容,在 A19 单元格设置了 {{(R=A19:L26, RepeatType = LastPage)}} 在最后一页显示 A19:L26 的内容。

image

结果如下,仅第一页和最后一页会显示重复区域:

Animation

RepeatWithGroup 属性

语法:

image

在RepeatType的例子中,标记了RepeatType的区域,仅出现在了第一页和最后一页。如果配合 RepeatWithGroup 属性,则可以使 RepeatType 的区域按分组来起效果。

RepeatWithGroup 指定的单元格,将决定分组情况,与 RepeatType 配合使用有如下规则:

  • 如果 RepeatType = PerPage, RepeatWithGroup 设置没有效果,单元格区域将在所有页面上重复.

  • 如果 RepeatType = FirstPage 或 LastPage 未指定 RepeatWithGroup, 重复区域仅显示在整个工作簿的第一页或最后一页。

  • 如果 RepeatType = FirstPage 或 LastPage, 并指定 RepeatWithGroup, 每个组的第一页或最后一页上呈现重复区域.

示例:

修改 RepeatType 的示例如下图,F6 修改为 {{(R=A6:L15, RepeatType = FirstPage, RepeatWithGroup = A3)}},A19 修改为 {{(R=A19:L26, RepeatType = LastPage, , RepeatWithGroup = A3)}}

image

结果如下,可以看到四个页面分为两组,并且按组显示重复的区域:

Animation

NoRepeatAction 属性

语法:

image

通过RepeatType 和 RepeatWithGroup,可以控制区域的重复显示,但是当不显示时,其默认会留空。

NoRepeatAction 属性则可以当重复内容未显示在当前页面上时,如何处理它们。

  • ClearCells (默认值): 如果单元格不重复,其值和格式将自动删除。

  • DeleteRows: 如果单元格不重复,则其所在行将被删除。

  • DeleteColumns: 如果单元格不重复,则其所在列将被删除。

示例:

在RepeatType的基础上进行修改如下图,F6 改为 {{(R=A6:L15, RepeatType = FirstPage, NoRepeatAction = DeleteRows)}},A19 改为 {{(R=A19:L26, RepeatType = LastPage, NoRepeatAction = DeleteRows)}}

image

结果如下,每一页重复区域没有显示的部分,按行删除掉了,每一页的内容更为紧凑:

Animation

PageNumber 函数

语法:

image

PageNumber 表示当前页是第几页,如果指定单元格,将以目标单元格的分组来判断当前是第几页。如果为空,即表示当前为整个工作簿的第几页。

示例:

在 J3 中设置了 {{=PageNumber(A3)}} ,在 L3 设置了 {{=PageNumber()}} 。

image

结果如下,一共生成 4 个sheet,即 4 个页面,两个分组,每个分组共 2 页:

image

PageCount 函数

语法:

image

PageCount 表示当前一共有几页,如果指定单元格,将以目标单元格的分组来判断当前总页数。如果为空,即表示整个工作簿一共有多少页。

示例:

在 J4 中设置了 {{=PageCount(A3)}} ,在 L4 设置了 {{=PageCount()}}。

image

结果如下,一共生成 4 个sheet,即 4 个页面,两个分组,每个分组共 2 页。

image

限制:

PageNumber 和 PageCount 函数不能与其他方法如 Count 或 Sum 等混合使用。