单元格是工作表中的基本单位。每个单元格可以包含数据、公式、样式、自定义渲染主体和数据验证规则。

主要功能

  • 数据存储 — 存储文本、数字、日期、布尔值、自定义对象等
  • 样式 — 设置字体、颜色、边框、对齐、内边距和旋转
  • 数据格式 — 将内容显示为货币、日期、百分比等格式
  • 公式 — 使用兼容 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 按需创建单元格实例 — 仅在设置数据、样式或其他属性时创建。这为大型工作表节省了内存。

Cell with instances

获取单元格实例

// 如果不存在则始终创建实例
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);

单元格属性

核心属性

属性类型说明
Dataobject单元格值(文本、数字、日期、自定义对象)
Formulastring公式表达式(如 "=A1+B1"
HasFormulabool单元格是否包含公式(只读)
FormulaStatusFormulaStatus公式计算状态(只读)
DisplayTextstring单元格中显示的渲染文本(只读)
StyleReferenceCellStyle用于设置外观的样式对象
CalcedStyleWorksheetRangeStyle完全解析的计算样式(只读)
BodyICellBody自定义单元格主体(按钮、复选框等)

位置属性

属性类型说明
Rowint从零开始的行索引(只读)
Columnint从零开始的列索引(只读)
PositionCellPosition单元格位置结构体(只读)
Addressstring单元格地址字符串,如 “A1”(只读)
PositionAsRangeRangePosition单元格位置作为 1x1 范围(只读)
RangePositionRangePosition包括合并区域的范围(只读)
WorksheetWorksheet父工作表(只读)

合并属性

属性类型说明
IsMergedCellbool此单元格是否为合并范围的起始单元格
IsValidCellbool单元格是否有效(未被合并占用)
InsideMergedRangebool单元格是否在合并范围内
GetRowspan()short此单元格跨越的行数
GetColspan()short此单元格跨越的列数

数据格式属性

属性类型说明
DataFormatCellDataFormatFlag数据格式类型(数字、货币、日期等)
DataFormatArgsobject格式特定参数
CustomDataFormatterIDataFormatter自定义数据格式化器实现

保护属性

属性类型说明
IsLockedCellLock锁定状态:LockedUnlockedInherit
IsReadOnlybool单元格是否只读
IsVisiblebool单元格是否可见(不在隐藏的行/列上)

其他属性

属性类型说明
Tagobject用户自定义数据存储
DataInputUnitint数据输入单元标识符
ValidatorIValidator数据验证规则
HighlightColorSolidColor?单元格高亮颜色
BorderCellBorderProperty边框属性(只读)
ConditionalStylesList<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 } });

17_2

获取单元格数据

// 获取原始数据(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);

相关主题

这篇文章对您有帮助吗?