2017-03-20 09:02:25 +00:00
|
|
|
#### Formulae
|
|
|
|
|
|
|
|
The A1-style formula string is stored in the `f` field. Even though different
|
|
|
|
file formats store the formulae in different ways, the formats are translated.
|
|
|
|
Even though some formats store formulae with a leading equal sign, CSF formulae
|
|
|
|
do not start with `=`.
|
|
|
|
|
2017-04-30 20:37:53 +00:00
|
|
|
<details>
|
2022-03-03 08:35:39 +00:00
|
|
|
<summary><b>Formulae File Format Support</b> (click to show)</summary>
|
|
|
|
|
|
|
|
| Storage Representation | Formats | Read | Write |
|
|
|
|
|:-----------------------|:-------------------------|:-----:|:-----:|
|
|
|
|
| A1-style strings | XLSX | ✔ | ✔ |
|
|
|
|
| RC-style strings | XLML and plain text | ✔ | ✔ |
|
|
|
|
| BIFF Parsed formulae | XLSB and all XLS formats | ✔ | |
|
|
|
|
| OpenFormula formulae | ODS/FODS/UOS | ✔ | ✔ |
|
|
|
|
| Lotus Parsed formulae | All Lotus WK_ formats | ✔ | |
|
|
|
|
|
|
|
|
Since Excel prohibits named cells from colliding with names of A1 or RC style
|
|
|
|
cell references, a (not-so-simple) regex conversion is possible. BIFF Parsed
|
|
|
|
formulae and Lotus Parsed formulae have to be explicitly unwound. OpenFormula
|
|
|
|
formulae can be converted with regular expressions.
|
|
|
|
|
|
|
|
Shared formulae are decompressed and each cell has the formula corresponding to
|
|
|
|
its cell. Writers generally do not attempt to generate shared formulae.
|
|
|
|
</details>
|
|
|
|
|
|
|
|
**Single-Cell Formulae**
|
|
|
|
|
|
|
|
For simple formulae, the `f` key of the desired cell can be set to the actual
|
|
|
|
formula text. This worksheet represents `A1=1`, `A2=2`, and `A3=A1+A2`:
|
2017-03-20 09:02:25 +00:00
|
|
|
|
|
|
|
```js
|
2022-03-03 08:35:39 +00:00
|
|
|
var worksheet = {
|
2017-09-24 23:40:09 +00:00
|
|
|
"!ref": "A1:A3",
|
|
|
|
A1: { t:'n', v:1 },
|
|
|
|
A2: { t:'n', v:2 },
|
|
|
|
A3: { t:'n', v:3, f:'A1+A2' }
|
2022-03-03 08:35:39 +00:00
|
|
|
};
|
2017-03-20 09:02:25 +00:00
|
|
|
```
|
|
|
|
|
2022-03-03 08:35:39 +00:00
|
|
|
Utilities like `aoa_to_sheet` will accept cell objects in lieu of values:
|
|
|
|
|
|
|
|
```js
|
|
|
|
var worksheet = XLSX.utils.aoa_to_sheet([
|
|
|
|
[ 1 ], // A1
|
|
|
|
[ 2 ], // A2
|
|
|
|
[ {t: "n", v: 3, f: "A1+A2"} ] // A3
|
|
|
|
]);
|
|
|
|
```
|
2017-03-20 09:02:25 +00:00
|
|
|
|
|
|
|
Cells with formula entries but no value will be serialized in a way that Excel
|
|
|
|
and other spreadsheet tools will recognize. This library will not automatically
|
2022-03-03 08:35:39 +00:00
|
|
|
compute formula results! For example, the following worksheet will include the
|
|
|
|
`BESSELJ` function but the result will not be available in JavaScript:
|
2017-04-30 20:37:53 +00:00
|
|
|
|
2017-03-20 09:02:25 +00:00
|
|
|
```js
|
2022-03-03 08:35:39 +00:00
|
|
|
var worksheet = XLSX.utils.aoa_to_sheet([
|
|
|
|
[ 3.14159, 2 ], // Row "1"
|
|
|
|
[ { t:'n', f:'BESSELJ(A1,B1)' } ] // Row "2" will be calculated on file open
|
2017-03-20 09:02:25 +00:00
|
|
|
}
|
|
|
|
```
|
2022-03-03 08:35:39 +00:00
|
|
|
|
|
|
|
If the actual results are needed in JS, [SheetJS Pro](https://sheetjs.com/pro)
|
|
|
|
offers a formula calculator component for evaluating expressions, updating
|
|
|
|
values and dependent cells, and refreshing entire workbooks.
|
|
|
|
|
2017-03-20 09:02:25 +00:00
|
|
|
|
|
|
|
**Array Formulae**
|
|
|
|
|
2022-03-03 08:35:39 +00:00
|
|
|
_Assign an array formula_
|
|
|
|
|
|
|
|
```js
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
|
|
|
|
```
|
|
|
|
|
2017-03-20 09:02:25 +00:00
|
|
|
Array formulae are stored in the top-left cell of the array block. All cells
|
|
|
|
of an array formula have a `F` field corresponding to the range. A single-cell
|
|
|
|
formula can be distinguished from a plain formula by the presence of `F` field.
|
|
|
|
|
|
|
|
For example, setting the cell `C1` to the array formula `{=SUM(A1:A3*B1:B3)}`:
|
|
|
|
|
|
|
|
```js
|
2022-03-03 08:35:39 +00:00
|
|
|
// API function
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, "C1", "SUM(A1:A3*B1:B3)");
|
|
|
|
|
|
|
|
// ... OR raw operations
|
2017-03-20 09:02:25 +00:00
|
|
|
worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };
|
|
|
|
```
|
|
|
|
|
|
|
|
For a multi-cell array formula, every cell has the same array range but only the
|
2017-04-16 04:32:13 +00:00
|
|
|
first cell specifies the formula. Consider `D1:D3=A1:A3*B1:B3`:
|
2017-03-20 09:02:25 +00:00
|
|
|
|
|
|
|
```js
|
2022-03-03 08:35:39 +00:00
|
|
|
// API function
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, "D1:D3", "A1:A3*B1:B3");
|
|
|
|
|
|
|
|
// ... OR raw operations
|
2017-03-20 09:02:25 +00:00
|
|
|
worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
|
|
|
|
worksheet['D2'] = { t:'n', F:"D1:D3" };
|
|
|
|
worksheet['D3'] = { t:'n', F:"D1:D3" };
|
|
|
|
```
|
|
|
|
|
|
|
|
Utilities and writers are expected to check for the presence of a `F` field and
|
|
|
|
ignore any possible formula element `f` in cells other than the starting cell.
|
|
|
|
They are not expected to perform validation of the formulae!
|
|
|
|
|
|
|
|
|
2022-03-03 08:35:39 +00:00
|
|
|
**Dynamic Array Formulae**
|
|
|
|
|
|
|
|
_Assign a dynamic array formula_
|
|
|
|
|
|
|
|
```js
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);
|
|
|
|
```
|
|
|
|
|
|
|
|
Released in 2020, Dynamic Array Formulae are supported in the XLSX/XLSM and XLSB
|
|
|
|
file formats. They are represented like normal array formulae but have special
|
|
|
|
cell metadata indicating that the formula should be allowed to adjust the range.
|
|
|
|
|
|
|
|
An array formula can be marked as dynamic by setting the cell's `D` property to
|
|
|
|
true. The `F` range is expected but can be the set to the current cell:
|
|
|
|
|
|
|
|
```js
|
|
|
|
// API function
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);
|
|
|
|
|
|
|
|
// ... OR raw operations
|
|
|
|
worksheet['C1'] = { t: "s", f: "_xlfn.UNIQUE(A1:A3)", F:"C1", D: 1 }; // dynamic
|
|
|
|
```
|
|
|
|
|
|
|
|
**Localization with Function Names**
|
|
|
|
|
|
|
|
SheetJS operates at the file level. Excel stores formula expressions using the
|
|
|
|
English (United States) function names. For non-English users, Excel uses a
|
|
|
|
localized set of function names.
|
|
|
|
|
|
|
|
For example, when the computer language and region is set to French (France),
|
|
|
|
Excel interprets `=SOMME(A1:C3)` as if `SOMME` is the `SUM` function. However,
|
|
|
|
in the actual file, Excel stores `SUM(A1:C3)`.
|
|
|
|
|
|
|
|
**Prefixed "Future Functions"**
|
|
|
|
|
|
|
|
Functions introduced in newer versions of Excel are prefixed with `_xlfn.` when
|
|
|
|
stored in files. When writing formula expressions using these functions, the
|
|
|
|
prefix is required for maximal compatibility:
|
|
|
|
|
|
|
|
```js
|
|
|
|
// Broadest compatibility
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);
|
|
|
|
|
|
|
|
// Can cause errors in spreadsheet software
|
|
|
|
XLSX.utils.sheet_set_array_formula(worksheet, "C1", "UNIQUE(A1:A3)", 1);
|
|
|
|
```
|
|
|
|
|
|
|
|
When reading a file, the `xlfn` option preserves the prefixes.
|
2017-03-20 09:02:25 +00:00
|
|
|
|
2017-04-30 20:37:53 +00:00
|
|
|
<details>
|
2022-03-03 08:35:39 +00:00
|
|
|
<summary><b> Functions requiring `_xlfn.` prefix</b> (click to show)</summary>
|
2017-03-20 09:02:25 +00:00
|
|
|
|
2022-03-03 08:35:39 +00:00
|
|
|
This list is growing with each Excel release.
|
|
|
|
|
|
|
|
```
|
|
|
|
ACOT
|
|
|
|
ACOTH
|
|
|
|
AGGREGATE
|
|
|
|
ARABIC
|
|
|
|
BASE
|
|
|
|
BETA.DIST
|
|
|
|
BETA.INV
|
|
|
|
BINOM.DIST
|
|
|
|
BINOM.DIST.RANGE
|
|
|
|
BINOM.INV
|
|
|
|
BITAND
|
|
|
|
BITLSHIFT
|
|
|
|
BITOR
|
|
|
|
BITRSHIFT
|
|
|
|
BITXOR
|
|
|
|
BYCOL
|
|
|
|
BYROW
|
|
|
|
CEILING.MATH
|
|
|
|
CEILING.PRECISE
|
|
|
|
CHISQ.DIST
|
|
|
|
CHISQ.DIST.RT
|
|
|
|
CHISQ.INV
|
|
|
|
CHISQ.INV.RT
|
|
|
|
CHISQ.TEST
|
|
|
|
COMBINA
|
|
|
|
CONFIDENCE.NORM
|
|
|
|
CONFIDENCE.T
|
|
|
|
COT
|
|
|
|
COTH
|
|
|
|
COVARIANCE.P
|
|
|
|
COVARIANCE.S
|
|
|
|
CSC
|
|
|
|
CSCH
|
|
|
|
DAYS
|
|
|
|
DECIMAL
|
|
|
|
ERF.PRECISE
|
|
|
|
ERFC.PRECISE
|
|
|
|
EXPON.DIST
|
|
|
|
F.DIST
|
|
|
|
F.DIST.RT
|
|
|
|
F.INV
|
|
|
|
F.INV.RT
|
|
|
|
F.TEST
|
|
|
|
FIELDVALUE
|
|
|
|
FILTERXML
|
|
|
|
FLOOR.MATH
|
|
|
|
FLOOR.PRECISE
|
|
|
|
FORMULATEXT
|
|
|
|
GAMMA
|
|
|
|
GAMMA.DIST
|
|
|
|
GAMMA.INV
|
|
|
|
GAMMALN.PRECISE
|
|
|
|
GAUSS
|
|
|
|
HYPGEOM.DIST
|
|
|
|
IFNA
|
|
|
|
IMCOSH
|
|
|
|
IMCOT
|
|
|
|
IMCSC
|
|
|
|
IMCSCH
|
|
|
|
IMSEC
|
|
|
|
IMSECH
|
|
|
|
IMSINH
|
|
|
|
IMTAN
|
|
|
|
ISFORMULA
|
|
|
|
ISOMITTED
|
|
|
|
ISOWEEKNUM
|
|
|
|
LAMBDA
|
|
|
|
LET
|
|
|
|
LOGNORM.DIST
|
|
|
|
LOGNORM.INV
|
|
|
|
MAKEARRAY
|
|
|
|
MAP
|
|
|
|
MODE.MULT
|
|
|
|
MODE.SNGL
|
|
|
|
MUNIT
|
|
|
|
NEGBINOM.DIST
|
|
|
|
NORM.DIST
|
|
|
|
NORM.INV
|
|
|
|
NORM.S.DIST
|
|
|
|
NORM.S.INV
|
|
|
|
NUMBERVALUE
|
|
|
|
PDURATION
|
|
|
|
PERCENTILE.EXC
|
|
|
|
PERCENTILE.INC
|
|
|
|
PERCENTRANK.EXC
|
|
|
|
PERCENTRANK.INC
|
|
|
|
PERMUTATIONA
|
|
|
|
PHI
|
|
|
|
POISSON.DIST
|
|
|
|
QUARTILE.EXC
|
|
|
|
QUARTILE.INC
|
|
|
|
QUERYSTRING
|
|
|
|
RANDARRAY
|
|
|
|
RANK.AVG
|
|
|
|
RANK.EQ
|
|
|
|
REDUCE
|
|
|
|
RRI
|
|
|
|
SCAN
|
|
|
|
SEC
|
|
|
|
SECH
|
|
|
|
SEQUENCE
|
|
|
|
SHEET
|
|
|
|
SHEETS
|
|
|
|
SKEW.P
|
|
|
|
SORTBY
|
|
|
|
STDEV.P
|
|
|
|
STDEV.S
|
|
|
|
T.DIST
|
|
|
|
T.DIST.2T
|
|
|
|
T.DIST.RT
|
|
|
|
T.INV
|
|
|
|
T.INV.2T
|
|
|
|
T.TEST
|
|
|
|
UNICHAR
|
|
|
|
UNICODE
|
|
|
|
UNIQUE
|
|
|
|
VAR.P
|
|
|
|
VAR.S
|
|
|
|
WEBSERVICE
|
|
|
|
WEIBULL.DIST
|
|
|
|
XLOOKUP
|
|
|
|
XOR
|
|
|
|
Z.TEST
|
|
|
|
```
|
2017-03-20 09:02:25 +00:00
|
|
|
|
2017-04-30 20:37:53 +00:00
|
|
|
</details>
|
2017-04-28 07:28:03 +00:00
|
|
|
|