ReoGrid 支持行和列的大纲(分组),允许您折叠和展开工作表的各个部分。这对于组织层次数据、创建可折叠区域和构建汇总视图非常有用。

添加大纲
分组行或列
// 从第 3 行开始分组 5 行
sheet.GroupRows(3, 5);
// 从第 5 列开始分组 2 列
sheet.GroupColumns(5, 2);
// 使用 RowOrColumn 标志的通用方法
sheet.AddOutline(RowOrColumn.Row, 3, 5);
sheet.AddOutline(RowOrColumn.Column, 5, 2);
AddOutline 和 GroupRows/GroupColumns 方法会返回创建的大纲实例:
var outline = sheet.GroupRows(3, 5);
嵌套大纲
大纲最多可以嵌套 10 层。每一层在大纲面板中显示为一个单独的分组:
// 第 1 层:分组第 2-8 行
sheet.GroupRows(2, 7);
// 第 2 层:子分组第 3-5 行
sheet.GroupRows(3, 3);
异常
AddOutline 可能抛出以下异常:
| 异常 | 描述 |
|---|---|
OutlineIntersectedException | 大纲与同一层级的现有大纲重叠 |
OutlineAlreadyDefinedException | 已存在相同的大纲 |
OutlineTooMuchException | 已达到最大 10 层大纲限制 |
OutlineOutOfRangeException | 位置超出工作表范围(最后一行/列不能包含在内) |
折叠和展开
通过大纲实例
var outline = sheet.GroupRows(3, 5);
outline.Collapse(); // 折叠(隐藏分组的行)
outline.Expand(); // 展开(显示分组的行)
// 检查状态
bool isCollapsed = outline.Collapsed;
通过工作表方法
通过起始位置和数量指定大纲:
sheet.CollapseOutline(RowOrColumn.Row, 3, 5);
sheet.ExpandOutline(RowOrColumn.Row, 3, 5);
如果没有匹配的大纲,这些方法将返回大纲实例或抛出 OutlineNotFoundException。
折叠/展开分组层级中的所有大纲
// 获取特定大纲分组层级(从零开始)
var group = sheet.GetOutlineGroup(RowOrColumn.Row, 0); // 第 0 层
group.CollapseAll();
group.ExpandAll();
移除大纲
移除特定大纲
// 按位置和数量
sheet.RemoveOutline(RowOrColumn.Row, 3, 5);
// 按实例
sheet.RemoveOutline(outline);
// 使用简写方法
sheet.UngroupRows(3, 5);
sheet.UngroupColumns(5, 2);
移除所有大纲
// 移除所有行大纲
sheet.UngroupAllRows();
// 移除所有列大纲
sheet.UngroupAllColumns();
访问大纲
获取特定大纲
var outline = sheet.GetOutline(RowOrColumn.Row, 3, 5);
if (outline != null)
{
Console.WriteLine($"Outline: {outline.Start} to {outline.End}, collapsed: {outline.Collapsed}");
}
访问大纲集合
// 获取行大纲集合
var rowOutlines = sheet.RowOutlines;
// 获取列大纲集合
var colOutlines = sheet.ColumnOutlines;
// 按标志获取大纲集合
var outlines = sheet.GetOutlines(RowOrColumn.Row);
// 获取大纲分组层级数量
int levels = sheet.GetOutlineGroupCount(RowOrColumn.Row);
遍历所有大纲
sheet.IterateOutlines(RowOrColumn.Row, (group, outline) =>
{
Console.WriteLine($"Outline: rows {outline.Start}–{outline.End}, collapsed: {outline.Collapsed}");
return true; // 继续遍历
});
大纲属性
IOutline / BaseOutline 属性
| 属性 | 类型 | 描述 |
|---|---|---|
Start | int | 起始行/列索引 |
Count | int | 大纲中的行/列数量 |
End | int | 结束索引(Start + Count) |
Collapsed | bool | 大纲是否已折叠 |
Worksheet | Worksheet | 父工作表 |
IsVisibleToUser | bool | 大纲是否对用户可见 |
GroupRowIndex | int | 分组汇总行的索引 |
RowOutline 特有属性
| 属性 | 类型 | 描述 |
|---|---|---|
Row | int | 起始行索引(同 Start) |
Rows | int | 行数(同 Count) |
EndRow | int | 结束行索引 |
ColumnOutline 特有属性
| 属性 | 类型 | 描述 |
|---|---|---|
Col | int | 起始列索引(同 Start) |
Cols | int | 列数(同 Count) |
EndCol | int | 结束列索引 |
大纲按钮位置
控制展开/折叠按钮显示在分组行的上方还是下方:
// 按钮在底部(默认)
sheet.OutlineButtonLocation = OutlineButtonLocation.Bottom;
// 按钮在顶部
sheet.OutlineButtonLocation = OutlineButtonLocation.Top;
分组行样式
自定义每个大纲的汇总行外观:
// 获取特定行的分组行样式
var style = sheet.GetGroupRowStyle(3);
// 尝试获取分组行样式(未找到时返回 false)
if (sheet.TryGetGroupRowStyle(3, out var groupStyle))
{
// 使用 groupStyle
}
// 获取分组行边框样式
var borderStyle = sheet.GetGroupRowBorderStyle(3);
borderStyle.Style = BorderLineStyle.Solid;
borderStyle.Color = new SolidColor(Color.Gray);
您也可以直接从大纲实例访问样式:
var outline = sheet.GroupRows(3, 5);
// 设置分组行样式
outline.GroupRowStyle.Flag = PlainStyleFlag.FillColor;
outline.GroupRowStyle.BackColor = Color.LightYellow;
// 设置分组行边框样式
outline.GroupRowBorderStyle.Style = BorderLineStyle.Dashed;
outline.GroupRowBorderStyle.Color = new SolidColor(Color.LightGray);
自动折叠和展开
如果展开的大纲的最后一行被隐藏或高度设为零,大纲会自动折叠。如果折叠的大纲中有任何行变为可见,大纲会自动展开。此行为无法禁用,但折叠/展开事件仍然会触发。

调整行高后:

自动移除
如果大纲内的所有行或列都被删除,大纲会被自动移除。在这种情况下会触发 OutlineRemoved 事件。
事件
工作表级事件
| 事件 | 事件参数 | 描述 |
|---|---|---|
OutlineAdded | OutlineAddedEventArgs | 大纲已添加 |
OutlineRemoved | OutlineRemovedEventArgs | 大纲已移除 |
BeforeOutlineCollapse | BeforeOutlineCollapseEventArgs | 大纲折叠前(可取消) |
AfterOutlineCollapse | AfterOutlineCollapseEventArgs | 大纲折叠后 |
BeforeOutlineExpand | BeforeOutlineExpandingEventArgs | 大纲展开前(可取消) |
AfterOutlineExpand | AfterOutlineExpandingEventArgs | 大纲展开后 |
事件参数属性
所有事件参数都继承自 OutlineEventArgs:
Outline(IOutline) — 触发事件的大纲
BeforeOutlineCollapseEventArgs 和 BeforeOutlineExpandingEventArgs 额外包含:
IsCancelled(bool) — 设置为true以阻止操作
工作表事件示例
sheet.OutlineAdded += (s, e) =>
{
Console.WriteLine($"Outline added: {e.Outline.Start} to {e.Outline.End}");
};
sheet.OutlineRemoved += (s, e) =>
{
Console.WriteLine($"Outline removed: {e.Outline.Start} to {e.Outline.End}");
};
sheet.BeforeOutlineCollapse += (s, e) =>
{
Console.WriteLine("Before collapse");
// e.IsCancelled = true; // 阻止折叠
};
sheet.AfterOutlineCollapse += (s, e) =>
{
Console.WriteLine("After collapse");
};
sheet.BeforeOutlineExpand += (s, e) =>
{
Console.WriteLine("Before expand");
};
sheet.AfterOutlineExpand += (s, e) =>
{
Console.WriteLine("After expand");
};
大纲实例事件
每个大纲实例也会触发自己的事件:
var outline = sheet.GroupRows(3, 5);
outline.BeforeCollapse += (s, e) =>
{
Console.WriteLine("Instance: before collapse");
// e.IsCancelled = true;
};
outline.AfterCollapse += (s, e) =>
{
Console.WriteLine("Instance: after collapse");
};
outline.BeforeExpand += (s, e) =>
{
Console.WriteLine("Instance: before expand");
};
outline.AfterExpand += (s, e) =>
{
Console.WriteLine("Instance: after expand");
};
阻止折叠/展开
使用 before 事件上的 IsCancelled 属性:
sheet.BeforeOutlineCollapse += (s, e) => e.IsCancelled = true;
隐藏大纲面板
隐藏大纲 UI 以阻止用户交互,同时仍允许编程控制:
// 隐藏行和列大纲面板
sheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, false);
sheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, false);

当面板隐藏时,大纲仍可通过编程方式控制:
var outline1 = sheet.GroupRows(1, 3);
outline1.Collapse();
var outline2 = sheet.GroupRows(5, 2);
outline2.Collapse();
重新显示大纲面板:
sheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, true);
sheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, true);
使用操作(撤销/重做支持)
大纲操作可以通过操作来执行,以支持撤销/重做:
// 添加大纲(支持撤销)
sheet.DoAction(new AddOutlineAction(RowOrColumn.Row, 3, 5));
// 移除大纲(支持撤销)
sheet.DoAction(new RemoveOutlineAction(RowOrColumn.Row, 3, 5));
// 折叠/展开(支持撤销)
sheet.DoAction(new CollapseOutlineAction(RowOrColumn.Row, 3, 5));
sheet.DoAction(new ExpandOutlineAction(RowOrColumn.Row, 3, 5));