forked from sheetjs/sheetjs
80 lines
2.9 KiB
Markdown
80 lines
2.9 KiB
Markdown
|
#### 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 `=`.
|
||
|
|
||
|
The worksheet representation of A1=1, A2=2, A3=A1+A2:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
"!ref": "A1:A3",
|
||
|
A1: { t:'n', v:1 },
|
||
|
A2: { t:'n', v:2 },
|
||
|
A3: { t:'n', v:3, f:'A1+A2' }
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Shared formulae are decompressed and each cell has the formula corresponding to
|
||
|
its cell. Writers generally do not attempt to generate shared formulae.
|
||
|
|
||
|
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
|
||
|
compute formula results! For example, to compute `BESSELJ` in a worksheet:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
"!ref": "A1:A3",
|
||
|
A1: { t:'n', v:3.14159 },
|
||
|
A2: { t:'n', v:2 },
|
||
|
A3: { t:'n', f:'BESSELJ(A1,A2)' }
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Array Formulae**
|
||
|
|
||
|
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
|
||
|
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
|
||
|
first cell has content. Consider `D1:D3=A1:A3*B1:B3`:
|
||
|
|
||
|
```js
|
||
|
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!
|
||
|
|
||
|
**Formula Output**
|
||
|
|
||
|
The `sheet_to_formulae` method generates one line per formula or array formula.
|
||
|
Array formulae are rendered in the form `range=formula` while plain cells are
|
||
|
rendered in the form `cell=formula or value`. Note that string literals are
|
||
|
prefixed with an apostrophe `'`, consistent with Excel's formula bar display.
|
||
|
|
||
|
**Formulae File Format Details**
|
||
|
|
||
|
| Storage Representation | Formats | Read | Write |
|
||
|
|:-----------------------|:-------------------------|:-----:|:-----:|
|
||
|
| A1-style strings | XLSX | :o: | :o: |
|
||
|
| RC-style strings | XLML and plaintext | :o: | :o: |
|
||
|
| BIFF Parsed formulae | XLSB and all XLS formats | :o: | |
|
||
|
| OpenFormula formulae | ODS/FODS/UOS | :o: | :o: |
|
||
|
|
||
|
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 have to be explicitly unwound. OpenFormula formulae can be converted
|
||
|
with regexes for the most part.
|