本帖最后由 Ellia.Duan 于 2024-1-30 17:36 编辑
在使用 GcExcel 模板的报表时,有一部分客户要求在输出报表达到指定行数后自动分页,且布局与第一页相同。
在此示例中https://demo.grapecity.com.cn/do ... /templatepagination,已经实现此分页功能,
设置下列代码后,再设置多条数据源
- Workbook workbook = new Workbook();
- InputStream templateFile = getResourceStream("xlsx/Template_Pagination_7.xlsx");
- workbook.open(templateFile);
- List<SalesItem> data = new ArrayList<SalesItem>();
- //#region Init Data
- data.add(new SalesItem("公司ABC", "11-111", "样品A1", 20, 100));
- data.add(new SalesItem("公司ABC", "11-111", "样品A2", 150, 400));
- data.add(new SalesItem("公司ABC", "11-111", "样品A3", 70, 200));
- data.add(new SalesItem("公司ABC", "11-111", "样品A4", 20, 100));
- data.add(new SalesItem("公司ABC", "11-111", "样品A5", 3, 90));
- data.add(new SalesItem("公司ABC", "11-111", "样品A6", 5, 300));
- data.add(new SalesItem("公司ABC", "11-111", "样品A7", 10, 1000));
- data.add(new SalesItem("公司ABC", "11-111", "样品A8", 20, 100));
- data.add(new SalesItem("公司ABC", "11-111", "样品A9", 150, 400));
- data.add(new SalesItem("公司ABC", "11-111", "样品A10", 70, 200));
- data.add(new SalesItem("公司ABC", "11-111", "样品A11", 20, 100));
- data.add(new SalesItem("公司ABC", "11-111", "样品A12", 3, 90));
- data.add(new SalesItem("公司ABC", "11-111", "样品A13", 5, 300));
- data.add(new SalesItem("公司ABC", "11-111", "样品A14", 10, 1000));
- data.add(new SalesItem("公司ABC", "11-111", "样品A15", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B1", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B2", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B3", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B4", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B5", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B6", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B7", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B8", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B9", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B10", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B11", 10, 1000));
- data.add(new SalesItem("公司XYZ", "22-222", "样品B12", 10, 1000));
- // Set PaginationMode is true
- workbook.getNames().add("TemplateOptions.PaginationMode", "true");
- // Add data source
- workbook.addDataSource("ds", data);
- // Invoke to process the template
- workbook.processTemplate();
- // Save to an excel file
- workbook.save("TemplatePagination.xlsx");
复制代码 添加一个自定义名称TemplateOptions.PaginationMode并将它的值设置为True可以开启分页模式。
实现效果如下:从下图中可以看出,此四个tab页,布局一致,只是内容不同。
但是如果用户想实现页眉只在第一页出现,页脚只在最后一页出现,是不是就实现不了呢?
在GxExcel v6.0中实现了下面这四种情况的智能分页。
1、输出报表明细到指定行数后,自动添加分页符和配置页眉/页脚的新页面
2、带格式的覆盖
3、不带格式的覆盖
4、报表输出到指定行数后,自动添加分页符
在开始详细介绍如何实现这四种功能之前,先讲一下模板布局,对布局有一个基础的认识后,才能更快了解其功能。
如上图所示:此内容可以分为Page Header,Group Header,Details Header,Group Footer,Page Footer及数据列表等。对布局有了基本认识后,介绍下分页属性:
- RepeatType: 枚举类型。 该值可以是 PerPage(默认)、 FirstPage、 LastPage。 设置该单元格及其子孙结点在当前组的显示位置。
- RepeatWithGroup: 单元格引用。设置该单元格及其子孙结点随指定单元格重复显示。
- NoRepeatAction: 枚举类型。 该值可以是 ClearCells (默认)、 DeleteRows、 DeleteColumns。 设置在该单元格及其子孙结点不需要在当前页显示时如何处理它们的方式。
介绍完分页属性后,下面开始分别介绍这四类案例。
案例一:设置页眉页脚不重复出现,在指定页面出现,同时不为其预留位置。
想要实现案例一的场景,需要用到RepeatType属性,设置其显示位置。同时设置不在该页的时候,如何处理方式,即删除不为其留位置。
设置以下单元格的属性: - A3: {{ds.customer(R=A1:L28)}}
- F6: {{(R=A6:L15, RepeatType = FirstPage, RepeatWithGroup =A3, NoRepeatAction = DeleteRows)}}
- A17:{{ds.product(CP=10)}}
- A19: {{(R=A19:L26, RepeatType = LastPage, RepeatWithGroup =A3, NoRepeatAction = DeleteRows)}}
此时模板如下图所示:
输出报表明细到指定行数后,自动添加分页符和配置页眉/页脚的新页面。具体如下:
每一页都显示Page Header、Details Header及制定行数的数据、Page Footer。
第一页显示Group Header。
最后一页显示Group Footer。
最后效果如下所示:
案例二:设置页眉页脚不重复出现,在指定页面出现,同时为其预留位置。
设置以下单元格的属性: - A3: {{ds.customer(R=A1:L37)}}
- F6: {{(R=A6:L14, RepeatType = FirstPage, RepeatWithGroup =A3)}}
- A17: {{ds.Product(CP = 10, FM=O)}}
- A28: {{(R=A28:L35, RepeatType = LastPage, RepeatWithGroup =A3)}}
此时模板如下图所示:
通过上述属性设置,可以发现案例二与案例一的区别在于,案例二在案例一的基础上,预留了10行数据的位置。同时也预留了Group Header与Group Footer位置,
即每一页每一部分的位置是固定的。即设置了NoRepeatAction为默认枚举值ClearCells 。 经过GcExcel分页后,结果如下:
案例三:覆盖样式
设置以下单元格的属性: - A3: {{ds.Company(R=A1:L48)}}
- F6: {{(R=A6:L14, RepeatType = FirstPage, RepeatWithGroup =A3)}}
- A17: {{ds.Product(CP = 20, FM=OF)}}
- A38: {{(R=A38:L45, RepeatType = LastPage, RepeatWithGroup =A3)}}
此时模板如下图所示:
案例三与案例二的区别在于FM=O,与FM=OF
属性“FillMode”,现在它有三个值:“Insert”,“Overwrite”,“ OverwriteWithFormat ”。 “ OverwriteWithFormat ”表示当模板单元格展开时,新实例将覆盖下面的单元格并从模板单元格复制样式并合并,旧值 “Overwrite”不复制样式并合并。 “ Overwrite ”的缩写形式是“O”。 “ OverwriteWithFormat ”的缩写形式是“OF”。 观察案例二与案例三的模板区别,在于A18到A36有没有设置table格式。 经过GcExcel分页后,结果如下:
案例四:按照页面大小分页
设置以下单元格的属性: - A3: {{ds.customer(R=A1:L28)}}
- F6: {{(R=A6:L15, RepeatType = FirstPage, RepeatWithGroup =A3, NoRepeatAction = DeleteRows)}}
- A17:{{ds.product(CP=*)}}
- A19: {{(R=A19:L26, RepeatType = LastPage, RepeatWithGroup =A3, NoRepeatAction = DeleteRows)}}
案例四与案例一的区别在于cp=20与cp=*
在V 6.0版本中增强属性“CountPerPage”, 它的值可以是“*”,表示这个模板单元格在每一页中的实例数不固定,只受页面大小的限制。如果页面空间允许,生成尽可能多的实例。
此时模板如下图所示:
经过GcExcel分页后,结果如下:
具体实现效果可以见附件中excel文件。
|