ReoGrid 中的范围由起始位置和大小定义。一个范围包含一个或多个单元格。范围可以相互交叉,范围与合并单元格不同(尽管范围可以被合并)。

ReoGrid 通过两种主要类型表示范围:
- RangePosition — 一个轻量级结构体,保存位置和大小信息。不绑定到任何工作表。
- ReferenceRange — 一个绑定到特定工作表的类,提供对数据、样式和操作的直接访问。
RangePosition
RangePosition 结构体存储用于标识范围的数值信息:起始行、起始列、行数和列数。所有索引从零开始。
// 从地址字符串创建
var range = new RangePosition("C5:H14");
// 从行、列、行数、列数创建
var range = new RangePosition(4, 2, 10, 6);
// 从起始和结束位置创建
var range = new RangePosition(new CellPosition("C5"), new CellPosition("H14"));
// 从两个地址字符串创建
var range = new RangePosition("C5", "H14");
// 单个单元格
var range = new RangePosition(new CellPosition("A1"));

属性
| 属性 | 类型 | 说明 |
|---|---|---|
Row | int | 起始行索引 |
Col | int | 起始列索引 |
Rows | int | 行数 |
Cols | int | 列数 |
EndRow | int | 结束行索引 |
EndCol | int | 结束列索引 |
StartPos | CellPosition | 起始位置 |
EndPos | CellPosition | 结束位置 |
IsEmpty | bool | 行数或列数是否为零 |
IsEntire | bool | 范围是否覆盖整行和整列 |
IsSingleCell | bool | 范围是否只包含一个单元格 |
方法
| 方法 | 返回值 | 说明 |
|---|---|---|
Contains(CellPosition pos) | bool | 检查单元格位置是否在范围内 |
Contains(int row, int col) | bool | 检查行/列是否在范围内 |
Contains(RangePosition range) | bool | 检查另一个范围是否完全包含在内 |
ContainsRow(int row) | bool | 检查行是否在范围内 |
ContainsColumn(int col) | bool | 检查列是否在范围内 |
IntersectWith(RangePosition range) | bool | 检查两个范围是否重叠 |
Offset(int rows, int cols) | RangePosition | 创建按行和列偏移的新范围 |
Offset(CellPosition pos) | RangePosition | 创建按单元格位置偏移的新范围 |
ToAddress() | string | 转换为地址字符串(例如 "A1:B10") |
ToAbsoluteAddress() | string | 转换为绝对地址(例如 "$A$1:$B$10") |
ToRelativeAddress() | string | 转换为相对地址 |
SetRows(int rows) | void | 设置行数 |
SetCols(int cols) | void | 设置列数 |
静态成员
| 成员 | 说明 |
|---|---|
RangePosition.Empty | 空范围 (0, 0, 0, 0) |
RangePosition.EntireRange | 整个工作表范围 |
RangePosition.IsValidAddress(string) | 检查字符串是否为有效的范围地址 |
RangePosition.Union(range1, range2) | 获取包含两个范围的最小范围 |
RangePosition.FromCellPosition(startRow, startCol, endRow, endCol) | 从单元格坐标创建 |
获取安全范围
当范围可能超出工作表边界时,使用 FixRange:
var safeRange = sheet.FixRange(range);
ReferenceRange
ReferenceRange 绑定到特定工作表,提供对该范围的数据、样式、边框、格式和操作的直接访问。
获取 ReferenceRange
使用工作表上的 Ranges 集合:
var range = sheet.Ranges["B2:D3"];
var range = sheet.Ranges[1, 1, 2, 3]; // 行、列、行数、列数
var range = sheet.Ranges[new RangePosition(1, 1, 2, 3)];
var range = sheet.Ranges[new CellPosition("B2"), new CellPosition("D3")];
属性
位置
| 属性 | 类型 | 说明 |
|---|---|---|
Position | RangePosition | 工作表上的范围位置 |
Worksheet | Worksheet | 父工作表 |
Row | int | 起始行索引 |
Column | int | 起始列索引 |
Rows | int | 行数 |
Cols | int | 列数 |
EndRow | int | 结束行索引 |
EndColumn | int | 结束列索引 |
StartPos | CellPosition | 起始位置 |
EndPos | CellPosition | 结束位置 |
数据和内容
| 属性 | 类型 | 说明 |
|---|---|---|
Data | object | 获取或设置整个范围的数据 |
Cells | CellCollection | 范围内的单元格实例集合 |
// 设置范围数据
range.Data = new object[] { "Product", "Price", "Quantity" };

样式
| 属性 | 类型 | 说明 |
|---|---|---|
Style | ReferenceRangeStyle | 范围的样式访问 |
Border | RangeBorderProperty | 边框属性包装器 |
range.Style.BackColor = Color.LightBlue;
range.Style.Bold = true;
边框快捷方式
| 属性 | 类型 | 说明 |
|---|---|---|
BorderOutside | RangeBorderStyle | 外边框 |
BorderAll | RangeBorderStyle | 所有边框(外边框 + 内边框) |
BorderLeft | RangeBorderStyle | 左边框 |
BorderTop | RangeBorderStyle | 上边框 |
BorderRight | RangeBorderStyle | 右边框 |
BorderBottom | RangeBorderStyle | 下边框 |
BorderInsideAll | RangeBorderStyle | 所有内边框 |
BorderInsideHorizontal | RangeBorderStyle | 内部水平边框 |
BorderInsideVertical | RangeBorderStyle | 内部垂直边框 |
range.BorderOutside = RangeBorderStyle.BlackSolid;
range.Border.Outside = RangeBorderStyle.BlackSolid; // 等效写法
数据格式
| 属性 | 类型 | 说明 |
|---|---|---|
DataFormat | CellDataFormatFlag | 范围内所有单元格的数据格式类型 |
DataFormatArgs | object | 格式参数 |
CustomDataFormatter | IDataFormatter | 自定义格式化器 |
保护
| 属性 | 类型 | 说明 |
|---|---|---|
IsReadonly | bool | 将范围内所有单元格设为只读 |
IsLocked | CellLock | 范围内所有单元格的锁定状态(仅设置) |
IsMergedCell | bool | 范围是否为单个合并单元格(只读) |
验证
| 属性 | 类型 | 说明 |
|---|---|---|
Validator | IValidator | 范围的输入验证规则 |
方法
| 方法 | 说明 |
|---|---|
Select() | 在工作表上选择此范围 |
Merge() | 将范围合并为单个单元格 |
Unmerge() | 取消合并范围 |
GroupRows() | 对范围内的所有行分组 |
GroupColumns() | 对范围内的所有列分组 |
UngroupRows() | 取消范围内所有行的分组 |
UngroupColumns() | 取消范围内所有列的分组 |
Contains(CellPosition pos) | 检查单元格是否在范围内 |
Contains(RangePosition range) | 检查范围是否完全包含在内 |
Contains(ReferenceRange range) | 检查另一个引用范围是否包含在内 |
IntersectWith(RangePosition range) | 检查两个范围是否重叠 |
IntersectWith(ReferenceRange range) | 检查两个引用范围是否重叠 |
ToAddress() | 转换为地址字符串 |
ToAbsoluteAddress() | 转换为绝对地址字符串 |
IterateCells(iterator) | 遍历范围内的所有单元格 |
遍历单元格
var range = sheet.Ranges["A1:C3"];
range.IterateCells((row, col, cell) =>
{
Console.WriteLine($"Cell [{row},{col}]: {cell?.Data}");
return true; // 继续遍历
});
类型之间的转换
// RangePosition → ReferenceRange
var refRange = sheet.Ranges[rangePosition];
// ReferenceRange → RangePosition
RangePosition pos = refRange.Position;
// 隐式转换(ReferenceRange 转 RangePosition)
RangePosition pos = refRange;
// 两者都可用于赋值
sheet.SelectionRange = rangePosition;
sheet.SelectionRange = refRange;

清除范围内容
使用 ClearRangeContent 有选择地清除范围中的元素:
// 仅清除数据
sheet.ClearRangeContent("A1:B5", CellElementFlag.Data);
// 仅清除公式
sheet.ClearRangeContent("A1:B5", CellElementFlag.Formula);
// 清除所有内容
sheet.ClearRangeContent("A1:B5", CellElementFlag.All);
CellElementFlag 枚举(标志)
| 值 | 说明 |
|---|---|
Data | 单元格数据值 |
Formula | 单元格公式 |
Body | 单元格主体(按钮、复选框等) |
DataFormat | 数据格式设置 |
Style | 单元格样式 |
Border | 单元格边框 |
All | 以上所有 |
已使用范围
获取包含数据的范围:
RangePosition usedRange = sheet.UsedRange;
命名范围
命名范围是带有名称的特殊 ReferenceRange 实例。参见命名范围。