2022-05-16 03:26:04 +00:00
|
|
|
---
|
|
|
|
sidebar_position: 1
|
|
|
|
hide_table_of_contents: true
|
2022-08-13 22:01:26 +00:00
|
|
|
title: Overview
|
2022-05-16 03:26:04 +00:00
|
|
|
---
|
|
|
|
|
2023-04-27 09:12:19 +00:00
|
|
|
import current from '/version.js';
|
2023-10-06 20:47:17 +00:00
|
|
|
import Tabs from '@theme/Tabs';
|
|
|
|
import TabItem from '@theme/TabItem';
|
2023-05-07 13:58:36 +00:00
|
|
|
import CodeBlock from '@theme/CodeBlock';
|
2023-04-27 09:12:19 +00:00
|
|
|
|
2022-05-16 03:26:04 +00:00
|
|
|
# SheetJS CE
|
|
|
|
|
|
|
|
SheetJS Community Edition offers battle-tested open-source solutions for
|
|
|
|
extracting useful data from almost any complex spreadsheet and generating new
|
|
|
|
spreadsheets that will work with legacy and modern software alike.
|
|
|
|
|
|
|
|
[SheetJS Pro](https://sheetjs.com/pro) offers solutions beyond data processing:
|
|
|
|
Edit complex templates with ease; let out your inner Picasso with styling; make
|
|
|
|
custom sheets with images/graphs/PivotTables; evaluate formula expressions and
|
|
|
|
port calculations to web apps; automate common spreadsheet tasks, and much more!
|
|
|
|
|
|
|
|
## Simple Examples
|
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
The code editors are live -- feel free to edit! They use ReactJS components and
|
|
|
|
run entirely in the web browser.
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
### Export an HTML Table to Excel XLSX
|
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details>
|
|
|
|
<summary><b>How to add to your site</b> (click to show)</summary>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-10-06 20:47:17 +00:00
|
|
|
<Tabs groupId="deployment">
|
|
|
|
<TabItem value="vanilla" label="HTML">
|
|
|
|
|
2022-05-16 03:26:04 +00:00
|
|
|
1) Make sure your table has an ID:
|
|
|
|
|
|
|
|
```html
|
|
|
|
<table id="TableToExport">
|
|
|
|
```
|
|
|
|
|
2023-04-27 09:12:19 +00:00
|
|
|
2) Include a reference to the SheetJS library in your page:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-05-07 13:58:36 +00:00
|
|
|
<CodeBlock language="html">{`\
|
2023-04-27 09:12:19 +00:00
|
|
|
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js"></script>`}
|
2023-05-07 13:58:36 +00:00
|
|
|
</CodeBlock>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
3) Add a button that users will click to generate an export
|
|
|
|
|
|
|
|
```html
|
|
|
|
<button id="sheetjsexport"><b>Export as XLSX</b></button>
|
|
|
|
```
|
|
|
|
|
2023-10-06 20:47:17 +00:00
|
|
|
4) Add an event handler for the `click` event to export table data to XLSX:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
```html
|
|
|
|
<script>
|
2022-05-16 03:30:34 +00:00
|
|
|
document.getElementById("sheetjsexport").addEventListener('click', function() {
|
2022-05-16 03:26:04 +00:00
|
|
|
/* Create worksheet from HTML DOM TABLE */
|
|
|
|
var wb = XLSX.utils.table_to_book(document.getElementById("TableToExport"));
|
|
|
|
/* Export to file (start a download) */
|
|
|
|
XLSX.writeFile(wb, "SheetJSTable.xlsx");
|
|
|
|
});
|
2022-08-24 00:51:18 +00:00
|
|
|
</script>
|
2022-05-16 03:26:04 +00:00
|
|
|
```
|
|
|
|
|
2023-10-06 20:47:17 +00:00
|
|
|
</TabItem>
|
|
|
|
<TabItem value="react" label="React">
|
|
|
|
|
|
|
|
:::note pass
|
|
|
|
|
|
|
|
This example assumes you have an existing project with an HTML TABLE element:
|
|
|
|
|
|
|
|
```jsx title="Sample Component"
|
|
|
|
function App() {
|
|
|
|
return ( <>
|
2024-05-10 05:37:20 +00:00
|
|
|
<h3>SheetJS Table</h3>
|
|
|
|
<table>
|
|
|
|
<tr><td colSpan="3">SheetJS Table Export</td></tr>
|
|
|
|
<tr><td>Author</td><td>ID</td><td>你好!</td></tr>
|
|
|
|
<tr><td>SheetJS</td><td>7262</td><td>வணக்கம்!</td></tr>
|
|
|
|
<tr><td colSpan="3">
|
|
|
|
<a href="//sheetjs.com">Powered by SheetJS</a>
|
|
|
|
</td></tr>
|
|
|
|
</table>
|
2023-10-06 20:47:17 +00:00
|
|
|
</> )
|
|
|
|
}
|
|
|
|
export default App;
|
|
|
|
```
|
|
|
|
|
|
|
|
If you are starting from scratch, create a new ViteJS + ReactJS project:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
npm create vite@latest -- sheetjs-react --template react --default
|
|
|
|
cd sheetjs-react
|
|
|
|
npm install
|
|
|
|
npm run dev
|
|
|
|
```
|
|
|
|
|
|
|
|
Replace `src/App.jsx` with the sample component.
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
1) Install the SheetJS library using a package manager:
|
|
|
|
|
|
|
|
<Tabs groupId="pm">
|
|
|
|
<TabItem value="npm" label="npm">
|
|
|
|
<CodeBlock language="bash">{`\
|
|
|
|
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
|
|
|
</CodeBlock>
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="pnpm" label="pnpm">
|
|
|
|
<CodeBlock language="bash">{`\
|
2024-03-20 07:05:29 +00:00
|
|
|
pnpm install --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
2023-10-06 20:47:17 +00:00
|
|
|
</CodeBlock>
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="yarn" label="Yarn" default>
|
|
|
|
<CodeBlock language="bash">{`\
|
|
|
|
yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
|
|
|
</CodeBlock>
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
|
|
|
2) Ensure that your component script imports `useRef` from the `react` library:
|
|
|
|
|
|
|
|
```js
|
|
|
|
import { useRef } from "react";
|
|
|
|
```
|
|
|
|
|
|
|
|
3) Add the following line at the top of your component script:
|
|
|
|
|
|
|
|
```js
|
|
|
|
import { utils, writeFileXLSX } from "xlsx";
|
|
|
|
```
|
|
|
|
|
|
|
|
4) Create a ref in the body of your function component:
|
|
|
|
|
|
|
|
```jsx
|
|
|
|
function App() {
|
|
|
|
// highlight-next-line
|
|
|
|
const tbl = useRef(null);
|
|
|
|
// ...
|
|
|
|
```
|
|
|
|
|
|
|
|
5) Attach the ref to the table element:
|
|
|
|
|
|
|
|
```jsx
|
|
|
|
function App() {
|
|
|
|
// ...
|
|
|
|
return (
|
|
|
|
{/*...*/}
|
|
|
|
// highlight-next-line
|
|
|
|
<table ref={tbl}>
|
|
|
|
{/*...*/}
|
|
|
|
```
|
|
|
|
|
|
|
|
6) Add a button with a click handler that will export table data to XLSX:
|
|
|
|
|
|
|
|
```jsx
|
|
|
|
function App() {
|
|
|
|
// ...
|
|
|
|
return (
|
|
|
|
{/*...*/}
|
|
|
|
// highlight-start
|
|
|
|
<button onClick={() => {
|
|
|
|
// generate workbook from table element
|
|
|
|
const wb = utils.table_to_book(tbl.current);
|
|
|
|
// write to XLSX
|
|
|
|
writeFileXLSX(wb, "SheetJSReactExport.xlsx");
|
|
|
|
}}>Export XLSX</button>
|
|
|
|
// highlight-end
|
|
|
|
{/*...*/}
|
|
|
|
```
|
|
|
|
|
|
|
|
</TabItem>
|
|
|
|
</Tabs>
|
|
|
|
|
2022-05-16 03:26:04 +00:00
|
|
|
</details>
|
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details>
|
|
|
|
<summary><b>How to automate with NodeJS</b> (click to show)</summary>
|
2022-08-24 00:51:18 +00:00
|
|
|
|
2023-03-26 00:55:35 +00:00
|
|
|
[The "Headless Automation" demo](/docs/demos/net/headless) includes complete examples
|
2022-08-24 06:02:38 +00:00
|
|
|
using the `puppeteer` and `playwright` browser automation frameworks.
|
2022-08-24 00:51:18 +00:00
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details open>
|
|
|
|
<summary><b>Live Example</b> (click to hide)</summary>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2024-01-31 08:14:07 +00:00
|
|
|
This example uses a ReactJS `ref` to reference the HTML TABLE element. ReactJS
|
|
|
|
details are covered in the [ReactJS demo](/docs/demos/frontend/react#html)
|
|
|
|
|
2022-05-16 03:26:04 +00:00
|
|
|
```jsx live
|
|
|
|
/* The live editor requires this function wrapper */
|
|
|
|
function Table2XLSX(props) {
|
2024-01-31 08:14:07 +00:00
|
|
|
/* reference to the table element */
|
|
|
|
const tbl = React.useRef();
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
/* Callback invoked when the button is clicked */
|
2023-10-06 20:47:17 +00:00
|
|
|
const xport = React.useCallback(() => {
|
2022-08-26 19:21:53 +00:00
|
|
|
/* Create worksheet from HTML DOM TABLE */
|
2024-01-31 08:14:07 +00:00
|
|
|
const wb = XLSX.utils.table_to_book(tbl.current);
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-26 19:21:53 +00:00
|
|
|
/* Export to file (start a download) */
|
|
|
|
XLSX.writeFile(wb, "SheetJSTable.xlsx");
|
2022-05-16 03:26:04 +00:00
|
|
|
});
|
|
|
|
|
2023-02-28 11:40:44 +00:00
|
|
|
return ( <>
|
2024-01-31 08:14:07 +00:00
|
|
|
<table ref={tbl}><tbody>
|
2022-05-16 03:26:04 +00:00
|
|
|
<tr><td colSpan="3">SheetJS Table Export</td></tr>
|
2022-08-04 03:00:20 +00:00
|
|
|
<tr><td>Author</td><td>ID</td><td>你好!</td></tr>
|
|
|
|
<tr><td>SheetJS</td><td>7262</td><td>வணக்கம்!</td></tr>
|
2022-05-16 03:26:04 +00:00
|
|
|
<tr><td colSpan="3">
|
|
|
|
<a href="//sheetjs.com">Powered by SheetJS</a>
|
|
|
|
</td></tr>
|
|
|
|
</tbody></table>
|
|
|
|
<button onClick={xport}><b>Export XLSX!</b></button>
|
2023-02-28 11:40:44 +00:00
|
|
|
</> );
|
2022-05-16 03:26:04 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
<a href="https://sheetjs.com/pro">SheetJS Pro Basic</a> extends this export with
|
|
|
|
support for CSS styling and rich text.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2023-06-25 09:36:58 +00:00
|
|
|
### Download and Preview Apple Numbers Workbooks
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details>
|
|
|
|
<summary><b>How to add to your site</b> (click to show)</summary>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
1) Create a container DIV for the table:
|
|
|
|
|
|
|
|
```html
|
|
|
|
<div id="TableContainer"></div>
|
|
|
|
```
|
|
|
|
|
2023-04-27 09:12:19 +00:00
|
|
|
2) Include a reference to the SheetJS library in your page:
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-05-07 13:58:36 +00:00
|
|
|
<CodeBlock language="html">{`\
|
2023-04-27 09:12:19 +00:00
|
|
|
<script src="https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js"></script>`}
|
2023-05-07 13:58:36 +00:00
|
|
|
</CodeBlock>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
3) Add a script block to download and update the page:
|
|
|
|
|
|
|
|
```html
|
|
|
|
<script>
|
|
|
|
(async() => {
|
2022-11-08 23:16:40 +00:00
|
|
|
/* replace with the URL of the file */
|
2024-04-26 04:16:13 +00:00
|
|
|
const URL_TO_DOWNLOAD = "https://docs.sheetjs.com/pres.numbers";
|
2022-11-08 23:16:40 +00:00
|
|
|
const ab = await (await fetch(URL_TO_DOWNLOAD)).arrayBuffer();
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
/* Parse file and get first worksheet */
|
|
|
|
const wb = XLSX.read(ab);
|
2022-11-08 23:16:40 +00:00
|
|
|
const wsname = wb.SheetNames[0];
|
|
|
|
const ws = wb.Sheets[wsname];
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
/* Generate HTML */
|
|
|
|
var output = document.getElementById("TableContainer");
|
|
|
|
output.innerHTML = XLSX.utils.sheet_to_html(ws);
|
|
|
|
})();
|
|
|
|
</script>
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details open>
|
|
|
|
<summary><b>Live Example</b> (click to hide)</summary>
|
2023-06-25 09:36:58 +00:00
|
|
|
|
2024-04-26 04:16:13 +00:00
|
|
|
This demo processes https://docs.sheetjs.com/pres.numbers
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
```jsx live
|
|
|
|
/* The live editor requires this function wrapper */
|
2024-10-07 21:41:19 +00:00
|
|
|
function NUMBERS2HTML(props) {
|
2022-10-21 00:10:10 +00:00
|
|
|
const [__html, setHTML] = React.useState("");
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
/* Fetch and update HTML */
|
2024-01-31 08:14:07 +00:00
|
|
|
React.useEffect(() => { (async() => {
|
2022-05-16 03:26:04 +00:00
|
|
|
/* Fetch file */
|
2024-04-26 04:16:13 +00:00
|
|
|
const f = await fetch("https://docs.sheetjs.com/pres.numbers");
|
2022-05-16 03:26:04 +00:00
|
|
|
const ab = await f.arrayBuffer();
|
|
|
|
|
|
|
|
/* Parse file */
|
|
|
|
const wb = XLSX.read(ab);
|
|
|
|
const ws = wb.Sheets[wb.SheetNames[0]];
|
|
|
|
|
|
|
|
/* Generate HTML */
|
|
|
|
setHTML(XLSX.utils.sheet_to_html(ws));
|
2024-01-31 08:14:07 +00:00
|
|
|
})(); }, []);
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-02-28 11:40:44 +00:00
|
|
|
return ( <div dangerouslySetInnerHTML={{ __html }}/> );
|
2022-05-16 03:26:04 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
<a href="https://sheetjs.com/pro">SheetJS Pro Basic</a> extends this import with
|
|
|
|
support for CSS styling and rich text.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
### Preview a workbook on your device
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2024-04-08 04:47:04 +00:00
|
|
|
<details open>
|
|
|
|
<summary><b>Live Example</b> (click to hide)</summary>
|
2022-08-24 00:51:18 +00:00
|
|
|
|
|
|
|
This example starts from a CSV string. Use the File Input element to select
|
|
|
|
a workbook to load. Use the "Export XLSX" button to write the table to XLSX.
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
```jsx live
|
|
|
|
/* The live editor requires this function wrapper */
|
|
|
|
function Tabeller(props) {
|
2022-08-24 00:51:18 +00:00
|
|
|
const [__html, setHTML] = React.useState("");
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
/* Load sample data once */
|
|
|
|
React.useEffect(() => {
|
|
|
|
/* Starting CSV data -- change data here */
|
|
|
|
const csv = `\
|
2022-05-16 03:26:04 +00:00
|
|
|
This,is,a,Test
|
|
|
|
வணக்கம்,สวัสดี,你好,가지마
|
|
|
|
1,2,3,4`;
|
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
/* Parse CSV into a workbook object */
|
|
|
|
const wb = XLSX.read(csv, {type: "string"});
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
/* Get the worksheet (default name "Sheet1") */
|
|
|
|
const ws = wb.Sheets.Sheet1;
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
/* Create HTML table */
|
|
|
|
setHTML(XLSX.utils.sheet_to_html(ws, { id: "tabeller" }));
|
|
|
|
}, []);
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2023-02-28 11:40:44 +00:00
|
|
|
return ( <>
|
2022-08-24 00:51:18 +00:00
|
|
|
{/* Import Button */}
|
|
|
|
<input type="file" onChange={async(e) => {
|
|
|
|
/* get data as an ArrayBuffer */
|
|
|
|
const file = e.target.files[0];
|
|
|
|
const data = await file.arrayBuffer();
|
|
|
|
|
|
|
|
/* parse and load first worksheet */
|
|
|
|
const wb = XLSX.read(data);
|
|
|
|
const ws = wb.Sheets[wb.SheetNames[0]];
|
|
|
|
setHTML(XLSX.utils.sheet_to_html(ws, { id: "tabeller" }));
|
|
|
|
}}/>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
{/* Export Button */}
|
|
|
|
<button onClick={() => {
|
|
|
|
|
|
|
|
/* Create worksheet from HTML DOM TABLE */
|
2022-08-24 00:51:18 +00:00
|
|
|
const table = document.getElementById("tabeller");
|
2022-05-16 03:26:04 +00:00
|
|
|
const wb = XLSX.utils.table_to_book(table);
|
|
|
|
|
|
|
|
/* Export to file (start a download) */
|
|
|
|
XLSX.writeFile(wb, "SheetJSIntro.xlsx");
|
2022-08-24 00:51:18 +00:00
|
|
|
}}><b>Export XLSX!</b></button>
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-08-24 00:51:18 +00:00
|
|
|
{/* Show HTML preview */}
|
2022-10-21 00:10:10 +00:00
|
|
|
<div dangerouslySetInnerHTML={{ __html }}/>
|
2023-02-28 11:40:44 +00:00
|
|
|
</> );
|
2022-05-16 03:26:04 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
|
|
### Browser Testing
|
|
|
|
|
2024-10-26 03:17:31 +00:00
|
|
|
The test suite is regularly run against a number of modern and legacy browsers
|
|
|
|
using [Sauce Labs](https://saucelabs.com/).
|
|
|
|
|
|
|
|
The following chart shows test results on 2024 October 20 for version 0.20.3:
|
|
|
|
|
|
|
|
[![Build Status](pathname:///test/sheetjs.svg)](https://saucelabs.com/u/sheetjs)
|
|
|
|
|
|
|
|
:::info pass
|
|
|
|
|
|
|
|
In previous runs, tests passed in:
|
|
|
|
|
|
|
|
- Internet Explorer 6 - 11
|
|
|
|
- Chrome versions starting from 26
|
|
|
|
- Safari iOS versions starting from 8
|
|
|
|
- Android Browser versions starting from 5.1
|
|
|
|
- Safari macOS versions starting from 6
|
|
|
|
- Edge 13 - 18 and versions starting from 79
|
|
|
|
|
|
|
|
Sauce Labs has removed many legacy browser versions over the years. SheetJS LLC
|
|
|
|
maintains testing infrastructure for legacy deployments. For questions about
|
|
|
|
legacy browsers, please ask [in the SheetJS chat](https://sheetjs.com/chat).
|
|
|
|
|
|
|
|
For continued support with relevant runtimes including Salesforce LWC, NetSuite
|
|
|
|
SuiteScripts, and Adobe ExtendScript, SheetJS libraries include fallbacks and
|
|
|
|
shims that help preserve support in legacy browser environments.
|
|
|
|
|
|
|
|
:::
|
2022-05-16 03:26:04 +00:00
|
|
|
|
|
|
|
### Supported File Formats
|
|
|
|
|
2024-10-26 03:17:31 +00:00
|
|
|
["File Formats"](/docs/miscellany/formats) lists the supported file formats.
|
|
|
|
|
|
|
|
[![graph of format support](pathname:///formats.png)](/docs/miscellany/formats)
|
2022-05-16 03:26:04 +00:00
|
|
|
|
2022-10-30 05:45:37 +00:00
|
|
|
![graph legend](pathname:///legend.png)
|