2022-08-26 05:39:17 +00:00
|
|
|
---
|
|
|
|
title: Svelte
|
2023-01-10 00:31:37 +00:00
|
|
|
pagination_prev: demos/index
|
2023-02-28 11:40:44 +00:00
|
|
|
pagination_next: demos/grid/index
|
2023-01-09 05:08:30 +00:00
|
|
|
sidebar_position: 4
|
2022-08-26 05:39:17 +00:00
|
|
|
---
|
|
|
|
|
|
|
|
[Svelte](https://svelte.dev/) is a JS library for building user interfaces.
|
|
|
|
|
|
|
|
This demo tries to cover common Svelte data flow ideas and strategies. Svelte
|
|
|
|
familiarity is assumed.
|
|
|
|
|
2022-08-31 06:46:03 +00:00
|
|
|
Other demos cover general Svelte deployments, including:
|
2022-08-27 00:15:07 +00:00
|
|
|
|
2023-01-05 23:33:49 +00:00
|
|
|
- [iOS applications powered by CapacitorJS](/docs/demos/mobile/capacitor)
|
|
|
|
- [Desktop application powered by Wails](/docs/demos/desktop/wails)
|
2022-08-27 00:15:07 +00:00
|
|
|
|
2022-08-26 05:39:17 +00:00
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
2022-10-30 05:45:37 +00:00
|
|
|
[The "Frameworks" section](/docs/getting-started/installation/frameworks) covers
|
2022-08-26 05:39:17 +00:00
|
|
|
installation with Yarn and other package managers.
|
|
|
|
|
|
|
|
The library can be imported directly from Svelte files with:
|
|
|
|
|
|
|
|
```js
|
|
|
|
import { read, utils, writeFile } from 'xlsx';
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Internal State
|
|
|
|
|
|
|
|
The various SheetJS APIs work with various data shapes. The preferred state
|
|
|
|
depends on the application.
|
|
|
|
|
|
|
|
### Array of Objects
|
|
|
|
|
|
|
|
Typically, some users will create a spreadsheet with source data that should be
|
|
|
|
loaded into the site. This sheet will have known columns. For example, our
|
|
|
|
[presidents sheet](https://sheetjs.com/pres.xlsx) has "Name" / "Index" columns:
|
|
|
|
|
|
|
|
![`pres.xlsx` data](pathname:///pres.png)
|
|
|
|
|
|
|
|
This naturally maps to an array of typed objects, as in the TS example below:
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { read, utils } from 'xlsx';
|
|
|
|
|
|
|
|
interface President {
|
|
|
|
Name: string;
|
|
|
|
Index: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
const f = await (await fetch("https://sheetjs.com/pres.xlsx")).arrayBuffer();
|
|
|
|
const wb = read(f);
|
|
|
|
const data = utils.sheet_to_json<President>(wb.Sheets[wb.SheetNames[0]]);
|
|
|
|
console.log(data);
|
|
|
|
```
|
|
|
|
|
|
|
|
`data` will be an array of objects:
|
|
|
|
|
|
|
|
```js
|
|
|
|
[
|
|
|
|
{ Name: "Bill Clinton", Index: 42 },
|
|
|
|
{ Name: "GeorgeW Bush", Index: 43 },
|
|
|
|
{ Name: "Barack Obama", Index: 44 },
|
|
|
|
{ Name: "Donald Trump", Index: 45 },
|
|
|
|
{ Name: "Joseph Biden", Index: 46 }
|
|
|
|
]
|
|
|
|
```
|
|
|
|
|
|
|
|
A component will typically map over the data. The following example generates
|
|
|
|
a TABLE with a row for each President:
|
|
|
|
|
|
|
|
```html title="src/SheetJSSvelteAoO.svelte"
|
|
|
|
<script>
|
|
|
|
import { onMount } from 'svelte';
|
|
|
|
import { read, utils, writeFileXLSX } from 'xlsx';
|
|
|
|
|
|
|
|
/* the component state is an array of presidents */
|
|
|
|
let pres = [];
|
|
|
|
|
|
|
|
/* Fetch and update the state once */
|
|
|
|
onMount(async() => {
|
|
|
|
const f = await (await fetch("https://sheetjs.com/pres.xlsx")).arrayBuffer();
|
|
|
|
const wb = read(f); // parse the array buffer
|
|
|
|
const ws = wb.Sheets[wb.SheetNames[0]]; // get the first worksheet
|
|
|
|
// highlight-start
|
|
|
|
pres = utils.sheet_to_json(ws); // generate objects and update state
|
|
|
|
// highlight-end
|
2022-08-26 19:21:53 +00:00
|
|
|
});
|
2022-08-26 05:39:17 +00:00
|
|
|
|
|
|
|
/* get state data and export to XLSX */
|
|
|
|
function exportFile() {
|
|
|
|
// highlight-next-line
|
|
|
|
const ws = utils.json_to_sheet(pres);
|
|
|
|
const wb = utils.book_new();
|
|
|
|
utils.book_append_sheet(wb, ws, "Data");
|
|
|
|
writeFileXLSX(wb, "SheetJSSvelteAoO.xlsx");
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<main>
|
|
|
|
<table><thead><th>Name</th><th>Index</th></thead><tbody>
|
|
|
|
<!-- highlight-start -->
|
|
|
|
{#each pres as p}<tr>
|
|
|
|
<td>{p.Name}</td>
|
|
|
|
<td>{p.Index}</td>
|
|
|
|
</tr>{/each}
|
|
|
|
<!-- highlight-end -->
|
|
|
|
</tbody><tfoot><td colSpan={2}>
|
|
|
|
<button on:click={exportFile}>Export XLSX</button>
|
|
|
|
</td></tfoot></table>
|
|
|
|
</main>
|
|
|
|
```
|
|
|
|
|
2023-03-12 06:25:57 +00:00
|
|
|
<details open><summary><b>How to run the example</b> (click to show)</summary>
|
|
|
|
|
|
|
|
:::note
|
|
|
|
|
|
|
|
This demo was last run on 2023 March 08 using `svelte@3.55.1`. When running
|
|
|
|
`npm create`, the package `create-vite@4.1.0` was installed.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
1) Run `npm create vite@latest sheetjs-svelte -- --template svelte-ts`.
|
|
|
|
|
|
|
|
2) Install the SheetJS dependency and start the dev server:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
cd sheetjs-svelte
|
|
|
|
npm install
|
|
|
|
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
|
|
|
npm run dev
|
|
|
|
```
|
|
|
|
|
|
|
|
3) Open a web browser and access the displayed URL (`http://localhost:5173`)
|
|
|
|
|
|
|
|
4) Replace `src/App.svelte` with the `src/SheetJSSvelteAoO.svelte` example.
|
|
|
|
|
|
|
|
The page will refresh and show a table with an Export button. Click the button
|
|
|
|
and the page will attempt to download `SheetJSSvelteAoA.xlsx`. There may be a
|
|
|
|
delay since Vite will try to optimize the SheetJS library on the fly.
|
|
|
|
|
|
|
|
5) Build the site with `npm run build`, then test with `npx http-server dist`.
|
|
|
|
Access `http://localhost:8080` with a web browser to test the bundled site.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2022-08-26 05:39:17 +00:00
|
|
|
### HTML
|
|
|
|
|
|
|
|
The main disadvantage of the Array of Objects approach is the specific nature
|
|
|
|
of the columns. For more general use, passing around an Array of Arrays works.
|
|
|
|
However, this does not handle merge cells well!
|
|
|
|
|
|
|
|
The `sheet_to_html` function generates HTML that is aware of merges and other
|
|
|
|
worksheet features. Svelte `@html` tag allows raw HTML strings:
|
|
|
|
|
|
|
|
```html title="src/SheetJSSvelteHTML.svelte"
|
|
|
|
<script>
|
|
|
|
import { onMount } from 'svelte';
|
|
|
|
import { read, utils, writeFileXLSX } from 'xlsx';
|
|
|
|
|
|
|
|
let html = "";
|
|
|
|
let tbl;
|
|
|
|
|
|
|
|
/* Fetch and update the state once */
|
|
|
|
onMount(async() => {
|
|
|
|
const f = await (await fetch("https://sheetjs.com/pres.xlsx")).arrayBuffer();
|
|
|
|
const wb = read(f); // parse the array buffer
|
|
|
|
const ws = wb.Sheets[wb.SheetNames[0]]; // get the first worksheet
|
|
|
|
// highlight-start
|
|
|
|
html = utils.sheet_to_html(ws); // generate HTML and update state
|
|
|
|
// highlight-end
|
2022-08-26 19:21:53 +00:00
|
|
|
});
|
2022-08-26 05:39:17 +00:00
|
|
|
|
|
|
|
/* get state data and export to XLSX */
|
|
|
|
function exportFile() {
|
|
|
|
// highlight-start
|
|
|
|
const elt = tbl.getElementsByTagName("TABLE")[0];
|
|
|
|
const wb = utils.table_to_book(elt);
|
|
|
|
// highlight-end
|
|
|
|
writeFileXLSX(wb, "SheetJSSvelteHTML.xlsx");
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<main>
|
|
|
|
<button on:click={exportFile}>Export XLSX</button>
|
|
|
|
<!-- highlight-start -->
|
|
|
|
<div bind:this={tbl}>{@html html}</div>
|
|
|
|
<!-- highlight-end -->
|
|
|
|
</main>
|
|
|
|
```
|
2023-03-12 06:25:57 +00:00
|
|
|
|
|
|
|
<details open><summary><b>How to run the example</b> (click to show)</summary>
|
|
|
|
|
|
|
|
:::note
|
|
|
|
|
|
|
|
This demo was last run on 2023 March 08 using `svelte@3.55.1`. When running
|
|
|
|
`npm create`, the package `create-vite@4.1.0` was installed.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
1) Run `npm create vite@latest sheetjs-svelte -- --template svelte-ts`.
|
|
|
|
|
|
|
|
2) Install the SheetJS dependency and start the dev server:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
cd sheetjs-svelte
|
|
|
|
npm install
|
|
|
|
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
|
|
|
npm run dev
|
|
|
|
```
|
|
|
|
|
|
|
|
3) Open a web browser and access the displayed URL (`http://localhost:5173`)
|
|
|
|
|
|
|
|
4) Replace `src/App.svelte` with the `src/SheetJSSvelteHTML.svelte` example.
|
|
|
|
|
|
|
|
The page will refresh and show a table with an Export button. Click the button
|
|
|
|
and the page will attempt to download `SheetJSSvelteHTML.xlsx`. There may be a
|
|
|
|
delay since Vite will try to optimize the SheetJS library on the fly.
|
|
|
|
|
|
|
|
5) Build the site with `npm run build`, then test with `npx http-server dist`.
|
|
|
|
Access `http://localhost:8080` with a web browser to test the bundled site.
|
|
|
|
|
|
|
|
</details>
|