# 公式

- Human documentation: [https://docs.univer.ai/zh-CN/guides/sheets/features/core/formula](https://docs.univer.ai/zh-CN/guides/sheets/features/core/formula)

- Agent Markdown: [https://docs.univer.ai/zh-CN/guides/sheets/features/core/formula.md](https://docs.univer.ai/zh-CN/guides/sheets/features/core/formula.md)

- Requested language: `zh-CN`

- Content language: `zh-CN`

- Documentation version: `1.0.0-rc.0`

- Source: [sheets/features/core/formula.zh-CN.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/sheets/features/core/formula.zh-CN.mdx)

---

公式是 Univer 提供的核心能力之一，它可以让你在单元格中使用公式来计算数值，公式支持的函数和 Excel 一致，包括数学、逻辑、文本、日期等等。

如果工作簿中的公式数量较多，公式计算可能占用主线程并导致页面卡顿。建议将公式计算放到 Worker 进程中执行，以降低对页面渲染和交互的影响。具体配置方式请参考 [Web Workers](https://docs.univer.ai/zh-CN/guides/sheets/getting-started/worker.md) 章节。

## 配置

以下是公式插件相关配置项的链接：

| 插件                         | 配置项                                                                                   |
| -------------------------- | ------------------------------------------------------------------------------------- |
| `@univerjs/engine-formula` | [IUniverEngineFormulaConfig](https://docs.univer.ai/zh-CN/reference/packages/plugins/univerjs/engine-formula.md)     |
| `@univerjs/sheets-formula` | [IUniverSheetsFormulaBaseConfig](https://docs.univer.ai/zh-CN/reference/packages/plugins/univerjs/sheets-formula.md) |

### Presets 配置

```typescript
import type { CalculationMode } from '@univerjs/preset-sheets-core'
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'

interface IUniverSheetsCorePresetConfig {
  formula?: {
    // 自定义公式函数
    function?: Array<[Ctor<BaseFunction>, IFunctionNames]>
    // 自定义公式描述
    description?: IFunctionInfo[]
    // 定义数据初始化时公式的计算模式，默认为 `WHEN_EMPTY`
    initialFormulaComputing?: CalculationMode
  }
}
```

### Plugin 配置

```typescript
import type { CalculationMode } from '@univerjs/sheets-formula'
import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'

interface IUniverSheetsFormulaConfig {
  // 自定义公式函数
  function?: Array<[Ctor<BaseFunction>, IFunctionNames]>
  // 自定义公式描述
  description?: IFunctionInfo[]
  // 定义数据初始化时公式的计算模式，默认为 `WHEN_EMPTY`
  initialFormulaComputing?: CalculationMode
}
```

其中 `CalculationMode` 为：

```typescript
enum CalculationMode {
  /**
   * 强制计算所有公式
   */
  FORCED,

  /**
   * 部分计算，只计算有公式但没有 v 值的单元格
   */
  WHEN_EMPTY,

  /**
   * 所有公式不计算
   */
  NO_CALCULATION,
}
```

> 如果公式所在单元格有非预期值，可以通过 `initialFormulaComputing` 设置为 `CalculationMode.FORCED` 强制计算所有公式。或者初始化之前清空单元格的 `v` 值。

## 跨工作簿引用

跨工作簿公式用于在一个工作簿中汇总另一个工作簿的数据。例如，在 `Report` 中统计 `Sales.xlsx` 的销售额。它与同一工作簿内的跨工作表引用不同：除了工作表名称，还需要标明来源工作簿。

### 引用语法

| 场景          | 示例                                    | 含义                                     |
| ----------- | ------------------------------------- | -------------------------------------- |
| 同一工作簿的另一张表  | `=SUM(Data!A1:A10)`                   | 当前工作簿中 `Data` 表的数据                     |
| 另一工作簿的单元格区域 | `=SUM('[Sales.xlsx]Data'!A1:A10)`     | `Sales.xlsx` 中 `Data` 表的数据             |
| 另一工作簿中的表格   | `=SUM(Sales.xlsx!SalesTable[Amount])` | 来源工作簿内已存在的 `SalesTable` 表格的 `Amount` 列 |

`Sales.xlsx` 是工作簿名称，不是文件路径或下载地址。写入公式不会自动读取磁盘、下载 Excel 文件或连接另一个浏览器页面中的编辑器。使用表格结构化引用前，需要先创建相应的[表格](https://docs.univer.ai/zh-CN/guides/sheets/features/table.md)。

### 引用同一实例中已加载的工作簿

使用基础公式引擎时，来源工作簿与目标工作簿需要加载到同一个 Univer 实例中，并进入同一公式计算环境。下面的代码接在 Sheets 初始化之后执行；插件模式还需按本页的 Facade 引入说明加载对应扩展。

```typescript
const source = univerAPI.createWorkbook({
  id: 'sales-workbook',
  name: 'Sales.xlsx',
  sheetOrder: ['sales-data'],
  sheets: {
    'sales-data': {
      id: 'sales-data',
      name: 'Data',
      rowCount: 100,
      columnCount: 20,
      cellData: {
        0: { 0: { v: 100 } },
        1: { 0: { v: 200 } },
      },
    },
  },
}, { makeCurrent: false })

const report = univerAPI.createWorkbook({ id: 'report-workbook', name: 'Report' })
const resultCell = report.getActiveSheet().getRange('A1')
resultCell.setFormula("=SUM('[Sales.xlsx]Data'!A1:A2)")

const formula = univerAPI.getFormula()
formula.executeCalculation()
await formula.onCalculationResultApplied()
console.log(resultCell.getValue()) // 300
```

`makeCurrent: false` 让来源工作簿在加载时不切换为当前工作簿。示例始终保存并使用 `source`、`report` 的引用，避免切换活动工作簿后将公式写入错误位置。

名称匹配先查找不区分大小写的完整名称；没有完整匹配时，再忽略 `.xlsx`、`.xlsm` 等常见 Excel 扩展名进行匹配。名称不存在或匹配到多个工作簿时返回 `#REF!`。请为来源使用明确且唯一的名称。

### 使用固定来源 ID 绑定引用

如果业务需要把公式中的名称固定绑定到某个文档 ID，可使用 `@univerjs-pro/engine-formula` 的引用绑定 API。它属于 Pro 扩展：需配置[客户端许可证](https://docs.univer.ai/zh-CN/guides/license.md)，在初始化时用 `UniverProFormulaEnginePlugin` 替换普通的 `UniverFormulaEnginePlugin`，并引入 Pro Facade。不要同时注册两个公式引擎；仅引入 Facade 不会完成插件注册。

在已经配置 Pro 引擎的环境中，以下代码沿用上例的两个工作簿：

```typescript
import '@univerjs-pro/engine-formula/facade'

const reference = univerAPI.getFormula().buildReference({
  hostUnitId: report.getId(),
  unit: {
    unitId: source.getId(),
    formulaQualifier: 'Sales Source',
  },
  target: {
    kind: univerAPI.Enum.FormulaReferenceType.SHEET_RANGE,
    sheetName: 'Data',
    range: { startRow: 0, endRow: 1, startColumn: 0, endColumn: 0 },
  },
})

resultCell.setFormula(`=SUM(${reference})`)
```

`hostUnitId` 是保存公式的工作簿 ID，`unit.unitId` 是来源工作簿的稳定 ID，`formulaQualifier` 是公式里展示的名称。区域坐标从 `0` 开始，结束坐标包含在区域内。

`buildReference()` 返回不带 `=` 的引用片段，并为跨工作簿来源保存绑定；它不会加载来源，也不会执行公式计算。来源数据仍需由同一计算环境中已加载的工作簿或已配置的数据提供方提供。

如果公式文本来自手写或业务系统生成，可以先显式绑定，再写入公式：

```typescript
const formula = univerAPI.getFormula()
const bound = formula.upsertExternalReference({
  unitId: report.getId(),
  qualifier: 'Sales Source',
  sourceUnitId: source.getId(),
  sourceUnitType: univerAPI.Enum.UniverInstanceType.UNIVER_SHEET,
})
if (!bound) throw new Error('Could not bind Sales Source')

resultCell.setFormula("=SUM('[Sales Source]Data'!A1:A2)")
```

同一工作簿中重复写入相同绑定是幂等操作。`qualifier` 不包含方括号或引号，也不要使用 `1`、`2` 这样的正整数名称：它们是 Excel 外部链接的槽位编号，不是业务文档 ID。导入 Excel 外部链接时，还需保留对应的链接资源，不能只复制公式字符串。

### 数据更新、保存与卸载

通过 Facade 修改来源数据后，可显式触发计算并等待结果写回，再读取目标值。不要在 `setFormula()` 或 `setValue()` 后立即假定异步计算已经完成。

```typescript
const sourceSheet = source.getSheetBySheetId('sales-data')
if (!sourceSheet) throw new Error('Source sheet not found')
sourceSheet.getRange('A1').setValue(150)
formula.executeCalculation()
await formula.onCalculationResultApplied()
console.log(resultCell.getValue()) // 350
```

保存目标工作簿时，使用 `report.save()` 保存完整快照，包括引用绑定资源。只保存单元格公式文本，会丢失业务名称与来源 ID 的映射；来源工作簿的数据需要单独保存与加载。

来源工作簿卸载后，普通的已加载工作簿引用无法继续读取该来源。使用 Pro 外部引用时，是否仍能计算取决于已配置的数据提供方和可用缓存；绑定本身并不包含来源数据，也不保证离线可计算。不要把卸载前显示的旧结果当成最新结果。

如果不再需要某个 Pro 绑定，可调用：

```typescript
univerAPI.getFormula().removeExternalReference({
  unitId: report.getId(),
  qualifier: 'Sales Source',
})
```

移除绑定不会删除或重写已有公式。下一次计算将重新解析公式中的名称；若已加载工作簿仍可按名称匹配，引用可能继续解析，否则会出现 `#REF!`。如需停止引用，还应修改或清除相关单元格公式。

完整参数与返回值见 [FFormula 引用绑定 API](https://docs.univer.ai/zh-CN/reference/facade/formula.md#cross-unit-reference-authoring)。

## 三维引用

三维引用用于同一工作簿中一组连续工作表，与跨工作簿引用是两个维度。例如：

```text
=SUM(Jan:Mar!B2:C3)
=SUM('Jan':'Mar'!B2)
```

范围按工作簿中的工作表顺序确定，包含 `Jan`、`Mar` 以及它们之间的所有工作表，而不是按名称排序。调整工作表顺序时，应检查汇总范围是否仍符合预期。

## 已经支持的公式函数

#### Formula functions (528)

| Function | Description |
| --- | --- |
| `ABS` | 返回数字的绝对值。一个数字的绝对值是该数字不带其符号的形式。 |
| `ACCRINT` | 返回定期支付利息的债券的应计利息 |
| `ACCRINTM` | 返回在到期日支付利息的债券的应计利息 |
| `ACOS` | 返回数字的反余弦值。 反余弦值是指余弦值为 number 的角度。 返回的角度以弧度表示，弧度值在 0（零）到 pi 之间。 |
| `ACOSH` | 返回数字的反双曲余弦值。 该数字必须大于或等于 1。 反双曲余弦值是指双曲余弦值为 number 的值，因此 ACOSH(COSH(number)) 等于 number。 |
| `ACOT` | 返回数字的反余切值的主值。 |
| `ACOTH` | 返回数字的反双曲余切值。 |
| `ADDRESS` | 根据指定行号和列号获得工作表中的某个单元格的地址。 例如，ADDRESS(2,3) 返回 $C$2。 再例如，ADDRESS(77,300) 返回 $KN$77。 可以使用其他函数（如 ROW 和 COLUMN 函数）为 ADDRESS 函数提供行号和列号参数。 |
| `AGGREGATE` | 返回列表或数据库中的聚合 |
| `AMORDEGRC` | 使用折旧系数返回每个记帐期的折旧值 |
| `AMORLINC` | 返回每个记帐期的折旧值 |
| `AND` | 如果其所有参数均为 TRUE，则返回 TRUE |
| `ARABIC` | 将罗马数字转换为阿拉伯数字 |
| `AREAS` | 返回引用中涉及的区域个数 |
| `ARRAY_CONSTRAIN` | 以给定值约束数组结果的大小。 |
| `ARRAYTOTEXT` | ARRAYTOTEXT 函数返回任意指定区域内的文本值的数组。 |
| `ASC` | 将字符串中的全角（双字节）英文字母或片假名更改为半角（单字节）字符 |
| `ASIN` | 返回数字的反正弦值。 |
| `ASINH` | 返回数字的反双曲正弦值。 |
| `ATAN` | 返回数字的反正切值。 |
| `ATAN2` | 返回给定的 X 轴及 Y 轴坐标值的反正切值。 反正切值是指从 X 轴到通过原点 (0, 0) 和坐标点 (x_num, y_num) 的直线之间的夹角。 该角度以弧度表示，弧度值在 -pi 到 pi 之间（不包括 -pi）。 |
| `ATANH` | 返回数字的反双曲正切值。 Number 必须介于 -1 到 1 之间（不包括 -1 和 1）。 反双曲正切值是指双曲正切值为 number 的值，因此 ATANH(TANH(number)) 等于 number 。 |
| `AVEDEV` | 返回数据点与它们的平均值的绝对偏差平均值。 |
| `AVERAGE` | 返回参数的平均值（算术平均值）。 |
| `AVERAGE_WEIGHTED` | AVERAGE.WEIGHTED 函数根据一组数值及其对应的权重计算这些数值的加权平均值。 |
| `AVERAGEA` | 返回其参数的平均值，包括数字、文本和逻辑值。 |
| `AVERAGEIF` | 返回区域中满足给定条件的所有单元格的平均值（算术平均值）。 |
| `AVERAGEIFS` | 返回满足多个条件的所有单元格的平均值（算术平均值）。 |
| `BAHTTEXT` | 使用 ß（泰铢）货币格式将数字转换为文本 |
| `BASE` | 将一个数转换为具有给定基数的文本表示 |
| `BESSELI` | 返回修正的贝赛耳函数 In(x) |
| `BESSELJ` | 返回贝赛耳函数 Jn(x) |
| `BESSELK` | 返回修正的贝赛耳函数 Kn(x) |
| `BESSELY` | 返回贝赛耳函数 Yn(x) |
| `BETA_DIST` | 返回 beta 累积分布函数 |
| `BETA_INV` | 返回指定 beta 分布的累积分布函数的反函数 |
| `BETADIST` | 返回累积 beta 概率密度函数。 Beta 分布通常用于研究样本中一定部分的变化情况，例如，人们一天中看电视的时间比率。 |
| `BETAINV` | 返回指定 beta 分布的累积 beta 概率密度函数的反函数。 也就是说，如果 probability = BETADIST(x,...)，则 BETAINV(probability,...) = x。 beta 分布函数可用于项目设计，在已知预期的完成时间和变化参数后，模拟可能的完成时间。 |
| `BIN2DEC` | 将二进制数转换为十进制数 |
| `BIN2HEX` | 将二进制数转换为十六进制数 |
| `BIN2OCT` | 将二进制数转换为八进制数。 |
| `BINOM_DIST` | 返回一元二项式分布的概率 |
| `BINOM_DIST_RANGE` | 使用二项式分布返回试验结果的概率 |
| `BINOM_INV` | 返回使累积二项式分布小于或等于临界值的最小值 |
| `BINOMDIST` | 返回一元二项式分布的概率。 BINOMDIST 用于处理固定次数的试验或实验问题，前提是任意试验的结果仅为成功或失败两种情况，实验是独立实验，且在整个试验过程中成功的概率固定不变。 例如，BINOMDIST 可以计算三个即将出生的婴儿中两个是男孩的概率。 |
| `BITAND` | 返回两个数的“按位与” |
| `BITLSHIFT` | 返回左移 shift_amount 位的计算值接收数 |
| `BITOR` | 返回两个数的“按位或” |
| `BITRSHIFT` | 返回右移 shift_amount 位的计算值接收数 |
| `BITXOR` | 返回两个数的按位“异或” |
| `BYCOL` | 将 LAMBDA 应用于每个列并返回结果数组 |
| `BYROW` | 将 LAMBDA 应用于每一行并返回结果数组 |
| `CALL` | 调用动态链接库或代码源中的过程 |
| `CEILING` | 将数字舍入为最接近的整数或最接近的指定基数的倍数 |
| `CEILING_MATH` | 将数字向上舍入为最接近的整数或最接近的指定基数的倍数 |
| `CEILING_PRECISE` | 将数字舍入为最接近的整数或最接近的指定基数的倍数。 无论该数字的符号如何，该数字都向上舍入。 |
| `CELL` | 返回有关单元格格式、位置或内容的信息 |
| `CHAR` | 返回由代码数字指定的字符 |
| `CHIDIST` | 返回 χ2 分布的右尾概率。 χ2 分布与 χ2 测试相关联。 使用 χ2 测试可比较观察值和预期值。 例如，某项遗传学实验可能假设下一代植物将呈现出某一组颜色。 通过使用该函数比较观察结果和理论值，可以确定初始假设是否有效。 |
| `CHIINV` | 返回 χ2 分布的右尾概率的反函数。 如果 probability = CHIDIST(x,...)，则 CHIINV(probability,...) = x。 使用此函数可比较观察结果与理论值，以确定初始假设是否有效。 |
| `CHISQ_DIST` | 返回 χ2 分布的左尾概率。 |
| `CHISQ_DIST_RT` | 返回 χ2 分布的右尾概率。 |
| `CHISQ_INV` | 返回 χ2 分布的左尾概率的反函数。 |
| `CHISQ_INV_RT` | 返回 χ2 分布的右尾概率的反函数。 |
| `CHISQ_TEST` | 返回独立性检验值 |
| `CHITEST` | 返回独立性检验值。 CHITEST 返回卡方 (χ2) 分布的统计值和相应的自由度数。 您可以使用 χ2 检验值确定假设结果是否经过实验验证。 |
| `CHOOSE` | 从值的列表中选择值。 |
| `CHOOSECOLS` | 返回数组中的指定列 |
| `CHOOSEROWS` | 返回数组中的指定行 |
| `CLEAN` | 删除文本中所有非打印字符 |
| `CODE` | 返回文本字符串中第一个字符的数字代码 |
| `COLUMN` | 返回给定单元格引用的列号。 |
| `COLUMNS` | 返回数组或引用的列数。 |
| `COMBIN` | 返回给定数目对象的组合数 |
| `COMBINA` | 返回给定数目对象具有重复项的组合数 |
| `COMPLEX` | 将实系数和虚系数转换为复数 |
| `CONCAT` | 将多个区域和/或字符串的文本组合起来，但不提供分隔符或 IgnoreEmpty 参数。 |
| `CONCATENATE` | 将几个文本项合并为一个文本项 |
| `CONFIDENCE` | 使用正态分布返回总体平均值的置信区间。 |
| `CONFIDENCE_NORM` | 使用正态分布返回总体平均值的置信区间。 |
| `CONFIDENCE_T` | 返回总体平均值的置信区间（使用学生 t-分布） |
| `CONVERT` | 将数字从一种度量系统转换为另一种度量系统 |
| `CORREL` | 返回两个数据集之间的相关系数 |
| `COS` | 返回数字的余弦值。 |
| `COSH` | 返回数字的双曲余弦值 |
| `COT` | 返回以弧度表示的角度的余切值。 |
| `COTH` | 返回数字的双曲余切值 |
| `COUNT` | 计算包含数字的单元格个数以及参数列表中数字的个数。 |
| `COUNTA` | 计算包含任何类型的信息（包括错误值和空文本 ("")）的单元格<br>如果不需要对逻辑值、文本或错误值进行计数（换句话说，只希望对包含数字的单元格进行计数），请使用 COUNT 函数。 |
| `COUNTBLANK` | 计算区域内空白单元格的数量。 |
| `COUNTIF` | 计算区域内符合给定条件的单元格的数量。 |
| `COUNTIFS` | 计算区域内符合多个条件的单元格的数量。 |
| `COUPDAYBS` | 返回从票息期开始到结算日之间的天数 |
| `COUPDAYS` | 返回包含结算日的票息期天数 |
| `COUPDAYSNC` | 返回从结算日到下一票息支付日之间的天数 |
| `COUPNCD` | 返回结算日之后的下一个票息支付日 |
| `COUPNUM` | 返回结算日与到期日之间可支付的票息数 |
| `COUPPCD` | 返回结算日之前的上一票息支付日 |
| `COVAR` | 返回协方差，即两个数据集中每个数据点对的偏差积的平均值。 |
| `COVARIANCE_P` | 返回总体协方差，即两个数据集中每对数据点的偏差乘积的平均值。 |
| `COVARIANCE_S` | 返回样本协方差，即两个数据集中每对数据点的偏差乘积的平均值。 |
| `CRITBINOM` | 返回一个数值，它是使得累积二项式分布的函数值大于等于临界值的最小整数。 此函数可用于质量检验。 例如，使用 CRITBINOM 来决定装配线上整批产品达到检验合格所允许的最多残次品个数。 |
| `CSC` | 返回角度的余割值，以弧度表示。 |
| `CSCH` | 返回角度的双曲余割值 |
| `CUBEKPIMEMBER` | 返回重要性能指示器 (KPI) 属性，并在单元格中显示 KPI 名称。 KPI 是一种用于监控单位绩效的可计量度量值，如每月总利润或季度员工调整。 |
| `CUBEMEMBER` | 返回多维数据集中的成员或元组。 用于验证多维数据集内是否存在成员或元组。 |
| `CUBEMEMBERPROPERTY` | CUBEMEMBERPROPERTY 函数（Excel 中的 多维数据集函数 之一）从多维数据集返回成员属性的值。 用于验证多维数据集内是否存在某个成员名并返回此成员的指定属性。 |
| `CUBERANKEDMEMBER` | 返回集合中的第 n 个或排在一定名次的成员。 用来返回集合中的一个或多个元素，如业绩最好的销售人员或前 10 名的学生。 |
| `CUBESET` | 定义成员或元组的计算集。方法是向服务器上的多维数据集发送一个集合表达式，此表达式创建集合，并随后将该集合返回到 Microsoft Excel。 |
| `CUBESETCOUNT` | 返回集合中的项目数。 |
| `CUBEVALUE` | 从多维数据集中返回汇总值。 |
| `CUMIPMT` | 返回两个付款期之间累积支付的利息 |
| `CUMPRINC` | 返回两个付款期之间为贷款累积支付的本金 |
| `DATE` | 采用三个单独的值并将它们合并为一个日期。 |
| `DATEDIF` | 计算两个日期之间的天数、月数或年数。 此函数在用于计算年龄的公式中很有用。 |
| `DATEVALUE` | 将文本格式的日期转换为序列号。 |
| `DAVERAGE` | 对列表或数据库中满足指定条件的记录字段（列）中的数值求平均值。 |
| `DAY` | 返回以序列数表示的某日期的天数。天数是介于 1 到 31 之间的整数。 |
| `DAYS` | 返回两个日期之间的天数 |
| `DAYS360` | 以一年 360 天为基准计算两个日期间的天数 |
| `DB` | 使用固定余额递减法，返回一笔资产在给定期间内的折旧值 |
| `DBCS` | 将字符串中的半角（单字节）英文字母或片假名更改为全角（双字节）字符 |
| `DCOUNT` | 返回列表或数据库中满足指定条件的记录字段（列）中包含数字的单元格的个数。 |
| `DCOUNTA` | 返回列表或数据库中满足指定条件的记录字段（列）中的非空单元格的个数。 |
| `DDB` | 使用双倍余额递减法或其他指定方法，返回一笔资产在给定期间内的折旧值 |
| `DEC2BIN` | 将十进制数转换为二进制数 |
| `DEC2HEX` | 将十进制数转换为十六进制数 |
| `DEC2OCT` | 将十进制数转换为八进制数 |
| `DECIMAL` | 将给定基数内的数的文本表示转换为十进制数 |
| `DEGREES` | 将弧度转换为度 |
| `DELTA` | 检验两个值是否相等 |
| `DEVSQ` | 返回偏差的平方和 |
| `DGET` | 从列表或数据库的列中提取符合指定条件的单个值。 |
| `DISC` | 返回债券的贴现率 |
| `DMAX` | 返回列表或数据库中满足指定条件的记录字段（列）中的最大数字。 |
| `DMIN` | 返回列表或数据库中满足指定条件的记录字段（列）中的最小数字。 |
| `DOLLAR` | 使用货币格式将数字转换为文本 |
| `DOLLARDE` | 将以分数表示的价格转换为以小数表示的价格 |
| `DOLLARFR` | 将以小数表示的价格转换为以分数表示的价格 |
| `DPRODUCT` | 返回列表或数据库中满足指定条件的记录字段（列）中的数值的乘积。 |
| `DROP` | 从数组的开头或末尾删除指定数量的行或列 |
| `DSTDEV` | 返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体标准偏差。 |
| `DSTDEVP` | 返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为样本总体计算出的总体标准偏差。 |
| `DSUM` | 在列表或数据库中，DSUM 提供字段 (列) 与指定条件匹配的记录中的数字之和。 |
| `DURATION` | 返回定期支付利息的债券的每年期限 |
| `DVAR` | 返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体方差。 |
| `DVARP` | 通过使用列表或数据库中满足指定条件的记录字段（列）中的数字计算样本总体的样本总体方差。 |
| `EDATE` | 返回表示某个日期的序列号，该日期与指定日期 (start_date) 相隔（之前或之后）指示的月份数。 使用函数 EDATE 可以计算与发行日处于一月中同一天的到期日的日期。 |
| `EFFECT` | 返回年有效利率 |
| `ENCODEURL` | ENCODEURL 函数返回 URL 编码的字符串，将某些非字母数字字符替换为百分比符号 (%) 和十六进制数字。 |
| `EOMONTH` | 返回指定月数之前或之后的月份的最后一天的序列号 |
| `EPOCHTODATE` | 将 Unix 纪元时间戳（以秒、毫秒或微秒为单位）转换为世界协调时间 (UTC) 的日期时间。 |
| `ERF` | 返回误差函数 |
| `ERF_PRECISE` | 返回误差函数 |
| `ERFC` | 返回互补误差函数 |
| `ERFC_PRECISE` | 返回从 x 到无穷大积分的互补 ERF 函数 |
| `ERROR_TYPE` | 返回对应于错误类型的数字 |
| `EUROCONVERT` | 用于将数字转换为欧元形式，将数字由欧元形式转换为欧元成员国货币形式，或利用欧元作为中间货币将数字由某一欧元成员国货币转化为另一欧元成员国货币形式（三角转换关系） |
| `EVEN` | 将数字向上舍入到最接近的偶数 |
| `EXACT` | 检查两个文本值是否相同 |
| `EXP` | 返回e的 n 次方 |
| `EXPAND` | 将数组展开或填充到指定的行和列维度 |
| `EXPON_DIST` | 返回指数分布 |
| `EXPONDIST` | 返回指数分布。 使用 EXPONDIST 可以建立事件之间的时间间隔模型，如银行自动提款机支付一次现金所花费的时间。 例如，可通过 EXPONDIST 来确定这一过程最长持续一分钟的发生概率。 |
| `F_DIST` | 返回 F 概率分布 |
| `F_DIST_RT` | 返回 F 概率分布（右尾） |
| `F_INV` | 返回 F 概率分布的反函数 |
| `F_INV_RT` | 返回 F 概率分布（右尾）的反函数 |
| `F_TEST` | 返回 F 检验的结果 |
| `FACT` | 返回数字的阶乘 |
| `FACTDOUBLE` | 返回数字的双倍阶乘 |
| `FALSE` | 返回逻辑值 FALSE。 |
| `FDIST` | 返回两个数据集的（右尾）F 概率分布（变化程度）。 使用此函数可以确定两组数据是否存在变化程度上的不同。 例如，分析进入中学的男生、女生的考试分数，来确定女生分数的变化程度是否与男生不同。 |
| `FILTER` | FILTER 函数可以基于定义的条件筛选一系列数据。 |
| `FILTERXML` | FILTERXML 函数使用指定的 xpath 从 XML 内容返回特定数据。 |
| `FIND` | 在一个文本值中查找另一个文本值（区分大小写） |
| `FINDB` | 在一个文本值中查找另一个文本值（区分大小写） |
| `FINV` | 返回（右尾）F 概率分布函数的反函数值。 如果 p = FDIST(x,...)，则 FINV(p,...) = x。 |
| `FISHER` | 返回 Fisher 变换值 |
| `FISHERINV` | 返回 Fisher 变换的反函数 |
| `FIXED` | 将数字格式设置为具有固定小数位数的文本 |
| `FLATTEN` | 将一个或多个范围中的所有值合并到单列。 |
| `FLOOR` | 向绝对值减小的方向舍入数字 |
| `FLOOR_MATH` | 将数字向下舍入为最接近的整数或最接近的指定基数的倍数 |
| `FLOOR_PRECISE` | 将数字向下舍入为最接近的整数或最接近的指定基数的倍数。 无论该数字的符号如何，该数字都向下舍入。 |
| `FORECAST` | 返回线性趋势值 |
| `FORECAST_ETS` | 通过使用指数平滑 (ETS) 算法的 AAA 版本，返回基于现有（历史）值的未来值 |
| `FORECAST_ETS_CONFINT` | 返回指定目标日期预测值的置信区间 |
| `FORECAST_ETS_SEASONALITY` | 返回 Excel 针对指定时间系列检测到的重复模式的长度 |
| `FORECAST_ETS_STAT` | 返回作为时间序列预测的结果的统计值。 |
| `FORECAST_LINEAR` | 返回基于现有值的未来值 |
| `FORMULATEXT` | 将给定引用的公式返回为文本 |
| `FREQUENCY` | 以垂直数组的形式返回频率分布 |
| `FTEST` | 返回 F 测试的结果。 F 测试返回 array1 和 array2 中的方差没有明显差异的双尾概率。 使用此函数可确定两个示例是否有不同的方差。 例如，给定公立和私立学校的测验分数，可以检验各学校间测验分数的差别程度。 |
| `FV` | 返回一笔投资的未来值 |
| `FVSCHEDULE` | 返回应用一系列复利率计算的初始本金的未来值。 使用 FVSCHEDULE 通过变量或可调节利率计算某项投资未来的价值。 |
| `GAMMA` | 返回 γ 函数值 |
| `GAMMA_DIST` | 返回 γ 分布 |
| `GAMMA_INV` | 返回 γ 累积分布函数的反函数 |
| `GAMMADIST` | 返回伽玛分布函数的函数值。 可以使用此函数来研究呈斜分布的变量。 伽玛分布通常用于排队分析。 |
| `GAMMAINV` | 返回伽玛累积分布函数的反函数值。 如果 p = GAMMADIST(x,...)，则 GAMMAINV(p,...) = x。 使用此函数可以研究有可能呈斜分布的变量。 |
| `GAMMALN` | 返回 γ 函数的自然对数，Γ(x) |
| `GAMMALN_PRECISE` | 返回 γ 函数的自然对数，Γ(x) |
| `GAUSS` | 返回小于标准正态累积分布 0.5 的值 |
| `GCD` | 返回最大公约数 |
| `GEOMEAN` | 返回几何平均值 |
| `GESTEP` | 检验数字是否大于阈值 |
| `GETPIVOTDATA` | GETPIVOTDATA 函数返回数据透视表中的可见数据。 |
| `GROWTH` | 返回指数趋势值 |
| `HARMEAN` | 返回调和平均值 |
| `HEX2BIN` | 将十六进制数转换为二进制数 |
| `HEX2DEC` | 将十六进制数转换为十进制数 |
| `HEX2OCT` | 将十六进制数转换为八进制数 |
| `HLOOKUP` | 在表格的首行或值数组中搜索值，然后返回表格或数组中指定行的所在列中的值。 当比较值位于数据表格的首行时，如果要向下查看指定的行数，则可使用 HLOOKUP。 当比较值位于所需查找的数据的左边一列时，则可使用 VLOOKUP。 |
| `HOUR` | 返回时间值的小时数。 小时数是介于 0 (12:00 A.M.) 到 23 (11:00 P.M.) 之间的整数。 |
| `HSTACK` | 按顺序水平追加数组，以返回更大的数组。 |
| `HYPERLINK` | 在单元格内创建一个超链接。 |
| `HYPGEOM_DIST` | 返回超几何分布 |
| `HYPGEOMDIST` | 返回超几何分布。 如果已知样本量、总体成功次数和总体大小，则 HYPGEOMDIST 返回样本取得已知成功次数的概率。 HYPGEOMDIST 用于处理以下的有限总体问题，在该有限总体中，每次观察结果或为成功或为失败，并且已知样本量的每个子集的选取是等可能的。 |
| `IF` | 指定要执行的逻辑检测 |
| `IFERROR` | 如果公式的计算结果错误，则返回指定的值；否则返回公式的结果 |
| `IFNA` | 如果表达式的结果为 #N/A，则返回指定的值，否则返回表达式的结果 |
| `IFS` | 检查一个或多个条件是否满足，并返回第一个为 TRUE 的条件对应的值。 |
| `IMABS` | 返回复数的绝对值（模数） |
| `IMAGE` | 从给定源返回图像 |
| `IMAGINARY` | 返回以 x+yi 或 x+yj 文本格式表示的复数的虚系数。 |
| `IMARGUMENT` | 返回参数 theta，即以弧度表示的角 |
| `IMCONJUGATE` | 返回复数的共轭复数 |
| `IMCOS` | 返回复数的余弦 |
| `IMCOSH` | 返回复数的双曲余弦值 |
| `IMCOT` | 返回复数的余切值 |
| `IMCOTH` | IMCOTH 函数返回给定复数的双曲余切值。 例如，给定复数“x+yi”会返回“coth(x+yi)”。 |
| `IMCSC` | 返回复数的余割值 |
| `IMCSCH` | 返回复数的双曲余割值 |
| `IMDIV` | 返回两个复数的商 |
| `IMEXP` | 返回复数的指数 |
| `IMLN` | 返回复数的自然对数 |
| `IMLOG` | IMLOG 函数返回某个复数以特定数为底的对数。 |
| `IMLOG10` | 返回复数的以 10 为底的对数 |
| `IMLOG2` | 返回复数的以 2 为底的对数 |
| `IMPOWER` | 返回复数的整数幂 |
| `IMPRODUCT` | 返回多个复数的乘积 |
| `IMREAL` | 返回复数的实系数 |
| `IMSEC` | 返回复数的正割值 |
| `IMSECH` | 返回复数的双曲正割值 |
| `IMSIN` | 返回复数的正弦 |
| `IMSINH` | 返回复数的双曲正弦值 |
| `IMSQRT` | 返回复数的平方根 |
| `IMSUB` | 返回两个复数的差 |
| `IMSUM` | 返回多个复数的和 |
| `IMTAN` | 返回复数的正切值 |
| `IMTANH` | IMTANH 函数返回给定复数的双曲正切值。 例如，给定复数“x+yi”会返回“tanh(x+yi)”。 |
| `INDEX` | 返回指定的行与列交叉处的单元格引用。 如果引用由不连续的选定区域组成，可以选择某一选定区域。 |
| `INDIRECT` | 返回由文本字符串指定的引用。 此函数立即对引用进行计算，并显示其内容。 |
| `INFO` | 返回有关当前操作环境的信息 |
| `INT` | 将数字向下舍入到最接近的整数 |
| `INTERCEPT` | 返回线性回归线的截距 |
| `INTRATE` | 返回完全投资型证券的利率。 |
| `IPMT` | 返回一笔投资在给定期间内支付的利息 |
| `IRR` | 返回一系列现金流的内部收益率 |
| `ISBETWEEN` | 检查所提供的数值是否介于其他两个数字之间（含端值，还是不含端值）。 |
| `ISBLANK` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISDATE` | ISDATE 函数会返回某个值是否为日期。 |
| `ISEMAIL` | 如需检查某个值是否为有效的邮箱，请使用 ISEMAIL 函数。此函数会检查该值是否符合常见的邮箱格式，但不会验证该地址是否实际存在。 |
| `ISERR` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISERROR` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISEVEN` | 如果数字为偶数，则返回 TRUE |
| `ISFORMULA` | 如果有对包含公式的单元格的引用，则返回 TRUE |
| `ISLOGICAL` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISNA` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISNONTEXT` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISNUMBER` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISO_CEILING` | 返回一个数字，该数字向上舍入为最接近的整数或最接近的有效位的倍数 |
| `ISODD` | 如果数字为奇数，则返回 TRUE |
| `ISOMITTED` | 检查 LAMBDA 中的值是否缺失，并返回 TRUE 或 FALSE |
| `ISOWEEKNUM` | 返回给定日期在全年中的 ISO 周数。 |
| `ISPMT` | 计算特定投资期内要支付的利息 |
| `ISREF` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISTEXT` | 这些函数统称为 IS 函数，此类函数可检验指定值并根据结果返回 TRUE 或 FALSE。 例如，如果参数 value 引用的是空单元格，则 ISBLANK 函数返回逻辑值 TRUE；否则，返回 FALSE。 |
| `ISURL` | 检查某个值是否为有效网址。 |
| `KURT` | 返回数据集的峰值 |
| `LAMBDA` | 使用 LAMBDA 函数创建可重用的自定义函数，并使用易记名称调用它们。 新函数在整个工作簿中可用，其调用类似本机 Excel 函数。 |
| `LARGE` | 返回数据集中第 k 个最大值 |
| `LCM` | 返回最小公倍数 |
| `LEFT` | 返回文本值中最左边的字符 |
| `LEFTB` | 返回文本值中最左边的字符。 |
| `LEN` | 返回文本字符串中的字符个数 |
| `LENB` | 返回文本字符串中用于代表字符的字节数。 |
| `LET` | 将名称分配给计算结果 |
| `LINEST` | 返回线性趋势的参数 |
| `LN` | 返回数字的自然对数 |
| `LOG` | 返回数字的以指定底为底的对数 |
| `LOG10` | 返回数字的以 10 为底的对数 |
| `LOGEST` | 返回指数趋势的参数 |
| `LOGINV` | 返回 x 的对数累积分布函数的反函数值，此处的 ln(x) 是服从参数 mean 和 standard_dev 的正态分布。 如果 p = LOGNORMDIST(x,...)，则 LOGINV(p,...) = x。 |
| `LOGNORM_DIST` | 返回对数正态累积分布 |
| `LOGNORM_INV` | 返回对数正态累积分布的反函数 |
| `LOGNORMDIST` | 返回 x 的对数累积分布函数的函数值，此处的 ln(x) 是服从参数 mean 和 standard_dev 的正态分布。 使用此函数可以分析经过对数变换的数据。 |
| `LOOKUP` | 当需要查询一行或一列并查找另一行或列中的相同位置的值时使用 |
| `LOWER` | 将文本转换为小写。 |
| `MAKEARRAY` | 通过应用 LAMBDA 返回指定行和列大小的计算数组 |
| `MAP` | 通过应用 LAMBDA 来创建新值，返回将数组中每个值映射到新值而形成的数组。 |
| `MARGINOFERROR` | 此函数会根据一系列值和置信水平计算误差范围。 |
| `MATCH` | 使用 MATCH 函数在 范围 单元格中搜索特定的项，然后返回该项在此区域中的相对位置。 |
| `MAX` | 返回一组值中的最大值。 |
| `MAXA` | 返回参数列表中的最大值，包括数字、文本和逻辑值。 |
| `MAXIFS` | 返回一组给定条件或标准指定的单元格之间的最大值 |
| `MDETERM` | 返回数组的矩阵行列式的值 |
| `MDURATION` | 返回假设面值为 ￥100 的有价证券的 Macauley 修正期限 |
| `MEDIAN` | 返回给定数值集合的中值 |
| `MID` | 从文本字符串中的指定位置起返回特定个数的字符 |
| `MIDB` | 从文本字符串中的指定位置起返回特定个数的字符 |
| `MIN` | 返回一组值中的最小值。 |
| `MINA` | 返回参数列表中的最小值，包括数字、文本和逻辑值。 |
| `MINIFS` | 返回一组给定条件或标准指定的单元格之间的最小值。 |
| `MINUTE` | 返回时间值中的分钟。 分钟是一个介于 0 到 59 之间的整数。 |
| `MINVERSE` | 返回数组的逆矩阵 |
| `MIRR` | 返回正和负现金流以不同利率进行计算的内部收益率 |
| `MMULT` | 返回两个数组的矩阵乘积 |
| `MOD` | 返回两数相除的余数。 结果的符号与除数相同。 |
| `MODE` | 假设你想要找出 30 年内在关键湿地的鸟类计数样本中发现的最常见的鸟类物种数量，或者想要找出非高峰时段电话支持中心最常发生的电话次数。 若要计算一组数字的模式，请使用 MODE 函数。 |
| `MODE_MULT` | 返回一组数据或数据区域中出现频率最高或重复出现的数值的垂直数组 |
| `MODE_SNGL` | 返回在数据集内出现次数最多的值 |
| `MONTH` | 返回日期（以序列数表示）中的月份。 月份是介于 1（一月）到 12（十二月）之间的整数。 |
| `MROUND` | 返回一个舍入到所需倍数的数字 |
| `MULTINOMIAL` | 返回一组数字的多项式 |
| `MUNIT` | 返回单位矩阵或指定维度 |
| `N` | 返回转换为数字的值 |
| `NA` | 返回错误值 #N/A |
| `NEGBINOM_DIST` | 返回负二项式分布 |
| `NEGBINOMDIST` | 返回负二项式分布。 当成功概率为常量 probability_s 时，NEGBINOMDIST 返回在达到 number_s 次成功之前，出现 number_f 次失败的概率。 此函数与二项式分布相似，只是它的成功次数固定，试验次数为变量。 与二项式分布相同的是，二者均假定试验是独立的。 |
| `NETWORKDAYS` | 返回参数 start_date 和 end_date 之间完整的工作日数值。 工作日不包括周末和专门指定的假期。 可以使用函数 NETWORKDAYS，根据某一特定时期内雇员的工作天数，计算其应计的报酬。 |
| `NETWORKDAYS_INTL` | 返回两个日期之间的所有工作日数，使用参数指示哪些天是周末，以及有多少天是周末。 周末和任何指定为假期的日期不被视为工作日。 |
| `NOMINAL` | 返回年度的名义利率 |
| `NORM_DIST` | 返回正态累积分布 |
| `NORM_INV` | 返回正态累积分布的反函数 |
| `NORM_S_DIST` | 返回标准正态累积分布 |
| `NORM_S_INV` | 返回标准正态累积分布函数的反函数 |
| `NORMDIST` | NORMDIST 函数返回指定平均值和标准偏差的正态分布。 此函数在统计（包括假设测试）中具有广泛的应用。 |
| `NORMINV` | 返回指定平均值和标准偏差的正态累积分布函数的反函数值。 |
| `NORMSDIST` | 返回标准正态累积分布函数的函数值。 该分布的平均值为 0（零），标准偏差为 1。 可以使用此函数代替标准正态曲线面积表。 |
| `NORMSINV` | 返回标准正态累积分布函数的反函数值。 该分布的平均值为 0，标准偏差为 1。 |
| `NOT` | 反转其参数的逻辑值。 |
| `NOW` | 返回当前日期和时间的序列号。 如果在输入该函数前，单元格格式为 “常规” ，Excel 会更改单元格格式，使其与区域设置的日期和时间格式匹配。 可以在功能区 “开始” 选项卡上的 “数字” 组中使用命令来更改日期和时间格式。 |
| `NPER` | 返回投资的期数 |
| `NPV` | 返回基于一系列定期的现金流和贴现率计算的投资的净现值 |
| `NUMBERSTRING` | 将数字转换为中文字符串 |
| `NUMBERVALUE` | 以与区域设置无关的方式将文本转换为数字 |
| `OCT2BIN` | 将八进制数转换为二进制数 |
| `OCT2DEC` | 将八进制数转换为十进制数 |
| `OCT2HEX` | 将八进制数转换为十六进制数 |
| `ODD` | 将数字向上舍入为最接近的奇数 |
| `ODDFPRICE` | 返回每张票面为 ￥100 且第一期为奇数的债券的现价 |
| `ODDFYIELD` | 返回第一期为奇数的债券的收益 |
| `ODDLPRICE` | 返回每张票面为 ￥100 且最后一期为奇数的债券的现价 |
| `ODDLYIELD` | 返回最后一期为奇数的债券的收益 |
| `OFFSET` | 从给定引用中返回引用偏移量 |
| `OR` | 如果 OR 函数的任意参数计算为 TRUE，则其返回 TRUE；如果其所有参数均计算机为 FALSE，则返回 FALSE。 |
| `PDURATION` | 返回投资到达指定值所需的期数 |
| `PEARSON` | 返回 Pearson 乘积矩相关系数 |
| `PERCENTILE` | 返回区域中数值的第 k 个百分点的值。 可以使用此函数来确定接受的阈值。 例如，可以决定检查得分高于第 90 个百分点的候选人。 |
| `PERCENTILE_EXC` | 返回数据集中第 k 个百分点的值 (不含 0 和 1) |
| `PERCENTILE_INC` | 返回数据集中第 k 个百分点的值 (包含 0 和 1) |
| `PERCENTRANK` | PERCENTRANK 函数以数据集的百分比形式返回数据集中某个值的排名，实质上是整个数据集中某个值的相对位置。 例如，可以使用 PERCENTRANK 来确定个人测试分数在同一测试的所有分数字段中的地位。 |
| `PERCENTRANK_EXC` | 返回数据集中值的百分比排位 (不含 0 和 1) |
| `PERCENTRANK_INC` | 返回数据集中值的百分比排位 (包含 0 和 1) |
| `PERMUT` | 返回给定数目对象的排列数 |
| `PERMUTATIONA` | 返回可从总计对象中选择的给定数目对象（含重复）的排列数 |
| `PHI` | 返回标准正态分布的密度函数值 |
| `PHONETIC` | 提取文本字符串中的拼音（汉字注音）字符 |
| `PI` | 返回 pi 的值 |
| `PMT` | 返回年金的定期支付金额 |
| `POISSON` | 返回泊松分布。 泊松分布的一个常见应用是预测特定时间内的事件数，例如 1 分钟内到达收费停车场的汽车数。 |
| `POISSON_DIST` | 返回泊松分布 |
| `POWER` | 返回数字乘幂的结果。 |
| `PPMT` | 返回一笔投资在给定期间内偿还的本金 |
| `PRICE` | 返回每张票面为 ￥100 且定期支付利息的债券的现价 |
| `PRICEDISC` | 返回每张票面为 ￥100 的已贴现债券的现价 |
| `PRICEMAT` | 返回每张票面为 ￥100 且在到期日支付利息的债券的现价 |
| `PROB` | 返回区域中的数值落在指定区间内的概率 |
| `PRODUCT` | 将作为参数提供的所有数字相乘，并返回乘积。 |
| `PROPER` | 将文本值的每个字的首字母大写 |
| `PV` | 返回投资的现值 |
| `QUARTILE` | 返回一组数据的四分位点。 四分位点通常用于销售和调查数据，以对总体进行分组。 例如，您可以使用 QUARTILE 查找总体中前 25% 的收入值。 |
| `QUARTILE_EXC` | 返回数据集的四分位数 (不含 0 和 1) |
| `QUARTILE_INC` | 返回数据集的四分位数 (包含 0 和 1) |
| `QUOTIENT` | 返回除法的整数部分 |
| `RADIANS` | 将度转换为弧度 |
| `RAND` | 返回 0 和 1 之间的一个随机数 |
| `RANDARRAY` | RANDARRAY 函数返回 0 和 1 之间的随机数字数组。但是，你可以指定要填充的行数和列数、最小值和最大值，以及是否返回整个数字或小数值。 |
| `RANDBETWEEN` | 返回位于两个指定数之间的一个随机数 |
| `RANK` | 返回一列数字的数字排位。 数字的排名是其相对于列表中其他值的大小。 (如果要对列表进行排序，则数字的排名将是其位置。) |
| `RANK_AVG` | 返回一列数字的数字排位 |
| `RANK_EQ` | 返回一列数字的数字排位 |
| `RATE` | 返回年金的各期利率 |
| `RECEIVED` | 返回完全投资型债券在到期日收回的金额 |
| `REDUCE` | 通过将 LAMBDA 应用于每个值并返回累加器中的总值，将数组减少为累积值 |
| `REGEXEXTRACT` | 根据正则表达式提取第一个匹配的子字符串。 |
| `REGEXMATCH` | 判断一段文本是否与正则表达式相匹配。 |
| `REGEXREPLACE` | 使用正则表达式将文本字符串中的一部分替换为其他文本字符串。 |
| `REGISTER_ID` | 返回已注册过的指定动态链接库 (DLL) 或代码源的注册号 |
| `REPLACE` | 替换文本中的字符 |
| `REPLACEB` | 替换文本中的字符 |
| `REPT` | 按给定次数重复文本 |
| `RIGHT` | 返回文本值中最右边的字符 |
| `RIGHTB` | 返回文本值中最右边的字符 |
| `ROMAN` | 将阿拉伯数字转换为文本式罗马数字 |
| `ROUND` | 将数字按指定位数舍入 |
| `ROUNDBANK` | 通过“四舍六入五成双”舍入数字 |
| `ROUNDDOWN` | 向绝对值减小的方向舍入数字 |
| `ROUNDUP` | 向绝对值增大的方向舍入数字 |
| `ROW` | 返回给定单元格引用的行号。 |
| `ROWS` | 返回数组或引用的行数。 |
| `RRI` | 返回某项投资增长的等效利率 |
| `RSQ` | 返回 Pearson 乘积矩相关系数的平方 |
| `RTD` | 从支持 COM 自动化的程序中检索实时数据 |
| `SCAN` | 通过将 LAMBDA 应用于每个值来扫描数组，并返回具有每个中间值的数组 |
| `SEARCH` | 在一个文本值中查找另一个文本值（不区分大小写） |
| `SEARCHB` | 在一个文本值中查找另一个文本值（不区分大小写） |
| `SEC` | 返回角度的正割值 |
| `SECH` | 返回角度的双曲正割值 |
| `SECOND` | 将序列号转换为秒 |
| `SEQUENCE` | SEQUENCE 函数可在数组中生成一系列连续数字，例如，1、2、3、4。 |
| `SERIESSUM` | 返回基于公式的幂级数的和 |
| `SHEET` | 返回引用工作表的工作表编号 |
| `SHEETS` | 返回工作簿中的工作表数 |
| `SIGN` | 返回数字的符号 |
| `SIN` | 返回给定角度的正弦值 |
| `SINH` | 返回数字的双曲正弦值 |
| `SKEW` | 返回分布的偏斜度 |
| `SKEW_P` | 返回基于样本总体的分布的偏斜度 |
| `SLN` | 返回固定资产的每期线性折旧费 |
| `SLOPE` | 返回线性回归线的斜率 |
| `SMALL` | 返回数据集中的第 k 个最小值 |
| `SORT` | 对区域或数组的内容进行排序 |
| `SORTBY` | 根据相应区域或数组中的值对区域或数组的内容进行排序 |
| `SQRT` | 返回正平方根 |
| `SQRTPI` | 返回某数与 pi 的乘积的平方根 |
| `STANDARDIZE` | 返回正态化数值 |
| `STDEV` | 根据样本估计标准偏差。 标准偏差可以测量值在平均值（中值）附近分布的范围大小。 |
| `STDEV_P` | 计算基于以参数形式给出的整个样本总体的标准偏差（忽略逻辑值和文本）。 |
| `STDEV_S` | 基于样本估算标准偏差（忽略样本中的逻辑值和文本）。 |
| `STDEVA` | 基于样本（包括数字、文本和逻辑值）估算标准偏差。 |
| `STDEVP` | 根据作为参数给定的整个总体计算标准偏差。 标准偏差可以测量值在平均值（中值）附近分布的范围大小。 |
| `STDEVPA` | 根据作为参数（包括文字和逻辑值）给定的整个总体计算标准偏差。 |
| `STEYX` | 返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差 |
| `SUBSTITUTE` | 在文本字符串中用新文本替换旧文本 |
| `SUBTOTAL` | 返回列表或数据库中的分类汇总。 |
| `SUM` | 将单个值、单元格引用或是区域相加，或者将三者的组合相加。 |
| `SUMIF` | 对范围中符合指定条件的值求和。 |
| `SUMIFS` | 用于计算其满足多个条件的全部参数的总量。 |
| `SUMPRODUCT` | 返回对应的数组元素的乘积和 |
| `SUMSQ` | 返回参数的平方和 |
| `SUMX2MY2` | 返回两数组中对应值平方差之和 |
| `SUMX2PY2` | 返回两数组中对应值的平方和之和 |
| `SUMXMY2` | 返回两个数组中对应值差的平方和 |
| `SWITCH` | 将表达式与值列表进行比较，并返回与第一个匹配值对应的结果。如果没有匹配项，可以返回一个可选的默认值。 |
| `SYD` | 返回某项固定资产按年限总和折旧法计算的每期折旧金额 |
| `T` | 将参数转换为文本 |
| `T_DIST` | 返回学生的 t 概率分布 |
| `T_DIST_2T` | 返回学生的 t 概率分布 (双尾) |
| `T_DIST_RT` | 返回学生的 t 概率分布 (右尾) |
| `T_INV` | 返回学生的 t 概率分布的反函数 |
| `T_INV_2T` | 返回学生的 t 概率分布的反函数 (双尾) |
| `T_TEST` | 返回与学生 t-检验相关的概率 |
| `TAKE` | 从数组的开头或末尾返回指定数量的连续行或列 |
| `TAN` | 返回数字的正切值。 |
| `TANH` | 返回数字的双曲正切值。 |
| `TBILLEQ` | 返回国库券的等价债券收益 |
| `TBILLPRICE` | 返回面值 ￥100 的国库券的价格 |
| `TBILLYIELD` | 返回国库券的收益率 |
| `TDIST` | 返回学生 t 分布的百分点（概率），其中，数字值 (x) 是用来计算百分点的 t 的计算值。 t 分布用于小型样本数据集的假设检验。 可以使用该函数代替 t 分布的临界值表。 |
| `TEXT` | 设置数字格式并将其转换为文本 |
| `TEXTAFTER` | 返回给定字符或字符串之后出现的文本 |
| `TEXTBEFORE` | 返回出现在给定字符或字符串之前的文本 |
| `TEXTJOIN` | 合并来自多个区域和/或字符串的文本 |
| `TEXTSPLIT` | 使用列分隔符和行分隔符拆分文本字符串 |
| `TIME` | 返回特定时间的序列号。 |
| `TIMEVALUE` | 将文本格式的时间转换为序列号。 |
| `TINV` | 返回学生 t 分布的双尾反函数。 |
| `TO_DATE` | 将提供的数字转换为日期。 |
| `TOCOL` | 返回单个列中的数组 |
| `TODAY` | 返回今天日期的序列号 |
| `TOROW` | 返回单个行中的数组 |
| `TRANSPOSE` | 返回数组的转置 |
| `TREND` | 返回线性趋势值 |
| `TRIM` | 除了单词之间的单个空格之外，删除文本中的所有空格。 |
| `TRIMMEAN` | 返回数据集的内部平均值 |
| `TRUE` | 返回逻辑值 TRUE。 |
| `TRUNC` | 将数字截尾取整 |
| `TTEST` | 返回与学生 t 检验相关的概率。 使用函数 TTEST 确定两个样本是否可能来自两个具有相同平均值的基础总体。 |
| `TYPE` | 返回表示值的数据类型的数字 |
| `UNICHAR` | 返回给定数值引用的 Unicode 字符 |
| `UNICODE` | 返回对应于文本的第一个字符的数字（代码点） |
| `UNIQUE` | 返回列表或区域的唯一值列表 |
| `UPPER` | 将文本转换为大写形式 |
| `VALUE` | 将文本参数转换为数字 |
| `VALUETOTEXT` | 从任意指定值返回文本 |
| `VAR` | 计算基于给定样本的方差。 |
| `VAR_P` | 计算基于整个样本总体的方差（忽略样本总体中的逻辑值和文本）。 |
| `VAR_S` | 估算基于样本的方差（忽略样本中的逻辑值和文本）。 |
| `VARA` | 基于样本（包括数字、文本和逻辑值）估算方差 |
| `VARP` | 根据整个总体计算方差。 |
| `VARPA` | 基于样本总体（包括数字、文本和逻辑值）计算标准偏差 |
| `VDB` | 使用余额递减法，返回一笔资产在给定期间或部分期间内的折旧值 |
| `VLOOKUP` | 需要在表格或区域中按行查找内容时，请使用 VLOOKUP。 例如，按部件号查找汽车部件的价格，或根据员工 ID 查找员工姓名。 |
| `VSTACK` | 按顺序垂直追加数组以返回更大的数组 |
| `WEBSERVICE` | WEBSERVICE 函数从 Internet 或 Intranet 上的 Web 服务返回数据。 |
| `WEEKDAY` | 将序列号转换为星期日期 |
| `WEEKNUM` | 将序列号转换为代表该星期为一年中第几周的数字 |
| `WEIBULL` | 返回 Weibull 分布。 可以将该分布用于可靠性分析，例如计算设备出现故障的平均时间。 |
| `WEIBULL_DIST` | 返回 Weibull 分布 |
| `WORKDAY` | 返回指定的若干个工作日之前或之后的日期的序列号 |
| `WORKDAY_INTL` | 返回日期在指定的工作日天数之前或之后的序列号（使用参数指明周末有几天并指明是哪几天） |
| `WRAPCOLS` | 将提供的行或列的值按列换行到指定数量的元素之后以形成新数组。 |
| `WRAPROWS` | 将提供的行或列的值按行换行到指定数量的元素之后以形成新数组。 |
| `XIRR` | 返回一组现金流的内部收益率，这些现金流不一定定期发生 |
| `XLOOKUP` | 函数搜索区域或数组，然后返回与它找到的第一个匹配项对应的项。 如果不存在匹配项，则 XLOOKUP 可以返回最接近的 (近似) 匹配项 |
| `XMATCH` | 在数组或单元格区域中搜索指定项，然后返回项的相对位置。 |
| `XNPV` | 返回一组现金流的净现值，这些现金流不一定定期发生 |
| `XOR` | 如果参数中计算结果为 TRUE 的数量为奇数，则返回 TRUE；如果计算结果为 TRUE 的数量为偶数，则返回 FALSE。 |
| `YEAR` | 返回对应于某个日期的年份。 Year 作为 1900 - 9999 之间的整数返回。 |
| `YEARFRAC` | 返回代表 start_date 和 end_date 之间整天天数的年分数 |
| `YIELD` | 返回定期支付利息的债券的收益 |
| `YIELDDISC` | 返回已贴现债券的年收益；例如，短期国库券 |
| `YIELDMAT` | 返回在到期日支付利息的债券的年收益 |
| `Z_TEST` | 返回 z 检验的单尾概率值 |
| `ZTEST` | 返回 z 检验的单尾概率值。 对于给定的假设总体平均值 μ0，ZTEST 返回样本平均值大于数据集（数组）中观察平均值的概率，即观察样本平均值。 |

## Facade API

完整 Facade API 见 [FFormula](https://docs.univer.ai/zh-CN/reference/facade/formula.md)。

### 引入

> [!INFO: 插件模式提示]
> 仅插件模式需要手动引入 Facade 包。预设模式已内置对应的 Facade 包，无需额外导入。

```typescript
import '@univerjs/engine-formula/facade'
import '@univerjs/sheets-formula/facade'
import '@univerjs/sheets-formula-ui/facade'
```

### 打开范围选择器

`@univerjs/sheets-formula-ui/facade` 会添加 `univerAPI.showRangeSelectorDialog`。如果自定义 UI 需要让用户选择一个或多个单元格范围，可以复用公式相关面板使用的范围选择器。

```typescript
const workbook = univerAPI.getActiveWorkbook()
const worksheet = workbook?.getActiveSheet()

if (workbook && worksheet) {
  await univerAPI.showRangeSelectorDialog({
    unitId: workbook.getId(),
    subUnitId: worksheet.getSheetId(),
    initialValue: [
      {
        unitId: workbook.getId(),
        sheetName: worksheet.getSheetName(),
        range: worksheet.getRange('A1:B2').getRange(),
      },
    ],
    maxRangeCount: 2,
    supportAcrossSheet: true,
    callback: (ranges, isCancel) => {
      console.log(ranges, isCancel)
    },
  })
}
```

### 执行公式计算

```typescript
const formulaEngine = univerAPI.getFormula()
formulaEngine.executeCalculation()
```

### 停止公式计算

```typescript
const formulaEngine = univerAPI.getFormula()
formulaEngine.stopCalculation()
```

### 公式开始计算

```typescript
// 监听公式计算开始事件
const formulaEngine = univerAPI.getFormula()
formulaEngine.calculationStart((forceCalculate) => {
  console.log(forceCalculate)
})
```

### 公式计算中

```typescript
// 监听公式计算中事件
const formulaEngine = univerAPI.getFormula()
formulaEngine.calculationProcessing((stageInfo) => {
  console.log(stageInfo)
})
```

### 公式计算结束

```typescript
// 监听公式计算结束事件
const formulaEngine = univerAPI.getFormula()
formulaEngine.calculationEnd((functionsExecutedState) => {
  console.log(functionsExecutedState)
})
```

### 公式计算结果应用

```typescript
// 监听公式计算结果应用事件
const formulaEngine = univerAPI.getFormula()
formulaEngine.calculationResultApplied((result) => {
  console.log(result)
})

// 等待公式计算结果应用完成
await formulaEngine.onCalculationResultApplied()
```

### 设置初始化数据时公式的计算模式

```typescript
const formulaEngine = univerAPI.getFormula()
formulaEngine.setInitialFormulaComputing(CalculationMode.FORCED)
```

如果这个 API 在 `Starting` 生命周期之后调用，会在下次创建 Univer Sheet 时生效。

如果希望它在本次初始化 Univer Sheet 时生效，可以考虑在 `Ready` 生命周期之前调用它，比如：

```typescript
univerAPI.addEvent(univerAPI.Event.LifeCycleChanged, ({ stage }) => {
  if (stage === LifecycleStages.Starting) {
    const formulaEngine = univerAPI.getFormula()
    formulaEngine.setInitialFormulaComputing(CalculationMode.FORCED)
  }
})
```

### 设置迭代次数

当公式中存在循环引用时，可以通过该 API 设置公式计算时的最大迭代次数。默认值为 1。

```typescript
const formulaEngine = univerAPI.getFormula()
formulaEngine.setMaxIteration(10)
```

### 获取公式字符串的计算结果

异步执行一批公式字符串并返回计算结果：

```typescript
const formulaEngine = univerAPI.getFormula()
const formulas = {
  Book1: {
    Sheet1: {
      2: {
        3: [
          // 完整公式：
          '=SUM(A1:A10) + SQRT(D7)',

          // 分解后的子公式（每个都可以独立计算）：
          'SUM(A1:A10)', // 子公式 1
          'SQRT(D7)', // 子公式 2
          'A1:A10', // 范围引用
          'D7', // 单个单元格引用
        ],
      },
      4: {
        5: ['=A2 + B2 + SQRT(C5)', 'A2', 'B2', 'SQRT(C5)'],
      },
    },
  },
}
const result = await formulaEngine.executeFormulas(formulas)
console.log(result)
```

## 自定义公式

Univer 支持自定义公式，请参考[自定义公式](/blog/custom-formula) 章节了解如何实现。

## 常见问题

### `HYPERLINK` 公式单元格无法操作超链接

需要引入 Univer Sheets 的超链接插件, 见[超链接](https://docs.univer.ai/zh-CN/guides/sheets/features/hyper-link.md)模块。
