forked from sheetjs/docs.sheetjs.com
		
	sveltekit
This commit is contained in:
		
							parent
							
								
									514ed5f76d
								
							
						
					
					
						commit
						36361013e4
					
				@ -6,6 +6,7 @@ sidebar_position: 2
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
# Tutorial
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ familiarity is assumed.
 | 
			
		||||
 | 
			
		||||
Other demos cover general Svelte deployments, including:
 | 
			
		||||
 | 
			
		||||
- [Static Site Generation powered by SvelteKit](/docs/demos/static/svelte)
 | 
			
		||||
- [iOS applications powered by CapacitorJS](/docs/demos/mobile/capacitor)
 | 
			
		||||
- [Desktop application powered by Wails](/docs/demos/desktop/wails)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ sidebar_custom_props:
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
@ -28,7 +29,8 @@ 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
 | 
			
		||||
preferable. Since the raw parsing logic is performed in the page,
 | 
			
		||||
preferable. Since the raw parsing logic is performed in the page, the library
 | 
			
		||||
will be included in the final bundle.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
@ -119,20 +121,20 @@ ${csv}
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested on 2023 January 14 against `vite v4.0.4`.
 | 
			
		||||
This demo was tested on 2023 April 30 against `vite v4.3.3`.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
### Initial Setup
 | 
			
		||||
 | 
			
		||||
1) Create a new site using the `vue-ts` template:
 | 
			
		||||
1) Create a new site with the `vue-ts` template and install the SheetJS package:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
<CodeBlock language="bash">{`\
 | 
			
		||||
npm create vite@latest sheetjs-vite -- --template vue-ts
 | 
			
		||||
cd sheetjs-vite
 | 
			
		||||
npm install
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
 | 
			
		||||
```
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
 | 
			
		||||
</CodeBlock>
 | 
			
		||||
 | 
			
		||||
2) Replace `vite.config.ts` with the following:
 | 
			
		||||
 | 
			
		||||
@ -214,7 +216,7 @@ npm run build
 | 
			
		||||
npx http-server dist/
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The terminal will display a url like http://127.0.0.1:8080.  Access that page
 | 
			
		||||
The terminal will display a url like `http://127.0.0.1:8080` . Access that page
 | 
			
		||||
with a web browser.
 | 
			
		||||
 | 
			
		||||
7) To confirm that only the raw data is present in the page, view the page
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										237
									
								
								docz/docs/03-demos/04-static/11-svelte.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										237
									
								
								docz/docs/03-demos/04-static/11-svelte.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,237 @@
 | 
			
		||||
---
 | 
			
		||||
title: SvelteKit
 | 
			
		||||
pagination_prev: demos/net/index
 | 
			
		||||
pagination_next: demos/mobile/index
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo covers SvelteKit. The [Svelte demo](/docs/demos/frontend/svelte)
 | 
			
		||||
covers general client-side strategies.
 | 
			
		||||
 | 
			
		||||
This demo uses ["Base64 Loader"](/docs/demos/static/vitejs#base64-loader)
 | 
			
		||||
from the ViteJS demo.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
SvelteKit projects use ViteJS under the hood. They expose the `vite.config.js`
 | 
			
		||||
script. The [ViteJS demo](/docs/demos/static/vitejs) examples work as expected!
 | 
			
		||||
 | 
			
		||||
The following diagram depicts the workbook waltz:
 | 
			
		||||
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  file[(workbook\nfile)]
 | 
			
		||||
  subgraph SheetJS operations
 | 
			
		||||
    base64(base64\nstring)
 | 
			
		||||
    aoa(array of\nobjects)
 | 
			
		||||
  end
 | 
			
		||||
  html{{HTML\nTABLE}}
 | 
			
		||||
  file --> |vite.config.js\ndata loader| base64
 | 
			
		||||
  base64 --> |+page.server.js\nload function| aoa
 | 
			
		||||
  aoa --> |+page.svelte\ncomponent| html
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Integration
 | 
			
		||||
 | 
			
		||||
`+page.server.js` scripts can be pre-rendered by exporting `prerender` from the
 | 
			
		||||
script. If the SheetJS operations are performed in the server script, only the
 | 
			
		||||
results will be added to the generated pages!
 | 
			
		||||
 | 
			
		||||
For static site generation, `@sveltejs/adapter-static` must be used.
 | 
			
		||||
 | 
			
		||||
### Loader
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
The ViteJS demo used the query `?b64` to identify files. To play nice with
 | 
			
		||||
SvelteKit, this demo matches the file extensions directly.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
The loader should be added to `vite.config.js`. The code is nearly identical to
 | 
			
		||||
the ["Base64 Loader" ViteJS example.](/docs/demos/static/vitejs#base64-loader)
 | 
			
		||||
 | 
			
		||||
```js title="vite.config.js"
 | 
			
		||||
import { sveltekit } from '@sveltejs/kit/vite';
 | 
			
		||||
import { defineConfig } from 'vite';
 | 
			
		||||
import { readFileSync } from 'fs';
 | 
			
		||||
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  assetsInclude: ['**/*.numbers', '**/*.xlsx'],
 | 
			
		||||
  plugins: [sveltekit(), {
 | 
			
		||||
    name: "sheet-base64",
 | 
			
		||||
    transform(code, id) {
 | 
			
		||||
      if(!id.match(/\.(numbers|xlsx)$/)) return;
 | 
			
		||||
      var data = readFileSync(id, "base64");
 | 
			
		||||
      return `export default '${data}'`;
 | 
			
		||||
    }
 | 
			
		||||
  }]
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Types
 | 
			
		||||
 | 
			
		||||
For VSCodium integration, types can be specified in `src/app.d.ts`.
 | 
			
		||||
 | 
			
		||||
The example data loader returns Base64 strings. Declarations should be added for
 | 
			
		||||
each file extension supported in the loader:
 | 
			
		||||
 | 
			
		||||
```ts title="src/app.d.ts"
 | 
			
		||||
declare global {
 | 
			
		||||
  declare module '*.numbers' {
 | 
			
		||||
    const data: string;
 | 
			
		||||
    export default data;
 | 
			
		||||
  }
 | 
			
		||||
  declare module '*.xlsx' {
 | 
			
		||||
    const data: string;
 | 
			
		||||
    export default data;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Data Processing
 | 
			
		||||
 | 
			
		||||
For static sites, SheetJS operations should be run in `+page.server.js` .
 | 
			
		||||
 | 
			
		||||
Assuming `pres.xlsx` is stored in the `data` directory from the project root,
 | 
			
		||||
the relative import
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import b64 from "../../data/pres.xlsx"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
will return a Base64 string which can be parsed in the script. The workbook
 | 
			
		||||
object can be post-processed using utility functions.  The following example
 | 
			
		||||
uses `sheet_to_json` to generate arrays of row objects for each worksheet. The
 | 
			
		||||
data presented to the page will be an object whose keys are worksheet names:
 | 
			
		||||
 | 
			
		||||
```js title="src/routes/+page.server.js"
 | 
			
		||||
import b64 from "../../data/pres.xlsx";
 | 
			
		||||
import { read, utils } from "xlsx";
 | 
			
		||||
 | 
			
		||||
export const prerender = true;
 | 
			
		||||
 | 
			
		||||
/** @type {import('./$types').PageServerLoad} */
 | 
			
		||||
export async function load({ params }) {
 | 
			
		||||
  const wb = read(b64);
 | 
			
		||||
  /** @type {[string, any[]][]} */
 | 
			
		||||
  const data = wb.SheetNames.map(n => [n, utils.sheet_to_json(wb.Sheets[n])]);
 | 
			
		||||
  return Object.fromEntries(data);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Data Rendering
 | 
			
		||||
 | 
			
		||||
The shape of the data is determined by the loader. The example loader returns an
 | 
			
		||||
object whose keys are worksheet names and whose values are arrays of objects.
 | 
			
		||||
 | 
			
		||||
Using standard Svelte patterns, HTML tables can be generated from the data:
 | 
			
		||||
 | 
			
		||||
```html title="src/routes/+page.svelte"
 | 
			
		||||
<script>
 | 
			
		||||
  /** @type {import('./$types').PageData} */
 | 
			
		||||
  export let data;
 | 
			
		||||
 | 
			
		||||
  /* `pres` will be the data from Sheet1 */
 | 
			
		||||
  /** @type {Array<{Name: string, Index: number}>}*/
 | 
			
		||||
  export let pres = data["Sheet1"];
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<h1>Presidents</h1>
 | 
			
		||||
<table><thead><th>Name</th><th>Index</th></thead><tbody>
 | 
			
		||||
  {#each pres as p}<tr>
 | 
			
		||||
    <td>{p.Name}</td>
 | 
			
		||||
    <td>{p.Index}</td>
 | 
			
		||||
  </tr>{/each}
 | 
			
		||||
</tbody></table>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When built using `npm run build`, SvelteKit will perform the conversion and emit
 | 
			
		||||
a simple HTML table without any reference to the existing spreadsheet file!
 | 
			
		||||
 | 
			
		||||
## Complete Example
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested on 2023 April 30 using SvelteKit `1.15.9`
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
### Initial Setup
 | 
			
		||||
 | 
			
		||||
1) Create a new site:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm create svelte@latest sheetjs-svelte
 | 
			
		||||
cd sheetjs-svelte
 | 
			
		||||
npm i
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
2) Fetch the example file [`pres.xlsx`](https://sheetjs.com/pres.xlsx) and move
 | 
			
		||||
to a `data` subdirectory in the root of the project:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
mkdir -p data
 | 
			
		||||
curl -Lo data/pres.xlsx https://sheetjs.com/pres.xlsx
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
3) Install the SheetJS library:
 | 
			
		||||
 | 
			
		||||
<pre><code parentName="pre" {...{"className": "language-bash"}}>{`\
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
 | 
			
		||||
</code></pre>
 | 
			
		||||
 | 
			
		||||
4) Replace the contents of `vite.config.js` with the contents of the code block
 | 
			
		||||
named [`vite.config.js` in the "Loader" section](#loader)
 | 
			
		||||
 | 
			
		||||
5) Append the lines from [`src/app.d.ts` snippet in the "Types" section](#types)
 | 
			
		||||
to the `src/app.d.ts` file.
 | 
			
		||||
 | 
			
		||||
6) Replace the contents of `src/routes/+page.server.ts` with the contents of the
 | 
			
		||||
code block named [`src/routes/+page.server.ts` in "Data Processing"](#data-processing)
 | 
			
		||||
 | 
			
		||||
7) Replace the contents of `src/routes/+page.svelte` with the contents of the
 | 
			
		||||
code block named [`src/routes/+page.svelte` in "Data Rendering"](#data-rendering)
 | 
			
		||||
 | 
			
		||||
### Live Reload
 | 
			
		||||
 | 
			
		||||
8) Open `data/pres.xlsx` in a spreadsheet editor like Apple Numbers or Excel.
 | 
			
		||||
 | 
			
		||||
9) Start the development server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm run dev
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Open the displayed URL (typically `http://localhost:5173`) in a web browser and
 | 
			
		||||
observe that the data from the spreadsheet is displayed in the page.
 | 
			
		||||
 | 
			
		||||
10) In the spreadsheet, set cell A7 to `SheetJS Dev` and cell B7 to `47`.  Save
 | 
			
		||||
the file.  After saving, the browser should automatically refresh with new data.
 | 
			
		||||
 | 
			
		||||
### Static Site
 | 
			
		||||
 | 
			
		||||
11) Stop the development server and install the static adapter:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm install --save @sveltejs/adapter-static
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
12) Edit `svelte.config.js` to use the new adapter:
 | 
			
		||||
 | 
			
		||||
```diff title="svelte.config.js"
 | 
			
		||||
-import adapter from '@sveltejs/adapter-auto';
 | 
			
		||||
+import adapter from '@sveltejs/adapter-static';
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
13) Build the static site:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
14) Open a web browser and access the displayed URL (`http://localhost:8080`).
 | 
			
		||||
View the page source and confirm that the raw HTML table includes the data.
 | 
			
		||||
@ -10,6 +10,7 @@ sidebar_custom_props:
 | 
			
		||||
import current from '/version.js';
 | 
			
		||||
import Tabs from '@theme/Tabs';
 | 
			
		||||
import TabItem from '@theme/TabItem';
 | 
			
		||||
import CodeBlock from '@theme/CodeBlock';
 | 
			
		||||
 | 
			
		||||
The [NodeJS Module](/docs/getting-started/installation/nodejs) can be imported
 | 
			
		||||
from JavaScript code.
 | 
			
		||||
@ -233,7 +234,7 @@ async function exportFile(wb) {
 | 
			
		||||
 | 
			
		||||
:::note
 | 
			
		||||
 | 
			
		||||
This demo was tested against Wails `v2.4.0` on 2023 March 18 using
 | 
			
		||||
This demo was tested against Wails `v2.4.1` on 2023 April 30 using
 | 
			
		||||
the Svelte TypeScript starter.
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
@ -254,12 +255,12 @@ cd sheetjs-wails
 | 
			
		||||
 | 
			
		||||
3) Install front-end dependencies:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
<CodeBlock language="bash">{`\
 | 
			
		||||
cd frontend
 | 
			
		||||
curl -L -o src/assets/logo.png https://sheetjs.com/sketch1024.png
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
 | 
			
		||||
cd ..
 | 
			
		||||
```
 | 
			
		||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
 | 
			
		||||
cd ..`}
 | 
			
		||||
</CodeBlock>
 | 
			
		||||
 | 
			
		||||
4) Download source files:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ This demo was verified in the following deployments:
 | 
			
		||||
|:----------|:-------------|:-----------|
 | 
			
		||||
| Photoshop | ExtendScript | 2023-04-15 |
 | 
			
		||||
| InDesign  | ExtendScript | 2023-04-15 |
 | 
			
		||||
| InDesign  | CEP          | 2023-04-24 |
 | 
			
		||||
| InDesign  | CEP          | 2023-04-30 |
 | 
			
		||||
| InDesign  | UXP          | 2023-04-15 |
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
@ -242,8 +242,11 @@ const wb = XLSX.read(data.data, { type: "base64" });
 | 
			
		||||
0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip)
 | 
			
		||||
and extract to a `com.sheetjs.data` subdirectory.
 | 
			
		||||
 | 
			
		||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder. In
 | 
			
		||||
Windows, the folder is `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` .
 | 
			
		||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder:
 | 
			
		||||
 | 
			
		||||
- Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\`
 | 
			
		||||
- Macintosh `/Library/Application\ Support/Adobe/CEP/extensions`
 | 
			
		||||
 | 
			
		||||
If prompted, give administrator privileges.
 | 
			
		||||
 | 
			
		||||
2) Download and open [`Template.idml`](pathname:///extendscript/Template.idml)
 | 
			
		||||
@ -285,8 +288,11 @@ cep.fs.writeFile(fn.data, b64, cep.encoding.Base64);
 | 
			
		||||
0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip)
 | 
			
		||||
and extract to a `com.sheetjs.data` subdirectory.
 | 
			
		||||
 | 
			
		||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder. In
 | 
			
		||||
Windows, the folder is `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` .
 | 
			
		||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder:
 | 
			
		||||
 | 
			
		||||
- Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\`
 | 
			
		||||
- Macintosh `/Library/Application\ Support/Adobe/CEP/extensions`
 | 
			
		||||
 | 
			
		||||
If prompted, give administrator privileges.
 | 
			
		||||
 | 
			
		||||
2) Download and open [`Filled.idml`](pathname:///extendscript/Filled.idml)
 | 
			
		||||
@ -317,7 +323,7 @@ const storage = require("uxp").storage;
 | 
			
		||||
const ufs = storage.localFileSystem;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Reading Files**
 | 
			
		||||
### Reading Files
 | 
			
		||||
 | 
			
		||||
The `getFileForOpening` method resolves to a `File` object. Reading the file
 | 
			
		||||
with the `binary` format returns an `ArrayBuffer` object that can be parsed:
 | 
			
		||||
@ -331,7 +337,7 @@ const ab = await file.read({ format: storage.formats.binary });
 | 
			
		||||
const wb = XLSX.read(ab);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Writing Files**
 | 
			
		||||
### Writing Files
 | 
			
		||||
 | 
			
		||||
The `getFileForSaving` method resolves to a `File` object. The workbook should
 | 
			
		||||
be written with `type: "buffer"` for compatibility with the `binary` format:
 | 
			
		||||
 | 
			
		||||
@ -64,6 +64,7 @@ run in the web browser, demos will include interactive examples.
 | 
			
		||||
- [`ViteJS`](/docs/demos/static/vitejs)
 | 
			
		||||
- [`NextJS`](/docs/demos/static/nextjs)
 | 
			
		||||
- [`NuxtJS`](/docs/demos/static/nuxtjs)
 | 
			
		||||
- [`SvelteKit`](/docs/demos/static/svelte)
 | 
			
		||||
 | 
			
		||||
### App Extensions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user