# dotNet.ReoGrid 扩展库 - 公式

设置公式
---------------------------

### 通过编辑单元格设置公式

在单元格中输入以等号("=")开头的内容即可设置公式。

![28](./images/28.png)

### 通过编程设置公式

在 aardio 中设置单元格公式可以使用以下方法：

```aardio
// 方法1：直接访问单元格数据
sheet1["E3"] = "=(A3+B3)*C3";

// 方法2：通过单元格实例
var cell = sheet1.Cells["E3"];
cell.Formula = "(A3+B3)*C3";  // 不需要等号(=)
```

获取单元格公式
-------------------------------------

获取单元格中的公式：

```aardio
// 方法1：通过工作表方法
var formula = sheet1.GetCellFormula("C1");

// 方法2：通过单元格实例
var cell = sheet1.Cells["C1"];
var formula = cell.Formula;
```

检查单元格是否有公式
---------------------------------------------------------------------

检查单元格是否包含公式且其值由公式计算得出：

```aardio
var hasFormula = cell.HasFormula;
```

获取公式计算结果
-----------------------------------------

完成单元格编辑后，公式会被立即解析并计算单元格值。

![29](./images/29.png)

### 通过编程获取公式结果

使用以下方法获取公式计算结果：

```aardio
// 方法1：直接访问单元格数据
var value = sheet1["E3"];

// 方法2：通过单元格实例
var cell = sheet1.Cells["E3"];
var value = cell.Data;
```

公式值的类型
-------------------------------------------------

ReoGrid 始终使用 .NET 原生类型作为公式值类型：
- 数字：double 类型
- 字符串：string 类型
- 布尔值：bool 类型
- 日期时间：DateTime 类型

例如：

```aardio
sheet1["E3"] = "=(A3+B3)*C3";
var value = sheet1["E3"]; // 类型为 double
```

整数、长整型等数值类型会被转换为 double 类型，字符串和 StringBuilder 会被转换为 string 类型。

防止单元格文本被识别为公式
-----------------------------------------------------------------------------------

在文本前加单引号(')可防止被解析为公式：

```aardio
sheet1["A1"] = "'=10";  // 单元格数据为 '=10'
```

单元格引用
---------------------------------

支持两种引用方式：
- **A1 格式**：相对引用
- **$A$1 格式**：绝对引用

![13_2](./images/13_2.png)

示例公式使用相对引用其他单元格：
![94](./images/94.png)

结果：
![95](./images/95.png)

范围引用
-----------------------------------

使用 StartCell:EndCell 格式引用范围：
![91](./images/91.png)

结果：
![92](./images/92.png)

获取公式引用列表
---------------------------------------------------------

获取单元格公式的引用关系列表：

```aardio
sheet1["H8"] = "=A1+B1-SUM(A1:C3)+AVERAGE(D1:H5)";
var rangeList = sheet1.GetCellFormulaReferenceRanges("H8");
```

从范围中移除公式
-------------------------------------------------------

使用 `ClearRangeContent` 方法删除指定范围的公式：

```aardio
var sheet1 = grid.CurrentWorksheet;
sheet1.ClearRangeContent("A1:B5", 0x10/*CellElementFlags.Formula*/);
```

追踪引用和被引用关系
------------------------------------------------------------------

追踪单元格公式的引用和被引用关系。

![83](./images/83.png)

启用追踪：

```aardio
var sheet1 = workbook.CurrentWorksheet;
sheet1["C2"] = 10;
sheet1["C3"] = 5;
var cell = sheet1.Cells["C5"];
cell.Formula = "C2+C3";
cell.TraceFormulaPrecedents = true;
```

或通过工作表方法启用：

```aardio
sheet1.TraceCellPrecedents("C5");
```

公式变更后追踪箭头会消失，如需持续追踪：

```aardio
sheet1.CellDataChanged = function(sender,event){
    event.Cell.TraceFormulaPrecedents = true;
}
```

命名范围引用
----------------------------------------------

在公式中直接使用命名范围名称：

```aardio
sheet1.DefineNamedRange("myrange", "A1:B5");
sheet1.Cells["E10"] = "=SUM(myrange)";
```

内置Excel兼容函数
--------------------------------------------------------------------------

ReoGrid 支持内置的 Excel 兼容函数，详见[公式函数](./formula/formula-functions.html)。

自动更新引用单元格
-----------------------------------------------------------------------

默认情况下，当单元格值变更时，所有引用该单元格的公式会自动重新计算。

### 暂停和恢复自动更新

禁用自动更新：

```aardio
sheet1.SuspendFormulaReferenceUpdates();
```

恢复自动更新：

```aardio
sheet1.ResumeFormulaReferenceUpdates();
```

或通过工作表设置：

```aardio
// 禁用自动更新
sheet1.SetSettings(0x40000000/*WorksheetSettings.Formula_AutoUpdateReferenceCell*/, false);

// 启用自动更新
sheet1.SetSettings(0x40000000/*WorksheetSettings.Formula_AutoUpdateReferenceCell*/, true);
```

强制重新计算整个工作表
-------------------------------------------------------------------------------

当禁用自动更新后，可手动触发全表重新计算：

```aardio
sheet1.Recalculate();
```

自定义函数
-----------------------------------

添加自定义函数详见[自定义函数](./formula/custom-function.html)。