ReoGrid 支持兼容 Excel 的公式计算,包括单元格引用、范围引用、命名范围、内置函数和自定义函数。
命名空间
using unvell.ReoGrid;
设置公式
通过编辑单元格
输入以等号 (=) 开头的值即可设置公式:

通过代码设置
// 方法 1:设置以 "=" 开头的数据
sheet["E3"] = "=(A3+B3)*C3";
// 方法 2:通过单元格实例(不需要 "=" 前缀)
var cell = sheet.Cells["E3"];
cell.Formula = "(A3+B3)*C3";
// 方法 3:通过工作表方法
sheet.SetCellFormula("E3", "(A3+B3)*C3");
sheet.SetCellFormula(new CellPosition("E3"), "(A3+B3)*C3");
sheet.SetCellFormula(2, 4, "(A3+B3)*C3");
获取公式
// 通过工作表方法
string formula = sheet.GetCellFormula("C1");
string formula = sheet.GetCellFormula(0, 2);
string formula = sheet.GetCellFormula(new CellPosition("C1"));
// 通过单元格实例
var cell = sheet.Cells["C1"];
string formula = cell.Formula;
检查公式状态
var cell = sheet.Cells["C1"];
// 检查单元格是否有公式
bool hasFormula = cell.HasFormula;
// 检查公式计算状态
FormulaStatus status = cell.FormulaStatus;
FormulaStatus 枚举
| 值 | 说明 |
|---|---|
Normal | 未检测到错误 |
SyntaxError | 公式存在语法错误,无法解析 |
CircularReference | 检测到循环引用 |
InvalidValue | 计算过程中出现无效的值类型(Excel #VALUE!) |
InvalidReference | 单元格或范围引用无效(Excel #REF!) |
InvalidName | 未找到引用的名称(Excel #NAME!) |
MismatchedParameter | 函数调用的参数类型或数量不正确 |
UnspecifiedError | 解析或计算过程中出现未指定的错误 |
获取公式结果
编辑完成后,公式会立即被解析和计算。

// 方法 1:直接访问单元格数据
object value = sheet["E3"];
// 方法 2:通过单元格实例
var cell = sheet.Cells["E3"];
object value = cell.Data;
公式值类型
ReoGrid 使用 .NET 原生类型作为公式值:
| .NET 类型 | 用途 |
|---|---|
double | 所有数值(int、long、float 均转换为 double) |
string | 文本值 |
bool | 布尔值 |
DateTime | 日期和时间值 |
sheet["E3"] = "=(A3+B3)*C3";
System.Diagnostics.Debug.Assert(sheet["E3"] is double); // true
防止文本被当作公式处理
在前面加上单引号 (') 可以阻止公式解析:
sheet["A1"] = "'=10"; // 单元格显示 "=10" 作为文本
单元格引用
ReoGrid 支持两种地址格式:
| 格式 | 类型 | 说明 |
|---|---|---|
A1 | 相对引用 | 复制/移动公式时会自动调整 |
$A$1 | 绝对引用 | 复制/移动公式时保持不变 |

范围引用
使用 起始单元格:结束单元格 格式引用范围:

结果:
命名范围引用
在公式中可以直接通过名称引用命名范围:
sheet.DefineNamedRange("myrange", "A1:B5");
sheet.Cells["E10"].Formula = "SUM(myrange)";
有关定义命名范围的详细信息,请参阅命名范围。
删除公式
// 删除单个单元格的公式
sheet.DeleteCellFormula("E3");
sheet.DeleteCellFormula(new CellPosition("E3"));
sheet.DeleteCellFormula(2, 4);
// 清除范围内的公式
sheet.ClearRangeContent("A1:B5", CellElementFlag.Formula);
获取公式引用列表
获取公式引用的单元格和范围列表:
sheet["H8"] = "=A1+B1-SUM(A1:C3)+AVERAGE(D1:H5)";
var rangeList = sheet.GetCellFormulaReferenceRanges("H8");
// rangeList[0].Range == "A1"
// rangeList[1].Range == "B1"
// rangeList[2].Range == "A1:C3"
// rangeList[3].Range == "D1:H5"
追踪引用单元格和从属单元格
使用追踪箭头可视化公式依赖关系。

追踪引用单元格
// 通过单元格属性
var cell = sheet.Cells["C5"];
cell.Formula = "C2+C3";
cell.TraceFormulaPrecedents = true;
// 通过工作表方法
sheet.TraceCellPrecedents("C5");
sheet.TraceCellPrecedents(new CellPosition(4, 2));
追踪从属单元格
// 通过单元格属性
cell.TraceFormulaDependents = true;
// 通过工作表方法
sheet.TraceCellDependents("C2");
sheet.TraceCellDependents(new CellPosition(1, 2));
移除追踪箭头
// 移除特定追踪
sheet.RemoveCellTracePrecedents("C5");
sheet.RemoveCellTraceDependents("C2");
// 移除单元格的所有追踪箭头
sheet.RemoveCellAllTraceArrows("C5");
// 移除范围内的所有追踪箭头
sheet.RemoveRangeAllTraceArrows("A1:H10");
检查追踪状态
bool hasPrecedents = sheet.IsCellInTracePrecedents(new CellPosition("C5"));
bool hasDependents = sheet.IsCellInTraceDependents(new CellPosition("C2"));
// 获取所有具有从属追踪的单元格
var tracedCells = sheet.GetAllTraceDependentCells();
始终显示追踪
当公式更改时,追踪箭头会消失。要始终保持可见:
sheet.CellDataChanged += (s, e) => e.Cell.TraceFormulaPrecedents = true;
单元格公式属性
| 属性 | 类型 | 说明 |
|---|---|---|
Formula | string | 获取或设置公式表达式 |
HasFormula | bool | 单元格是否有公式(只读) |
FormulaStatus | FormulaStatus | 公式计算状态(只读) |
TraceFormulaPrecedents | bool | 显示/隐藏引用单元格的追踪箭头 |
TraceFormulaDependents | bool | 显示/隐藏从属单元格的追踪箭头 |
自动引用更新
当单元格的值发生更改时,所有引用该单元格的公式会自动重新计算。
暂停和恢复
对于批量数据操作,暂停自动更新可以提高性能:
// 暂停更新
sheet.SuspendFormulaReferenceUpdates();
// ... 批量数据操作 ...
// 恢复更新
sheet.ResumeFormulaReferenceUpdates();
// 检查是否已暂停
bool isSuspended = sheet.IsSuspendingFormulaReferenceUpdates;
或通过工作表设置:
sheet.SetSettings(WorksheetSettings.Formula_AutoUpdateReferenceCell, false);
sheet.SetSettings(WorksheetSettings.Formula_AutoUpdateReferenceCell, true);
强制重新计算
重新计算工作表中的所有公式:
// 重新计算整个工作表
sheet.Recalculate();
// 重新计算指定范围
sheet.Recalculate(new RangePosition("A1:H10"));
// 重新计算单个单元格
sheet.RecalcCell("E3");
sheet.RecalcCell(new CellPosition("E3"));
sheet.RecalcCell(2, 4);
// 刷新所有公式引用
sheet.RefreshFormulaReferences();
公式设置
| 设置 | 说明 |
|---|---|
Formula_AutoUpdateReferenceCell | 当单元格值更改时自动更新公式引用 |
Formula_AutoPickingCellAddress | 在公式编辑期间允许选择单元格地址(保留) |
Formula_AutoFormat | 自动纠正和格式化公式 |
sheet.SetSettings(WorksheetSettings.Formula_AutoFormat, true);
FormulaExtension
FormulaExtension 类提供用于自定义公式行为的静态属性:
using unvell.ReoGrid.Formula;
| 属性 | 类型 | 说明 |
|---|---|---|
CustomFunctions | Dictionary<string, Func<Cell, object[], object>> | 自定义函数注册表 |
NameReferenceProvider | Func<Cell, string, object> | 自定义名称解析提供程序 |
EmptyCellReferenceProvider | Func<Worksheet, CellPosition, Cell, object> | 自定义空单元格值提供程序 |
ParameterSeparator | string | 公式参数分隔符(默认:",") |
NumberDecimalSeparator | string | 小数点分隔符(默认:".") |
FormulaCalculationEplison | double | 计算精度(默认:0.000001) |
方法
| 方法 | 说明 |
|---|---|
ChangeToStandardFunctionNames() | 使用标准英文函数名 |
ChangeToRussianFunctionNames() | 使用俄文函数名 |
内置函数
ReoGrid 提供兼容 Excel 的内置函数。有关完整列表,请参阅公式函数。
自定义函数
通过 FormulaExtension.CustomFunctions 添加自定义函数。有关详细示例,请参阅自定义函数。