ReoGrid 支持兼容 Excel 的公式计算,包括单元格引用、范围引用、命名范围、内置函数和自定义函数。

命名空间

using unvell.ReoGrid;

设置公式

通过编辑单元格

输入以等号 (=) 开头的值即可设置公式:

28

通过代码设置

// 方法 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解析或计算过程中出现未指定的错误

获取公式结果

编辑完成后,公式会立即被解析和计算。

29

// 方法 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绝对引用复制/移动公式时保持不变

13_2

范围引用

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

91

结果:92

命名范围引用

在公式中可以直接通过名称引用命名范围:

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"

追踪引用单元格和从属单元格

使用追踪箭头可视化公式依赖关系。

83

追踪引用单元格

// 通过单元格属性
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;

单元格公式属性

属性类型说明
Formulastring获取或设置公式表达式
HasFormulabool单元格是否有公式(只读)
FormulaStatusFormulaStatus公式计算状态(只读)
TraceFormulaPrecedentsbool显示/隐藏引用单元格的追踪箭头
TraceFormulaDependentsbool显示/隐藏从属单元格的追踪箭头

自动引用更新

当单元格的值发生更改时,所有引用该单元格的公式会自动重新计算。

暂停和恢复

对于批量数据操作,暂停自动更新可以提高性能:

// 暂停更新
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;
属性类型说明
CustomFunctionsDictionary<string, Func<Cell, object[], object>>自定义函数注册表
NameReferenceProviderFunc<Cell, string, object>自定义名称解析提供程序
EmptyCellReferenceProviderFunc<Worksheet, CellPosition, Cell, object>自定义空单元格值提供程序
ParameterSeparatorstring公式参数分隔符(默认:",")
NumberDecimalSeparatorstring小数点分隔符(默认:".")
FormulaCalculationEplisondouble计算精度(默认:0.000001

方法

方法说明
ChangeToStandardFunctionNames()使用标准英文函数名
ChangeToRussianFunctionNames()使用俄文函数名

内置函数

ReoGrid 提供兼容 Excel 的内置函数。有关完整列表,请参阅公式函数

自定义函数

通过 FormulaExtension.CustomFunctions 添加自定义函数。有关详细示例,请参阅自定义函数

相关主题

这篇文章对您有帮助吗?