如何通过代码创建电子表格多分组并设置打开时默认折叠
问题
我想创建一个带多组汇总行的电子表格,要求打开工作簿时所有汇总行默认处于折叠状态。之前试过SummaryRows()方法,但它会把整个表格合并成一个由单个按钮控制的分组。下面的代码能正确设置所有分组,但默认都是展开状态:
// 初始化行索引 var currentRow = 1; // 遍历包含多个分组的集合 for (var x in arr_x) { // 跳过一行作为分组标题行 currentRow += 1; // 设置当前分组的起始行 var startRow = currentRow; // 遍历当前分组下的项 foreach (var y in x.arr_y) { // 处理表格内容 currentRow++; } // 获取当前分组的最后一行 var endRow = currentRow - 1; // 对行进行分组 sheet.Cells[$"{startRow}:{endRow}"].Rows.Group(); } // 将折叠/展开按钮放在分组上方 sheet.Outline.SummaryRow = SummaryRow.Above;
我想要的最终结构:
默认折叠状态:
+ | 分组1 + | 分组2 + | 分组3
展开某一组后:
- | 分组1 | 项1 | 项2 | 项3 + | 分组2 + | 分组3
解决方案
要让所有分组默认处于折叠状态,只需在现有代码末尾添加Outline.CollapseAll()方法调用即可。修改后的代码如下:
// 初始化行索引 var currentRow = 1; // 遍历包含多个分组的集合 for (var x in arr_x) { // 跳过一行作为分组标题行 currentRow += 1; // 设置当前分组的起始行 var startRow = currentRow; // 遍历当前分组下的项 foreach (var y in x.arr_y) { // 处理表格内容 currentRow++; } // 获取当前分组的最后一行 var endRow = currentRow - 1; // 对行进行分组 sheet.Cells[$"{startRow}:{endRow}"].Rows.Group(); } // 将折叠/展开按钮放在分组上方 sheet.Outline.SummaryRow = SummaryRow.Above; // 折叠所有分组,设置默认状态 sheet.Outline.CollapseAll();
说明
Outline.CollapseAll()会一次性折叠所有已创建的分组,完全符合打开工作簿时所有分组默认折叠的需求。- 该操作仅修改分组的初始状态,不会改变分组结构,用户后续仍可单独展开任意分组。
内容的提问来源于stack exchange,提问作者S. Davenport
相关产品推荐
相关产品推荐

