[]
按页面数据分页的方式,适合生成固定格式呈现的报表,例如发票,其需要以特定数据字段进行分组。
请注意,只有 TemplateOptions.PaginationMode 设置为 true,开启分页模式后,才可以使用按页面数据分页。
按页面数据分页,需要使用 CountPerPage 属性显示指定每一页,数据区域所最大包含的数据数量,在填充时,则会根据最大包含数据量,来判断创建新的工作表,以填充分页后的数据。
假如,生成一个发票报表,发票的格式如下图所示。
希望导出的结果如下(下图是第一页和第二页的发票结果):
发票要完整的显示在一个页面中,清单数据的表格大小是固定的 (A16 : L26)。
当数据超出表格范围时,则新建一张发票页面用来填充。
每一个页面会包含在一个工作表中。
希望能知道当前发票是第几页,总共有几页发票
为了满足以上示例,以及该场景下的其他需求,GcExcel 模板提供以下属性及方法:
属性:
CountPerPage
RepeatType
RepeatWithGroup
NoRepeatAction
方法:
PageCount
PageNumber
语法:
Integer:数字表示一页最多能显示的数据行数,例如 10,表示最多为10行数据
*:当值为 * 时,只要纸张上有可用空间,就可以继续填充单元格。
当使用 CountPerPage 属性后,模板在展开时如果超过属性所指定的值,会创建具有相同布局的新页面(包括页眉和页脚)。CountPerPage 所判断的数据量,会因为 Group 的属性而不同,当 Group 属性为 List(没有合并时),则判断的是数据量的记录数。如果 Group 属性为 Normal,Merge 或 Repeat,则 CountPerPage 判断的是分组数。
如下图所示:左边以分组数计算,合并后的两行 '展示贴纸-红' 数据仅会被计算 1 行,但右边以记录数作为计算时,没有合并的 '展示贴纸-红' 会被算做 2 行。
注意:
一个工作表中的仅有一个单元格可以设置 CountPerPage 属性。
实现 CountPerPage 时,将忽略按纸张大小分页。
当 CountPerPage(CP) 的值设置为 '*' 时,FillMode(FM) 只能设置为 Insert。
当单元格的 FillMode 属性设置为 Overwrite 且 CountPerPage 属性有值时,则无需设置 FillRange 属性,GcExcel 将根据 CountPerPage 的值来判断。
示例:
结果如下(图中仅包含第一页和第二页):
语法:
RepeatType 表示当前单元格及其子孙单元格,在分页时的重复显示的方式。
PerPage(默认值):区域的值在每页都显示
FirstPage:区域的值在仅在第一页出现
LastPage:区域的值在仅在最后一页出现
示例:
如下图所示,在 F6 单元格,设置了 {{(R=A6:L15, RepeatType = FirstPage)}} 在第一页显示 A6:L15 的内容,在 A19 单元格设置了 {{(R=A19:L26, RepeatType = LastPage)}} 在最后一页显示 A19:L26 的内容。
结果如下,仅第一页和最后一页会显示重复区域:
语法:
在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)}}
结果如下,可以看到四个页面分为两组,并且按组显示重复的区域:
语法:
通过RepeatType 和 RepeatWithGroup,可以控制区域的重复显示,但是当不显示时,其默认会留空。
NoRepeatAction 属性则可以当重复内容未显示在当前页面上时,如何处理它们。
ClearCells (默认值): 如果单元格不重复,其值和格式将自动删除。
DeleteRows: 如果单元格不重复,则其所在行将被删除。
DeleteColumns: 如果单元格不重复,则其所在列将被删除。
示例:
在RepeatType的基础上进行修改如下图,F6 改为 {{(R=A6:L15, RepeatType = FirstPage, NoRepeatAction = DeleteRows)}},A19 改为 {{(R=A19:L26, RepeatType = LastPage, NoRepeatAction = DeleteRows)}}
结果如下,每一页重复区域没有显示的部分,按行删除掉了,每一页的内容更为紧凑:
语法:
PageNumber 表示当前页是第几页,如果指定单元格,将以目标单元格的分组来判断当前是第几页。如果为空,即表示当前为整个工作簿的第几页。
示例:
在 J3 中设置了 {{=PageNumber(A3)}} ,在 L3 设置了 {{=PageNumber()}} 。
结果如下,一共生成 4 个sheet,即 4 个页面,两个分组,每个分组共 2 页:
语法:
PageCount 表示当前一共有几页,如果指定单元格,将以目标单元格的分组来判断当前总页数。如果为空,即表示整个工作簿一共有多少页。
示例:
在 J4 中设置了 {{=PageCount(A3)}} ,在 L4 设置了 {{=PageCount()}}。
结果如下,一共生成 4 个sheet,即 4 个页面,两个分组,每个分组共 2 页。
限制:
PageNumber 和 PageCount 函数不能与其他方法如 Count 或 Sum 等混合使用。