| 
									
										
										
										
											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
										 |  |  | 
 |