forked from sheetjs/docs.sheetjs.com
		
	vite-sheet
This commit is contained in:
		
							parent
							
								
									709553e22e
								
							
						
					
					
						commit
						063aec617b
					
				| @ -1,14 +1,32 @@ | ||||
| --- | ||||
| title: ViteJS | ||||
| sidebar_class_name: red | ||||
| sidebar_label: ViteJS | ||||
| description: Make static websites from spreadsheets using ViteJS. Seamlessly integrate data into your website using SheetJS. Empower non-technical people to write content from Excel. | ||||
| pagination_prev: demos/net/index | ||||
| pagination_next: demos/mobile/index | ||||
| sidebar_custom_props: | ||||
|   type: bundler | ||||
| --- | ||||
| 
 | ||||
| # ViteJS Spreadsheet Plugins | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| [ViteJS](https://vitejs.dev/) is a modern build tool for generating static sites. | ||||
| It has a robust JavaScript-powered plugin system[^1] | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo uses ViteJS and SheetJS to pull data from a spreadsheet and display | ||||
| the content in an HTML table. We'll explore how to load SheetJS in a ViteJS | ||||
| plugin and compare a few different data loading strategies. | ||||
| 
 | ||||
| The ["Complete Demo"](#complete-demo) section includes a complete website powered | ||||
| by an XLSX spreadsheet. | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo covers static asset imports. For processing files in the browser, the | ||||
| @ -16,25 +34,21 @@ This demo covers static asset imports. For processing files in the browser, the | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Loaders | ||||
| ## Plugins | ||||
| 
 | ||||
| ViteJS supports static asset imports, but the default raw loader interprets data | ||||
| ViteJS supports static asset imports[^2], but the default raw loader interprets data | ||||
| as UTF-8 strings.  This corrupts binary formats like XLSX and XLS, but a custom | ||||
| loader can override the default behavior. | ||||
| 
 | ||||
| :::note Recommendation | ||||
| 
 | ||||
| For simple tables of data, ["Pure Data Loader"](#pure-data-loader) is strongly | ||||
| For simple tables of data, ["Pure Data Plugin"](#pure-data-plugin) is strongly | ||||
| recommended.  The heavy work is performed at build time and the generated site | ||||
| only includes the raw data. | ||||
| 
 | ||||
| For more complex parsing or display logic, ["Base64 Loader"](#base64-loader) is | ||||
| For more complex parsing or display logic, ["Base64 Plugin"](#base64-plugin) is | ||||
| preferable. Since the raw parsing logic is performed in the page, the library | ||||
| will be included in the final bundle. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Pure Data Loader | ||||
| ### Pure Data Plugin | ||||
| 
 | ||||
| For a pure static site, a plugin can load data into an array of row objects. The | ||||
| SheetJS work is performed in the plugin. The library is not loaded in the page! | ||||
| @ -54,6 +68,8 @@ flowchart LR | ||||
|   aoo --> |main.js\nfrontend code| html | ||||
| ``` | ||||
| 
 | ||||
| This ViteJS plugin will read spreadsheets using the SheetJS `read` method[^3] | ||||
| and generate arrays of row objects with `sheet_to_json`[^4]: | ||||
| 
 | ||||
| ```js title="vite.config.js" | ||||
| import { readFileSync } from 'fs'; | ||||
| @ -77,19 +93,20 @@ export default defineConfig({ | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| This loader uses the query `sheetjs`: | ||||
| In frontend code, the loader will look for all modules with a `?sheetjs` | ||||
| query string. The default export is an array of row objects: | ||||
| 
 | ||||
| ```js title="main.js" | ||||
| import data from './data.xlsx?sheetjs'; | ||||
| 
 | ||||
| document.querySelector('#app').innerHTML = `<div><pre> | ||||
| ${data.map(row => JSON.stringify(row)).join("\n")} | ||||
|   ${data.map(row => JSON.stringify(row)).join("\n")} | ||||
| </pre></div>`; | ||||
| ``` | ||||
| 
 | ||||
| ### Base64 Loader | ||||
| ### Base64 Plugin | ||||
| 
 | ||||
| This loader pulls in data as a Base64 string that can be read with `XLSX.read`. | ||||
| This plugin pulls in data as a Base64 string that can be read with `read`[^5]. | ||||
| While this approach works, it is not recommended since it loads the library in | ||||
| the front-end site. | ||||
| 
 | ||||
| @ -108,6 +125,9 @@ flowchart LR | ||||
|   aoo --> |main.js\nfrontend code| html | ||||
| ``` | ||||
| 
 | ||||
| This ViteJS plugin will read spreadsheet files and export the data as a Base64 | ||||
| string. SheetJS is not imported in the plugin: | ||||
| 
 | ||||
| ```js title="vite.config.js" | ||||
| import { readFileSync } from 'fs'; | ||||
| import { defineConfig } from 'vite'; | ||||
| @ -130,7 +150,7 @@ export default defineConfig({ | ||||
| ``` | ||||
| 
 | ||||
| When importing using the `b64` query, the raw Base64 string will be exposed. | ||||
| This can be read directly with `XLSX.read` in JS code: | ||||
| `read` will process the Base64 string using the `base64` input type[^6]: | ||||
| 
 | ||||
| ```js title="main.js" | ||||
| import { read, utils } from "xlsx"; | ||||
| @ -138,7 +158,7 @@ import { read, utils } from "xlsx"; | ||||
| /* reference workbook */ | ||||
| import b64 from './data.xlsx?b64'; | ||||
| /* parse workbook and export first sheet to CSV */ | ||||
| const wb = read(b64); | ||||
| const wb = read(b64, { type: "base64" }); | ||||
| const wsname = wb.SheetNames[0]; | ||||
| const csv = utils.sheet_to_csv(wb.Sheets[wsname]); | ||||
| 
 | ||||
| @ -152,10 +172,13 @@ ${csv} | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| This demo was tested on 2023 May 24 against `vite v4.3.8`. | ||||
| This demo was tested on 2023 June 06 against `vite v4.3.9`. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The demo walks through the process of creating a new ViteJS website from scratch. | ||||
| A Git repository with the completed site can be cloned[^7]. | ||||
| 
 | ||||
| ### Initial Setup | ||||
| 
 | ||||
| 1) Create a new site with the `vue-ts` template and install the SheetJS package: | ||||
| @ -261,6 +284,13 @@ JSON.parse('[{"Name":"Bill Clinton","Index":42} | ||||
| Searching for `BESSELJ` should reveal no results.  The SheetJS scripts are not | ||||
| included in the final site! | ||||
| 
 | ||||
| :::note | ||||
| 
 | ||||
| ViteJS also supports "Server-Side Rendering". In SSR, only the HTML table | ||||
| would be added to the final page. Details are covered in the ViteJS docs[^8]. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Base64 Test | ||||
| 
 | ||||
| 8) Run the dev server: | ||||
| @ -316,3 +346,13 @@ Searching for `BESSELJ` should match the code: | ||||
| ``` | ||||
| 
 | ||||
| The SheetJS library is embedded in the final site. | ||||
| 
 | ||||
| 
 | ||||
| [^1]: See ["Using Plugins"](https://vitejs.dev/guide/using-plugins.html) in the ViteJS documentation. | ||||
| [^2]: See ["Static Asset Handling"](https://vitejs.dev/guide/assets.html) in the ViteJS documentation. | ||||
| [^3]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/#array-output) | ||||
| [^4]: See [`read` in "Parsing Options"](/docs/api/parse-options) | ||||
| [^5]: See [`read` in "Parsing Options"](/docs/api/parse-options) | ||||
| [^6]: See [the "base64" type in "Parsing Options"](/docs/api/parse-options#input-type) | ||||
| [^7]: See [`SheetJS/sheetjs-vite`](https://git.sheetjs.com/sheetjs/sheetjs-vite/) on the SheetJS git server. | ||||
| [^8]: See ["Server-Side Rendering"](https://vitejs.dev/guide/ssr.html) in the ViteJS documentation. | ||||
| @ -38,13 +38,8 @@ remove the field is to use a `projection` to suppress the ID: | ||||
| ```js | ||||
| /* generate an array of objects from a collection */ | ||||
| const aoo = await collection.find({}, {projection:{_id:0}}).toArray(); | ||||
| ``` | ||||
| 
 | ||||
| Worksheets can be generated from the result using `json_to_sheet`: | ||||
| 
 | ||||
| ```js | ||||
| /* generate a worksheet from a collection */ | ||||
| const aoo = await collection.find({}, {projection:{_id:0}}).toArray(); | ||||
| const ws = utils.json_to_sheet(aoo); | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| @ -83,7 +83,7 @@ const config = { | ||||
|             position: 'right', | ||||
|           }, | ||||
|           { | ||||
|             href: 'https://git.sheetjs.com/sheetjs/sheetjs', | ||||
|             href: 'https://git.sheetjs.com/sheetjs/sheetjs/issues', | ||||
|             label: 'Source', | ||||
|             position: 'right', | ||||
|           }, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user