forked from sheetjs/docs.sheetjs.com
		
	nf
This commit is contained in:
		
							parent
							
								
									c62069a7e4
								
							
						
					
					
						commit
						23cb01e318
					
				| @ -11,7 +11,7 @@ Cell objects are plain JS objects with keys and values following the convention: | ||||
| |     | **Core Cell Properties** ([More Info](#data-types))                    | | ||||
| | `v` | raw value (number, string, Date object, boolean)                       | | ||||
| | `t` | type: `b` Boolean, `e` Error, `n` Number, `d` Date, `s` Text, `z` Stub | | ||||
| |     | **Number Formats** ([More Info](/docs/csf/features#number-formats))    | | ||||
| |     | **Number Formats** ([More Info](/docs/csf/features/nf))                | | ||||
| | `z` | number format string associated with the cell (if requested)           | | ||||
| | `w` | formatted text (if applicable)                                         | | ||||
| |     | **Formulae** ([More Info](/docs/csf/features/formulae))                | | ||||
|  | ||||
| @ -10,7 +10,7 @@ sidebar_position: 5 | ||||
| Defined names have evolved over the decades, with new features added over time: | ||||
| 
 | ||||
| - "English" refers to defined names with English letters and numbers (ASCII) | ||||
| - "Unicode" refers to defined names that non-English characters. | ||||
| - "Unicode" refers to defined names with non-English characters. | ||||
| - "Comment" refers to comments that can be attached to defined names. | ||||
| 
 | ||||
| | Formats           | English | Unicode | Comment | | ||||
|  | ||||
							
								
								
									
										218
									
								
								docz/docs/07-csf/07-features/06-nf.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										218
									
								
								docz/docs/07-csf/07-features/06-nf.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,218 @@ | ||||
| --- | ||||
| sidebar_position: 6 | ||||
| --- | ||||
| 
 | ||||
| # Number Formats | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>File Format Support</b> (click to show)</summary> | ||||
| 
 | ||||
| Legacy formats like CSV mix "content" and "presentation". There is no true | ||||
| concept of a "number format" distinct from the number itself. For specific | ||||
| formats, the library will guess the number format. | ||||
| 
 | ||||
| | Formats           | Basic | Storage Representation | | ||||
| |:------------------|:-----:|:-----------------------| | ||||
| | XLSX / XLSM       |   ✔   | Number Format Code     | | ||||
| | XLSB              |   ✔   | Number Format Code     | | ||||
| | XLS               |   ✔   | Number Format Code     | | ||||
| | XLML              |   ✔   | Number Format Code     | | ||||
| | SYLK              |   R   | Number Format Code     | | ||||
| | ODS / FODS / UOS  |   ✔   | XML                    | | ||||
| | NUMBERS           |       | Binary encoding        | | ||||
| | WK\*              |       | Binary encoding        | | ||||
| | WQ\* / WB\* / QPW |       | Binary encoding        | | ||||
| | DBF               |       | Implied by field types | | ||||
| | CSV               |   *   | N/A                    | | ||||
| | PRN               |   *   | N/A                    | | ||||
| | DIF               |   *   | N/A                    | | ||||
| | RTF               |   *   | N/A                    | | ||||
| 
 | ||||
| Asterisks (*) mark formats that mix content and presentation. Synthetic number | ||||
| formats may be generated for special values. | ||||
| 
 | ||||
| The letter R (R) marks features parsed but not written in the format. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| The following example generates a file with some common number formats: | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSSimpleNF(props) { | ||||
|   const xport = React.useCallback(async () => { | ||||
|     /* Create worksheet from simple data */ | ||||
|     const ws = XLSX.utils.aoa_to_sheet([ | ||||
|       ["Currency", 3.5], | ||||
|       ["Thousands", 7262], | ||||
|       ["Percent", 0.0219] | ||||
|     ]); | ||||
|     /* assign number formats */ | ||||
|     ws["B1"].z = '"$"#,##0_);\\("$"#,##0\\)'; | ||||
|     ws["B2"].z = '#,##0'; | ||||
|     ws["B3"].z = "0.00%"; | ||||
| 
 | ||||
|     /* Export to file (start a download) */ | ||||
|     const wb = XLSX.utils.book_new(); | ||||
|     XLSX.utils.book_append_sheet(wb, ws, "Formats"); | ||||
|     XLSX.writeFile(wb, "SheetJSSimpleNF.xlsx"); | ||||
|   }); | ||||
| 
 | ||||
|   return ( <button onClick={xport}><b>Export XLSX!</b></button> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Values and Formatting | ||||
| 
 | ||||
| Typically spreadsheets will include formatted text such as currencies (`$3.50`) | ||||
| or large numbers with thousands separators (`7,262`) or percentages (`2.19%`). | ||||
| 
 | ||||
| To simplify editing, the applications will store the underlying values and the | ||||
| number formats separately. For example, `$3.50` will be represented as the value | ||||
| `3.5` with a number format that mandates a `$` sigil and 2 decimal places. | ||||
| 
 | ||||
| Some file formats like CSV only support the formatted text. Native formats for | ||||
| spreadsheet applications including Lotus 1-2-3 and Excel will store the value | ||||
| and number format separately. | ||||
| 
 | ||||
| ### Dates and Times | ||||
| 
 | ||||
| Many spreadsheet formats store dates and times using a number that represents | ||||
| the number of seconds or days after some epoch. Dates are covered in more detail | ||||
| [in the dedicated section](/docs/csf/features/dates). | ||||
| 
 | ||||
| ## SheetJS Representation | ||||
| 
 | ||||
| Number formats and values are attached to cells. The following keys are used: | ||||
| 
 | ||||
| | Key | Description                                                            | | ||||
| | --- | ---------------------------------------------------------------------- | | ||||
| | `v` | raw value (number, string, Date object, boolean)                       | | ||||
| | `z` | number format string associated with the cell (if requested)           | | ||||
| | `w` | formatted text (if applicable)                                         | | ||||
| 
 | ||||
| The `cell.w` formatted text for each cell is produced from `cell.v` and `cell.z` | ||||
| format.  If the format is not specified, the Excel `General` format is used. | ||||
| 
 | ||||
| By default, parsers do not attach number formats to cells.  The `cellNF` option | ||||
| instructs `XLSX.read` or `XLSX.readFile` to save the formats. | ||||
| 
 | ||||
| ### Number Format Strings | ||||
| 
 | ||||
| The `z` format string follows the Excel persistence rules as described in | ||||
| ECMA-376 18.8.31 (Number Formats). For more info, see the Excel documentation | ||||
| article `Create or delete a custom number format` | ||||
| 
 | ||||
| The rules are slightly different from how Excel displays custom number formats. | ||||
| In particular, literal characters must be wrapped in double quotes or preceded | ||||
| by a backslash. | ||||
| 
 | ||||
| The following example prints number formats from a user-specified file: | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSExtractNF(props) { | ||||
|   const [rows, setRows] = React.useState([]) | ||||
| 
 | ||||
|   return ( <> | ||||
|     <input type="file" onChange={async(e) => { | ||||
|       /* parse workbook with cellNF: true */ | ||||
|       const file = e.target.files[0]; | ||||
|       const data = await file.arrayBuffer(); | ||||
|       const wb = XLSX.read(data, {cellNF: true}); | ||||
| 
 | ||||
|       const formats = {}; | ||||
|       wb.SheetNames.forEach(n => { | ||||
|         var ws = wb.Sheets[n]; if(!ws || !ws["!ref"]) return; | ||||
|         var ref = XLSX.utils.decode_range(ws["!ref"]); | ||||
|         for(var R = 0; R <= ref.e.r; ++R) for(var C = 0; C <= ref.e.c; ++C) { | ||||
|           var addr = XLSX.utils.encode_cell({r:R,c:C}); | ||||
|           if(!ws[addr] || !ws[addr].z) continue; | ||||
|           if(formats[ws[addr].z]) continue; | ||||
|           formats[ws[addr].z] = `'${n}'!${addr}`; | ||||
|           setRows(Object.entries(formats)); | ||||
|         } | ||||
|       }); | ||||
|     }}/> | ||||
|     <table><tr><th>Format</th><th>JSON</th><th>Example Cell</th></tr> | ||||
|     {rows.map((r,R) => ( <tr key={R}> | ||||
|       <td><code>{r[0]}</code></td> | ||||
|       <td><code>{JSON.stringify(r[0])}</code></td> | ||||
|       <td>{r[1]}</td> | ||||
|     </tr> ))} | ||||
|     </table> | ||||
|   </> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Miscellany | ||||
| 
 | ||||
| The default formats are listed in ECMA-376 18.8.30: | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Default Number Formats</b> (click to show)</summary> | ||||
| 
 | ||||
| | ID | Format                     | | ||||
| |---:|:---------------------------| | ||||
| |  0 | `General`                  | | ||||
| |  1 | `0`                        | | ||||
| |  2 | `0.00`                     | | ||||
| |  3 | `#,##0`                    | | ||||
| |  4 | `#,##0.00`                 | | ||||
| |  9 | `0%`                       | | ||||
| | 10 | `0.00%`                    | | ||||
| | 11 | `0.00E+00`                 | | ||||
| | 12 | `# ?/?`                    | | ||||
| | 13 | `# ??/??`                  | | ||||
| | 14 | `m/d/yy` (see below)       | | ||||
| | 15 | `d-mmm-yy`                 | | ||||
| | 16 | `d-mmm`                    | | ||||
| | 17 | `mmm-yy`                   | | ||||
| | 18 | `h:mm AM/PM`               | | ||||
| | 19 | `h:mm:ss AM/PM`            | | ||||
| | 20 | `h:mm`                     | | ||||
| | 21 | `h:mm:ss`                  | | ||||
| | 22 | `m/d/yy h:mm`              | | ||||
| | 37 | `#,##0 ;(#,##0)`           | | ||||
| | 38 | `#,##0 ;[Red](#,##0)`      | | ||||
| | 39 | `#,##0.00;(#,##0.00)`      | | ||||
| | 40 | `#,##0.00;[Red](#,##0.00)` | | ||||
| | 45 | `mm:ss`                    | | ||||
| | 46 | `[h]:mm:ss`                | | ||||
| | 47 | `mmss.0`                   | | ||||
| | 48 | `##0.0E+0`                 | | ||||
| | 49 | `@`                        | | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| Format 14 (`m/d/yy`) is localized by Excel: even though the file specifies that | ||||
| number format, it will be drawn differently based on system settings.  It makes | ||||
| sense when the producer and consumer of files are in the same locale, but that | ||||
| is not always the case over the Internet.  To get around this ambiguity, parse | ||||
| functions accept the `dateNF` option to override the interpretation of that | ||||
| specific format string. | ||||
| 
 | ||||
| ### Excel Format Categories | ||||
| 
 | ||||
| Excel officially recognizes a small number of formats as "Currency" and another | ||||
| set of formats as "Accounting".  The exact formats in `en-US` are listed below: | ||||
| 
 | ||||
| #### Currency | ||||
| 
 | ||||
| | JS String                                | Decimal Places | Negative Color | | ||||
| |:-----------------------------------------|:---------------|:---------------| | ||||
| | `'"$"#,##0_);\\("$"#,##0\\)'`            | 0              | Black          | | ||||
| | `'"$"#,##0_);[Red]\\("$"#,##0\\)'`       | 0              | Red            | | ||||
| | `'"$"#,##0.00_);\\("$"#,##0.00\\)'`      | 2              | Black          | | ||||
| | `'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)'` | 2              | Red            | | ||||
| 
 | ||||
| #### Accounting | ||||
| 
 | ||||
| | JS String                                                        | Decimal | Sigil | | ||||
| |:-----------------------------------------------------------------|:--------|:------| | ||||
| | `'_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)'`                  | 0       |       | | ||||
| | `'_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)'`         | 0       | `$`   | | ||||
| | `'_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)'`          | 2       |       | | ||||
| | `'_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'` | 2       | `$`   | | ||||
| 
 | ||||
| For other locales, the formats can be discovered by creating a file with the | ||||
| desired format and testing with [the Number Format Strings demo](#number-format-strings) | ||||
| 
 | ||||
| @ -138,82 +138,6 @@ follow the priority order: | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Number Formats | ||||
| 
 | ||||
| The `cell.w` formatted text for each cell is produced from `cell.v` and `cell.z` | ||||
| format.  If the format is not specified, the Excel `General` format is used. | ||||
| The format can either be specified as a string or as an index into the format | ||||
| table.  Readers are expected to populate `workbook.SSF` with the number format | ||||
| table.  Writers are expected to serialize the table. | ||||
| 
 | ||||
| The following example creates a custom format from scratch: | ||||
| 
 | ||||
| ```js | ||||
| var wb = { | ||||
|   SheetNames: ["Sheet1"], | ||||
|   Sheets: { | ||||
|     Sheet1: { | ||||
|       "!ref":"A1:C1", | ||||
|       A1: { t:"n", v:10000 },                    // <-- General format | ||||
|       B1: { t:"n", v:10000, z: "0%" },           // <-- Builtin format | ||||
|       C1: { t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format | ||||
|     } | ||||
|   } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| The rules are slightly different from how Excel displays custom number formats. | ||||
| In particular, literal characters must be wrapped in double quotes or preceded | ||||
| by a backslash. For more info, see the Excel documentation article | ||||
| `Create or delete a custom number format` or ECMA-376 18.8.31 (Number Formats) | ||||
| 
 | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Default Number Formats</b> (click to show)</summary> | ||||
| 
 | ||||
| The default formats are listed in ECMA-376 18.8.30: | ||||
| 
 | ||||
| | ID | Format                     | | ||||
| |---:|:---------------------------| | ||||
| |  0 | `General`                  | | ||||
| |  1 | `0`                        | | ||||
| |  2 | `0.00`                     | | ||||
| |  3 | `#,##0`                    | | ||||
| |  4 | `#,##0.00`                 | | ||||
| |  9 | `0%`                       | | ||||
| | 10 | `0.00%`                    | | ||||
| | 11 | `0.00E+00`                 | | ||||
| | 12 | `# ?/?`                    | | ||||
| | 13 | `# ??/??`                  | | ||||
| | 14 | `m/d/yy` (see below)       | | ||||
| | 15 | `d-mmm-yy`                 | | ||||
| | 16 | `d-mmm`                    | | ||||
| | 17 | `mmm-yy`                   | | ||||
| | 18 | `h:mm AM/PM`               | | ||||
| | 19 | `h:mm:ss AM/PM`            | | ||||
| | 20 | `h:mm`                     | | ||||
| | 21 | `h:mm:ss`                  | | ||||
| | 22 | `m/d/yy h:mm`              | | ||||
| | 37 | `#,##0 ;(#,##0)`           | | ||||
| | 38 | `#,##0 ;[Red](#,##0)`      | | ||||
| | 39 | `#,##0.00;(#,##0.00)`      | | ||||
| | 40 | `#,##0.00;[Red](#,##0.00)` | | ||||
| | 45 | `mm:ss`                    | | ||||
| | 46 | `[h]:mm:ss`                | | ||||
| | 47 | `mmss.0`                   | | ||||
| | 48 | `##0.0E+0`                 | | ||||
| | 49 | `@`                        | | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| Format 14 (`m/d/yy`) is localized by Excel: even though the file specifies that | ||||
| number format, it will be drawn differently based on system settings.  It makes | ||||
| sense when the producer and consumer of files are in the same locale, but that | ||||
| is not always the case over the Internet.  To get around this ambiguity, parse | ||||
| functions accept the `dateNF` option to override the interpretation of that | ||||
| specific format string. | ||||
| 
 | ||||
| 
 | ||||
| ## Sheet Visibility | ||||
| 
 | ||||
| <details> | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| --- | ||||
| sidebar_position: 5 | ||||
| sidebar_position: 3 | ||||
| hide_table_of_contents: true | ||||
| title: Reading Files | ||||
| --- | ||||
| @ -1,5 +1,5 @@ | ||||
| --- | ||||
| sidebar_position: 7 | ||||
| sidebar_position: 5 | ||||
| hide_table_of_contents: true | ||||
| title: Writing Files | ||||
| --- | ||||
| @ -1,6 +1,6 @@ | ||||
| --- | ||||
| sidebar_position: 9 | ||||
| title: Formulae Output | ||||
| title: Array of Formulae | ||||
| pagination_next: miscellany/formats | ||||
| --- | ||||
| 
 | ||||
| @ -1,5 +1,5 @@ | ||||
| { | ||||
|   "label": "Utility Functions", | ||||
|   "collapsed": false, | ||||
|   "position": 9 | ||||
|   "position": 7 | ||||
| } | ||||
| @ -440,7 +440,7 @@ can be added to the individual TD elements: | ||||
| |:----------|:-------------------------------------------------------------| | ||||
| | `data-t`  | Override [Cell Type](/docs/csf/cell#data-types)              | | ||||
| | `data-v`  | Override Cell Value                                          | | ||||
| | `data-z`  | Override [Number Format](/docs/csf/features/#number-formats) | | ||||
| | `data-z`  | Override [Number Format](/docs/csf/features/nf)              | | ||||
| 
 | ||||
| For example: | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user