forked from sheetjs/docs.sheetjs.com
		
	CLI testing grid
This commit is contained in:
		
							parent
							
								
									11d9dc7440
								
							
						
					
					
						commit
						9c0d1bc162
					
				| @ -88,18 +88,18 @@ | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✱</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/cli/bunsea#complete-example"><Data ss:Type="String">BunJS SEA</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/cli/denosea#complete-example"><Data ss:Type="String">Deno SEA</Data></Cell> | ||||
|  | ||||
| @ -162,7 +162,16 @@ This demo was tested in the following deployments: | ||||
| | `darwin-arm` | `22.2.0`  | 2024-05-29 | | ||||
| | `win10-x64`  | `20.12.0` | 2024-03-26 | | ||||
| | `win11-x64`  | `20.13.1` | 2024-05-22 | | ||||
| | `win11-arm`  | `20.14.0` | 2024-06-11 | | ||||
| | `linux-x64`  | `20.11.1` | 2024-03-18 | | ||||
| | `linux-arm`  | `20.14.0` | 2024-06-10 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| NodeJS on Windows on ARM uses the X64 compatibility layer. It does not generate | ||||
| a native ARM64 binary! | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -81,7 +81,9 @@ This demo was last tested in the following deployments: | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `1.1.10` | 2024-05-28 | | ||||
| | `darwin-arm` | `1.1.10` | 2024-05-29 | | ||||
| | `win10-x64`  | `1.1.12` | 2024-06-10 | | ||||
| | `linux-x64`  | `1.1.12` | 2024-06-09 | | ||||
| | `linux-arm`  | `1.1.12` | 2024-06-10 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -102,6 +104,24 @@ to `sheet2csv.ts` in the project folder. | ||||
| bun install https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| On Windows, the command failed with a `ENOTEMPTY` error: | ||||
| 
 | ||||
| ``` | ||||
| error: InstallFailed extracting tarball for https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz | ||||
| error: moving "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" to cache dir failed | ||||
| ENOTEMPTY: Directory not empty (NtSetInformationFile()) | ||||
| ``` | ||||
| 
 | ||||
| The workaround is to prepend `xlsx@` to the URL: | ||||
| 
 | ||||
| <CodeBlock language="bash">{`\ | ||||
| bun install xlsx@https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`} | ||||
| </CodeBlock> | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 4) Test the script with `bun run`: | ||||
| 
 | ||||
| ```bash | ||||
|  | ||||
| @ -495,7 +495,7 @@ requests and 2000 write requests per month. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) If you do not have an account, create a new Azure free tier account[^8]. | ||||
| 0) If you do not have an account, create a new Azure free tier account[^15]. | ||||
| 
 | ||||
| #### Storage Account Setup | ||||
| 
 | ||||
| @ -646,3 +646,4 @@ is valid, open the file in Excel or another spreadsheet editor. | ||||
| [^12]: See [`write` in "Writing Files"](/docs/api/write-options) | ||||
| [^13]: See [`aoa_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) | ||||
| [^14]: See ["Workbook Helpers" in "Utilities"](/docs/api/utilities/wb) for details on `book_new` and `book_append_sheet`. | ||||
| [^15]: Registering for a free account [on the Azure Free Tier](https://azure.microsoft.com/en-us/free) requires a valid phone number and a valid credit card. | ||||
|  | ||||
| @ -394,8 +394,20 @@ const file = await drive.files.export({ | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| :::note pass | ||||
| 
 | ||||
| The `mimeType` property is expected to be one of the supported formats[^8]. When | ||||
| the demo was last tested, the following workbook conversions were supported: | ||||
| 
 | ||||
| | Format | MIME Type                                                           | | ||||
| |:-------|:--------------------------------------------------------------------| | ||||
| | XLSX   | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` | | ||||
| | ODS    | `application/x-vnd.oasis.opendocument.spreadsheet`                  | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The response object has a `data` field whose value will be a `Blob` object. Data | ||||
| can be pulled into an `ArrayBuffer` and passed to the SheetJS `read`[^8] method: | ||||
| can be pulled into an `ArrayBuffer` and passed to the SheetJS `read`[^9] method: | ||||
| 
 | ||||
| ```js | ||||
| /* Obtain ArrayBuffer */ | ||||
| @ -405,7 +417,78 @@ const ab = await file.data.arrayBuffer(); | ||||
| const wb = XLSX.read(buf); | ||||
| ``` | ||||
| 
 | ||||
| At this point `wb` is a SheetJS workbook object[^9]. | ||||
| :::note pass | ||||
| 
 | ||||
| The code snippet works for XLSX and ODS. Google Sheets supports other formats | ||||
| with different integration logic. | ||||
| 
 | ||||
| **Plaintext** | ||||
| 
 | ||||
| The following formats are considered "plaintext": | ||||
| 
 | ||||
| | Format            | MIME Type                   | | ||||
| |:------------------|:----------------------------| | ||||
| | CSV (first sheet) | `text/csv`                  | | ||||
| | TSV (first sheet) | `text/tab-separated-values` | | ||||
| 
 | ||||
| For these formats, `file.data` is a JS string that can be parsed directly: | ||||
| 
 | ||||
| ```js | ||||
| /* Request CSV export */ | ||||
| const file = await drive.files.export({ mimeType: "text/csv", fileId: id }); | ||||
| 
 | ||||
| /* Parse CSV string*/ | ||||
| const wb = XLSX.read(file.data, {type: "string"}); | ||||
| ``` | ||||
| 
 | ||||
| **HTML** | ||||
| 
 | ||||
| Google Sheets has one relevant HTML type: | ||||
| 
 | ||||
| | Format            | MIME Type         | | ||||
| |:------------------|:------------------| | ||||
| | HTML (all sheets) | `application/zip` | | ||||
| 
 | ||||
| The HTML export of a Google Sheets worksheet includes a row for the column | ||||
| labels (`A`, `B`, ...) and a column for the row labels (`1`, `2`, ...). | ||||
| 
 | ||||
| The complete package is a ZIP file that includes a series of `.html` files. | ||||
| The files are written in tab order. The name of each file matches the name in | ||||
| Google Sheets. | ||||
| 
 | ||||
| This ZIP can be extracted using the embedded CFB library: | ||||
| 
 | ||||
| ```js | ||||
| import { read, utils, CFB } from 'xlsx'; | ||||
| // -------------------^^^-- `CFB` named import | ||||
| 
 | ||||
| // ... | ||||
| 
 | ||||
| /* Parse Google Sheets ZIP file */ | ||||
| const cfb = CFB.read(new Uint8Array(ab), {type: "array"}); | ||||
| 
 | ||||
| /* Create new SheetJS workbook */ | ||||
| const wb = utils.book_new(); | ||||
| 
 | ||||
| /* Scan through each entry in the ZIP */ | ||||
| cfb.FullPaths.forEach((n, i) => { | ||||
|   /* only process HTML files */ | ||||
|   if(n.slice(-5) != ".html") return; | ||||
| 
 | ||||
|   /* Extract worksheet name */ | ||||
|   const name = n.slice(n.lastIndexOf("/")+1).slice(0,-5); | ||||
| 
 | ||||
|   /* parse HTML */ | ||||
|   const htmlwb = read(cfb.FileIndex[i].content); | ||||
| 
 | ||||
|   /* add worksheet to workbook */ | ||||
|   utils.book_append_sheet(wb, htmlwb.Sheets.Sheet1, name); | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| At this point `wb` is a SheetJS workbook object[^10]. | ||||
| 
 | ||||
| ## Complete Example | ||||
| 
 | ||||
| @ -840,5 +923,6 @@ Joseph Biden,46 | ||||
| [^5]: See [`writeFile` in "Writing Files"](/docs/api/write-options) | ||||
| [^6]: See ["Workbook Object"](/docs/csf/book) for more details. | ||||
| [^7]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) | ||||
| [^8]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^9]: See ["Workbook Object"](/docs/csf/book) for a description of the workbook object or ["API Reference"](/docs/api) for various methods to work with workbook and sheet objects. | ||||
| [^8]: See ["Export MIME types for Google Workspace documents"](https://developers.google.com/drive/api/guides/ref-export-formats) in the Google Developer documentation for the complete list of supported file types. | ||||
| [^9]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^10]: See ["Workbook Object"](/docs/csf/book) for a description of the workbook object or ["API Reference"](/docs/api) for various methods to work with workbook and sheet objects. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user