单元格是工作表中的基本单位。每个单元格可以包含数据、公式、样式、自定义渲染主体和数据验证规则。
主要功能
- 数据存储 — 存储文本、数字、日期、布尔值、自定义对象等
- 样式 — 设置字体、颜色、边框、对齐、内边距和旋转
- 数据格式 — 将内容显示为货币、日期、百分比等格式
- 公式 — 使用兼容 Excel 的公式计算值
- 自定义 — 托管自定义单元格主体(下拉列表、按钮、复选框)
- 数据验证 — 验证用户输入
- 合并 — 将多个单元格合并为一个大单元格
- 保护 — 锁定单元格以防止编辑
定位单元格
可以通过三种方式引用单元格:
// 通过地址字符串
sheet["D5"] = "hello";
// 通过行列索引(从零开始)
sheet[4, 3] = "hello";
// 通过 CellPosition 结构体
var pos = new CellPosition("D5"); // 或 new CellPosition(4, 3)
sheet[pos] = "hello";
CellPosition 结构体
// 通过地址创建
var pos = new CellPosition("D5");
// 通过索引创建
var pos = new CellPosition(4, 3); // 行: 4, 列: 3
// 转换为地址字符串
string address = pos.ToAddress(); // "D5"
// 验证地址
CellPosition.IsValidAddress("D5"); // true
CellPosition.IsValidAddress("A1:D5"); // false(这是一个范围)
CellPosition.IsValidAddress("myrange"); // false(但 sheet["myrange"] 可用于命名范围)
单元格实例
ReoGrid 按需创建单元格实例 — 仅在设置数据、样式或其他属性时创建。这为大型工作表节省了内存。

获取单元格实例
// 如果不存在则始终创建实例
var cell = sheet.Cells["A1"];
var cell = sheet.Cells[1, 2];
var cell = sheet.Cells[new CellPosition("C2")];
var cell = sheet.Cells["myNamedRange"]; // 命名范围中的第一个单元格
注意: 访问
Cells[...]会在单元格不存在时创建新实例。避免使用此集合遍历所有单元格 — 这会创建大量空实例并消耗内存。
获取但不创建
// 如果单元格不存在则返回 null
var cell = sheet.GetCell("A1");
var cell = sheet.GetCell(0, 0);
var cell = sheet.GetCell(new CellPosition("A1"));
if (cell != null)
{
// 处理已存在的单元格
}
创建并获取
// 如果需要则创建(与 Cells[...] 行为相同)
var cell = sheet.CreateAndGetCell("A1");
var cell = sheet.CreateAndGetCell(0, 0);
var cell = sheet.CreateAndGetCell(new CellPosition("A1"));
获取合并单元格
当单元格是合并区域的一部分时,获取合并区域的左上角单元格:
var mergedCell = sheet.GetMergedCellOfRange("B3");
var mergedCell = sheet.GetMergedCellOfRange(new CellPosition(2, 1));
var mergedCell = sheet.GetMergedCellOfRange(2, 1);
var mergedCell = sheet.GetMergedCellOfRange(cell);
单元格属性
核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
Data | object | 单元格值(文本、数字、日期、自定义对象) |
Formula | string | 公式表达式(如 "=A1+B1") |
HasFormula | bool | 单元格是否包含公式(只读) |
FormulaStatus | FormulaStatus | 公式计算状态(只读) |
DisplayText | string | 单元格中显示的渲染文本(只读) |
Style | ReferenceCellStyle | 用于设置外观的样式对象 |
CalcedStyle | WorksheetRangeStyle | 完全解析的计算样式(只读) |
Body | ICellBody | 自定义单元格主体(按钮、复选框等) |
位置属性
| 属性 | 类型 | 说明 |
|---|---|---|
Row | int | 从零开始的行索引(只读) |
Column | int | 从零开始的列索引(只读) |
Position | CellPosition | 单元格位置结构体(只读) |
Address | string | 单元格地址字符串,如 “A1”(只读) |
PositionAsRange | RangePosition | 单元格位置作为 1x1 范围(只读) |
RangePosition | RangePosition | 包括合并区域的范围(只读) |
Worksheet | Worksheet | 父工作表(只读) |
合并属性
| 属性 | 类型 | 说明 |
|---|---|---|
IsMergedCell | bool | 此单元格是否为合并范围的起始单元格 |
IsValidCell | bool | 单元格是否有效(未被合并占用) |
InsideMergedRange | bool | 单元格是否在合并范围内 |
GetRowspan() | short | 此单元格跨越的行数 |
GetColspan() | short | 此单元格跨越的列数 |
数据格式属性
| 属性 | 类型 | 说明 |
|---|---|---|
DataFormat | CellDataFormatFlag | 数据格式类型(数字、货币、日期等) |
DataFormatArgs | object | 格式特定参数 |
CustomDataFormatter | IDataFormatter | 自定义数据格式化器实现 |
保护属性
| 属性 | 类型 | 说明 |
|---|---|---|
IsLocked | CellLock | 锁定状态:Locked、Unlocked 或 Inherit |
IsReadOnly | bool | 单元格是否只读 |
IsVisible | bool | 单元格是否可见(不在隐藏的行/列上) |
其他属性
| 属性 | 类型 | 说明 |
|---|---|---|
Tag | object | 用户自定义数据存储 |
DataInputUnit | int | 数据输入单元标识符 |
Validator | IValidator | 数据验证规则 |
HighlightColor | SolidColor? | 单元格高亮颜色 |
Border | CellBorderProperty | 边框属性(只读) |
ConditionalStyles | List<WorksheetRangeStyle> | 已应用的条件样式(只读) |
单元格方法
| 方法 | 返回值 | 说明 |
|---|---|---|
GetData<T>() | T | 获取转换为类型 T 的单元格数据 |
SetDataFormat(format, args) | void | 设置数据格式和参数 |
BindStyle(style) | void | 将样式对象绑定到单元格 |
StartEdit() | void | 进入此单元格的编辑模式 |
EndEdit(data) | void | 结束编辑模式,可选设置数据 |
ExpandRowHeight() | void | 扩展行高以适应此单元格的内容 |
ExpandColumnWidth() | void | 扩展列宽以适应此单元格的内容 |
Clone() | Cell | 创建此单元格的副本 |
GetBounds() | Rectangle | 获取此单元格的边界矩形 |
单元格数据
设置单个单元格数据
// 通过地址
sheet["A1"] = 10;
// 通过索引
sheet[0, 0] = 10; // 数字
sheet[0, 1] = "text"; // 字符串
sheet[0, 2] = DateTime.Now; // 日期时间
sheet[0, 3] = true; // 布尔值
// 通过 CellPosition
sheet[new CellPosition("A1")] = 10;
// 通过命名范围
sheet.DefineNamedRange("mycell", new RangePosition("A1"));
sheet["mycell"] = 10.12345d;
// 通过方法调用
sheet.SetCellData(5, 2, "hello world");
// 自定义数据类型
public class MyData {
public override string ToString() { return "custom display"; }
}
sheet["D1"] = new MyData();
设置范围数据
// 在范围内水平填充
sheet["A1:C1"] = new object[] { "A", "B", "C" };
// 垂直填充
sheet["A1:A3"] = new object[] { 10, 11, 12 };
// 二维数组
sheet[1, 1] = new object[,] { { "a", "b", "c" }, { 1, 2, 3 } };
// 使用方法
sheet.SetRangeData(new RangePosition(1, 1, 3, 3),
new object[,] { { "a", "b", "c" }, { 1, 2, 3 }, { 4, 5, 6 } });

获取单元格数据
// 获取原始数据(object)
object value = sheet["A1"];
// 从单元格实例获取类型化数据
int intValue = sheet.Cells["A1"].GetData<int>();
string textValue = sheet.Cells["A1"].GetData<string>();
设置支持撤销的数据
sheet.DoAction(new SetCellDataAction("B5", "hello world"));
// 撤销
grid.Undo();
// 重做
grid.Redo();
自动数据格式
ReoGrid 在输入时自动检测数据类型并应用适当的格式(数字对齐、日期格式等)。
禁用自动格式
sheet.SetSettings(WorksheetSettings.Edit_AutoFormatCell, false);
自动数据类型转换
当字符串数据输入到数字格式的单元格时,会自动转换:
sheet[3, 1] = "10"; // 转换为数字 10
要保留原始字符串类型,请将单元格格式设置为 Text:
sheet.SetRangeDataFormat(3, 2, 1, 1, CellDataFormatFlag.Text, null);
sheet[3, 2] = "10"; // 保留为字符串 "10"
详见 数据格式。
单元格有效性和可见性
// 检查位置是否有效
bool valid = sheet.IsValidCell("A1");
bool valid = sheet.IsValidCell(0, 0);
// 检查单元格是否为合并单元格
bool merged = sheet.IsMergedCell("B3");
bool merged = sheet.IsMergedCell(new RangePosition(1, 1, 2, 2));
// 检查单元格是否可见
bool visible = sheet.IsCellVisible(3, 2);
bool visibleToUser = sheet.IsCellVisibleToUser(3, 2);
// 通过单元格实例
var cell = sheet.Cells["A1"];
bool isVisible = cell.IsVisible;
已使用范围和内容边界
// 获取包含数据的范围
RangePosition usedRange = sheet.UsedRange;
// 获取包含内容的最大行/列
int maxRow = sheet.MaxContentRow;
int maxCol = sheet.MaxContentCol;
文本溢出
默认情况下,单元格文本可以溢出到相邻的空单元格:
// 禁用文本溢出
sheet.DisableSettings(WorksheetSettings.View_AllowCellTextOverflow);
// 重新启用
sheet.EnableSettings(WorksheetSettings.View_AllowCellTextOverflow);