291 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			291 lines
		
	
	
		
			6.6 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 `=`. | ||
|  | 
 | ||
|  | <details> | ||
|  |   <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`: | ||
|  | 
 | ||
|  | ```js | ||
|  | var worksheet = { | ||
|  |   "!ref": "A1:A3", | ||
|  |   A1: { t:'n', v:1 }, | ||
|  |   A2: { t:'n', v:2 }, | ||
|  |   A3: { t:'n', v:3, f:'A1+A2' } | ||
|  | }; | ||
|  | ``` | ||
|  | 
 | ||
|  | 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 | ||
|  | ]); | ||
|  | ``` | ||
|  | 
 | ||
|  | 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, the following worksheet will include the | ||
|  | `BESSELJ` function but the result will not be available in JavaScript: | ||
|  | 
 | ||
|  | ```js | ||
|  | 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 | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | 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. | ||
|  | 
 | ||
|  | 
 | ||
|  | **Array Formulae** | ||
|  | 
 | ||
|  | _Assign an array formula_ | ||
|  | 
 | ||
|  | ```js | ||
|  | XLSX.utils.sheet_set_array_formula(worksheet, range, formula); | ||
|  | ``` | ||
|  | 
 | ||
|  | 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 | ||
|  | // API function | ||
|  | XLSX.utils.sheet_set_array_formula(worksheet, "C1", "SUM(A1:A3*B1:B3)"); | ||
|  | 
 | ||
|  | // ... OR raw operations | ||
|  | 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 specifies the formula.  Consider `D1:D3=A1:A3*B1:B3`: | ||
|  | 
 | ||
|  | ```js | ||
|  | // API function | ||
|  | XLSX.utils.sheet_set_array_formula(worksheet, "D1:D3", "A1:A3*B1:B3"); | ||
|  | 
 | ||
|  | // ... OR raw operations | ||
|  | 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! | ||
|  | 
 | ||
|  | 
 | ||
|  | **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. | ||
|  | 
 | ||
|  | <details> | ||
|  |   <summary><b> Functions requiring `_xlfn.` prefix</b> (click to show)</summary> | ||
|  | 
 | ||
|  | 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 | ||
|  | ``` | ||
|  | 
 | ||
|  | </details> | ||
|  | 
 |