diff --git a/docz/docs/02-getting-started/01-installation/01-standalone.mdx b/docz/docs/02-getting-started/01-installation/01-standalone.mdx index 1297995..6482eb5 100644 --- a/docz/docs/02-getting-started/01-installation/01-standalone.mdx +++ b/docz/docs/02-getting-started/01-installation/01-standalone.mdx @@ -100,7 +100,7 @@ importScripts("https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.mi -## ECMAScript Module Imports in a SCRIPT TAG +## ECMAScript Module Imports :::caution @@ -150,6 +150,7 @@ xport.addEventListener("click", async() => { `} +Web Worker support is noted in [the demo](../../demos/worker#installation) ## Bower diff --git a/docz/docs/03-demos/06-content.md b/docz/docs/03-demos/06-content.md index 2e434ab..459d99b 100644 --- a/docz/docs/03-demos/06-content.md +++ b/docz/docs/03-demos/06-content.md @@ -26,7 +26,7 @@ This was tested against `lume v1.12.0` on 2022 October 4. 1) Create a stock site: ```bash -mkdir sheetjs-lume +mkdir -p sheetjs-lume cd sheetjs-lume deno run -A https://deno.land/x/lume/init.ts ``` @@ -41,7 +41,7 @@ The project will be configured and modules will be installed. 2) Download and place in a `_data` folder: ```bash -mkdir _data +mkdir -p _data curl -LO https://sheetjs.com/pres.numbers mv pres.numbers _data ``` diff --git a/docz/docs/03-demos/07-worker.md b/docz/docs/03-demos/07-worker.md index 43aa263..96611aa 100644 --- a/docz/docs/03-demos/07-worker.md +++ b/docz/docs/03-demos/07-worker.md @@ -25,9 +25,48 @@ importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js For production use, it is highly encouraged to download and host the script. +
ECMAScript Module Support (click to show) + +:::note Browser Compatibility + +ESM is supported in Web Workers in the Chromium family of browsers (including +Chrome and Edge) as well as in Webkit-based browsers (including Safari). + +For support in legacy browsers like Firefox, `importScripts` should be used. + +::: + +```js +import * as XLSX from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs"; +``` + +When using modules, the script must be served with the correct MIME type and the +Worker constructor must set the `type` option: + +```js +const worker_code = `\ +/* load standalone script from CDN */ +import * as XLSX from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs"; +// ... do something with XLSX here ... +`; +const worker = new Worker( + URL.createObjectURL( + new Blob( + [ worker_code ], + // highlight-next-line + { type: "text/javascript" } // second argument to the Blob constructor + ) + ), + // highlight-next-line + {type: "module"} // second argument to Worker constructor +); +``` + +
+ ## Downloading a Remote File -:::note +:::note fetch in Web Workers `fetch` was enabled in Web Workers in Chrome 42 and Safari 10.3 @@ -46,7 +85,7 @@ In the following example, the script: ```jsx live function SheetJSFetchDLWorker() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); return ( <> -
+
); } ``` ## Creating a Local File -:::caution `XLSX.writeFile` +:::caution Writing files from Web Workers `XLSX.writeFile` will not work in Web Workers! Raw file data can be passed from the Web Worker to the main browser context for downloading. @@ -106,7 +145,7 @@ In the following example, the script: ```jsx live function SheetJSWriteFileWorker() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); return ( <> -
+
); } ``` ## User-Submitted File -:::note +:::note FileReaderSync Typically `FileReader` is used in the main browser context. In Web Workers, the synchronous version `FileReaderSync` is more efficient. ::: -In the following example, the script: +In the following example, when a file is dropped over the DIV or when the INPUT +element is used to select a file, the script: -- waits for the user to drag-drop a file into a DIV - sends the `File` object to the Web Worker - loads the SheetJS library and parses the file in the Worker - generates an HTML string of the first table in the Worker @@ -179,15 +218,12 @@ In the following example, the script: ```jsx live function SheetJSDragDropWorker() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* suppress default behavior for drag and drop */ function suppress(e) { e.stopPropagation(); e.preventDefault(); } - return ( <> -
{ - suppress(e); - /* this mantra embeds the worker source in the function */ - const worker = new Worker(URL.createObjectURL(new Blob([`\ + /* this worker is shared between drag-drop and file input element */ + const worker = new Worker(URL.createObjectURL(new Blob([`\ /* load standalone script from CDN */ importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"); @@ -205,19 +241,27 @@ self.addEventListener('message', (e) => { const html = XLSX.utils.sheet_to_html(ws); /* Reply with result */ - postMessage({html: html}); + postMessage({ html }); } catch(e) { /* Pass the error message back */ postMessage({html: String(e.message || e).bold() }); } }, false); - `]))); - /* when the worker sends back the HTML, add it to the DOM */ - worker.onmessage = function(e) { setHTML(e.data.html); }; + `]))); + /* when the worker sends back the HTML, add it to the DOM */ + worker.onmessage = function(e) { setHTML(e.data.html); }; + return ( <> +
{ + suppress(e); /* post a message with the first File to the worker */ worker.postMessage({ file: e.dataTransfer.files[0] }); - }}>Drag a file to this DIV to process!
-
+ }}>Drag a file to this DIV to process! (or use the file input)
+ { + suppress(e); + /* post a message with the first File to the worker */ + worker.postMessage({ file: e.target.files[0] }); + }}/> +
); } ``` \ No newline at end of file diff --git a/docz/docs/03-demos/12-react.md b/docz/docs/03-demos/12-react.md index fb7a0b5..f6103c9 100644 --- a/docz/docs/03-demos/12-react.md +++ b/docz/docs/03-demos/12-react.md @@ -130,7 +130,7 @@ import { read, utils, writeFileXLSX } from 'xlsx'; export default function SheetJSReactHTML() { /* the component state is an HTML string */ - const [html, setHtml] = useState(""); + const [__html, setHtml] = useState(""); /* the ref is used in export */ const tbl = useRef(null); @@ -157,7 +157,7 @@ export default function SheetJSReactHTML() { return ( <> // highlight-next-line -
+
); } ``` diff --git a/docz/docs/03-demos/19-bundler.md b/docz/docs/03-demos/19-bundler.md index 8278ea3..62e9429 100644 --- a/docz/docs/03-demos/19-bundler.md +++ b/docz/docs/03-demos/19-bundler.md @@ -782,7 +782,7 @@ With configuration, SystemJS supports both browser and NodeJS deployments. :::caution -This demo was written against SystemJS 0.19, the most popular SystemJS version. +This demo was written against SystemJS 0.19, the most popular SystemJS version used with Angular applications. In the years since the release, Angular and other tools using SystemJS have switched to Webpack. diff --git a/docz/docs/03-demos/21-aws.md b/docz/docs/03-demos/21-aws.md index 4ec34c0..d3ea438 100644 --- a/docz/docs/03-demos/21-aws.md +++ b/docz/docs/03-demos/21-aws.md @@ -119,7 +119,7 @@ exports.handler = function(event, context, callback) { 1) Create a new folder and download [`index.js`](pathname:///aws/index.js): ```bash -mkdir SheetJSLambda +mkdir -p SheetJSLambda cd SheetJSLambda curl -LO https://docs.sheetjs.com/aws/index.js ``` @@ -127,7 +127,7 @@ curl -LO https://docs.sheetjs.com/aws/index.js 2) Install dependencies to the current directory; ```bash -mkdir node_modules +mkdir -p node_modules npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz busboy ``` diff --git a/docz/docs/03-demos/34-network.mdx b/docz/docs/03-demos/34-network.mdx index 76efc87..87070ff 100644 --- a/docz/docs/03-demos/34-network.mdx +++ b/docz/docs/03-demos/34-network.mdx @@ -107,7 +107,7 @@ and show the data in an HTML table. ```jsx live function SheetJSXHRDL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* Fetch and update HTML */ React.useEffect(async() => { @@ -126,7 +126,7 @@ function SheetJSXHRDL() { req.send(); }, []); - return (
); + return (
); } ``` @@ -156,7 +156,7 @@ will parse the workbook and return an HTML table. ```jsx live function SheetJSXHRUL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); const [sz, setSz] = React.useState(0); const csv = "a,b,c\n1,2,3"; /* Fetch and update HTML */ @@ -183,7 +183,7 @@ function SheetJSXHRUL() {
{csv}
{sz ? (<> Generated file size: {sz} bytes -
+
) : ()} ); } @@ -217,7 +217,7 @@ the data in an HTML table. ```jsx live function SheetJSFetchDL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* Fetch and update HTML */ React.useEffect(async() => { @@ -233,7 +233,7 @@ function SheetJSFetchDL() { setHTML(XLSX.utils.sheet_to_html(ws)); }, []); - return (
); + return (
); } ``` @@ -253,7 +253,7 @@ the workbook and return an HTML table. ```jsx live function SheetJSFetchUL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); const [sz, setSz] = React.useState(0); const csv = "a,b,c\n1,2,3"; /* Fetch and update HTML */ @@ -280,7 +280,7 @@ function SheetJSFetchUL() {
{csv}
{sz ? (<> Generated file size: {sz} bytes -
+
) : ()} ); } @@ -315,7 +315,7 @@ the data in an HTML table. ```jsx live function SheetJSAxiosDL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* Fetch and update HTML */ React.useEffect(async() => { @@ -330,7 +330,7 @@ function SheetJSAxiosDL() { setHTML(XLSX.utils.sheet_to_html(ws)); }, []); - return (
); + return (
); } ``` @@ -349,7 +349,7 @@ the workbook and return an HTML table. ```jsx live function SheetJSAxiosUL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); const [sz, setSz] = React.useState(0); const csv = "a,b,c\n1,2,3"; /* Fetch and update HTML */ @@ -376,7 +376,7 @@ function SheetJSAxiosUL() {
{csv}
{sz ? (<> Generated file size: {sz} bytes -
+
) : ()} ); } @@ -406,7 +406,7 @@ show the data in an HTML table. ```jsx live function SheetJSSuperAgentDL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* Fetch and update HTML */ React.useEffect(async() => { @@ -424,7 +424,7 @@ function SheetJSSuperAgentDL() { }); }, []); - return (
); + return (
); } ``` @@ -444,7 +444,7 @@ parse the workbook and return an HTML table. ```jsx live function SheetJSSuperAgentUL() { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); const [sz, setSz] = React.useState(0); const csv = "a,b,c\n1,2,3"; /* Fetch and update HTML */ @@ -472,7 +472,7 @@ function SheetJSSuperAgentUL() {
{csv}
{sz ? (<> Generated file size: {sz} bytes -
+
) : ()} ); } diff --git a/docz/docs/07-csf/07-features/01-formulae.md b/docz/docs/07-csf/07-features/01-formulae.md index 2d465ab..4a3952d 100644 --- a/docz/docs/07-csf/07-features/01-formulae.md +++ b/docz/docs/07-csf/07-features/01-formulae.md @@ -594,3 +594,12 @@ Z.TEST ``` + +## Caveats + +In some cases, seemingly valid formulae may be rejected by spreadsheet software. + +`EVALUATE` unprefixed function is supported in WPS Office formulae. It is not +valid in a cell formula in Excel. It can be used in an Excel defined name when +exporting to XLSM format but not XLSX. This is a limitation of Excel. Since WPS +Office accepts files with `EVALUATE`, the writer does not warn or throw errors. \ No newline at end of file diff --git a/docz/docs/09-miscellany/01-formats.md b/docz/docs/09-miscellany/01-formats.md index 6afdf9a..0b4a586 100644 --- a/docz/docs/09-miscellany/01-formats.md +++ b/docz/docs/09-miscellany/01-formats.md @@ -29,6 +29,7 @@ hide_table_of_contents: true | UTF-16 Unicode Text (TXT) | ✔ | ✔ | | **Other Workbook/Worksheet Formats** |:-----:|:-----:| | Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) | ✔ | ✔ | +| WPS 电子表格 (ET) | ✔ | | | OpenDocument Spreadsheet (ODS) | ✔ | ✔ | | Flat XML ODF Spreadsheet (FODS) | ✔ | ✔ | | Uniform Office Format Spreadsheet (标文通 UOS1/UOS2) | ✔ | | @@ -180,7 +181,7 @@ The parser focuses on extracting raw data from tables. Numbers technically supports multiple tables in a logical worksheet, including custom titles. This parser will generate one worksheet per Numbers table. -The writer currently exports a small range from the first worksheet. +The writer generates one table per sheet. #### OpenDocument Spreadsheet (ODS/FODS) @@ -195,6 +196,11 @@ UOS is a very similar format, and it comes in 2 varieties corresponding to ODS and FODS respectively. For the most part, the difference between the formats is in the names of tags and attributes. +#### WPS Office Spreadsheet (ET) + +ET is the native format for WPS Office Spreadsheet. It extends the BIFF8 XLS +format with proprietary extensions. + ### Miscellaneous Worksheet Formats Many older formats supported only one worksheet: diff --git a/docz/docs/img/formats.png b/docz/docs/img/formats.png index df08436..2feac89 100644 Binary files a/docz/docs/img/formats.png and b/docz/docs/img/formats.png differ diff --git a/docz/docs/index.md b/docz/docs/index.md index e509066..dbdae86 100644 --- a/docz/docs/index.md +++ b/docz/docs/index.md @@ -147,7 +147,7 @@ support for CSS styling and rich text. ```jsx live /* The live editor requires this function wrapper */ function Numbers2HTML(props) { - const [html, setHTML] = React.useState(""); + const [__html, setHTML] = React.useState(""); /* Fetch and update HTML */ React.useEffect(async() => { @@ -163,7 +163,7 @@ function Numbers2HTML(props) { setHTML(XLSX.utils.sheet_to_html(ws)); }, []); - return (
); + return (
); } ``` @@ -227,7 +227,7 @@ This,is,a,Test }}>Export XLSX! {/* Show HTML preview */} -
+
); } ``` diff --git a/formats.png b/formats.png index df08436..2feac89 100644 Binary files a/formats.png and b/formats.png differ diff --git a/legend.png b/legend.png index 686a751..a026f39 100644 Binary files a/legend.png and b/legend.png differ diff --git a/misc/formats.dot b/misc/formats.dot index bf66348..7d872b8 100644 --- a/misc/formats.dot +++ b/misc/formats.dot @@ -17,6 +17,7 @@ digraph G { subgraph OLD { node [style=filled,color=cyan]; nums [label="NUMBERS"]; + et [label="ET"]; ods [label="ODS"]; fods [label="FODS"]; uos [label="UOS"]; @@ -43,61 +44,62 @@ digraph G { subgraph WORKBOOK { edge [color=blue]; - csf -> xlsx + csf -> xlsx xlsx -> csf - csf -> xlsb + csf -> xlsb xlsb -> csf - csf -> xlml + csf -> xlml xlml -> csf - csf -> xls5 + csf -> xls5 xls5 -> csf - csf -> xls8 + csf -> xls8 xls8 -> csf - wq2 -> csf - ods -> csf - csf -> ods + wq2 -> csf + ods -> csf + csf -> ods fods -> csf - csf -> fods - uos -> csf - wk3 -> csf - csf -> wk3 - wk4 -> csf - 123 -> csf - qpw -> csf + csf -> fods + uos -> csf + wk3 -> csf + csf -> wk3 + wk4 -> csf + 123 -> csf + qpw -> csf nums -> csf - csf -> nums + csf -> nums + et -> csf } subgraph WORKSHEET { edge [color=aquamarine4]; xls2 -> csf - csf -> xls2 + csf -> xls2 xls3 -> csf - csf -> xls3 + csf -> xls3 xls4 -> csf - csf -> xls4 - csf -> slk - slk -> csf - csf -> dif - wk1 -> csf - csf -> wk1 - xlr -> csf - wq1 -> csf + csf -> xls4 + csf -> slk + slk -> csf + csf -> dif + wk1 -> csf + csf -> wk1 + xlr -> csf + wq1 -> csf wksl -> csf wksm -> csf - dif -> csf - rtf -> csf - csf -> rtf - prn -> csf - csf -> prn - csv -> csf - csf -> csv - txt -> csf - csf -> txt - dbf -> csf - csf -> dbf + dif -> csf + rtf -> csf + csf -> rtf + prn -> csf + csf -> prn + csv -> csf + csf -> csv + txt -> csf + csf -> txt + dbf -> csf + csf -> dbf html -> csf - csf -> html - csf -> eth - eth -> csf + csf -> html + csf -> eth + eth -> csf } } diff --git a/misc/formats.svg b/misc/formats.svg index 5ad4263..81099bd 100644 --- a/misc/formats.svg +++ b/misc/formats.svg @@ -1,540 +1,552 @@ - - - + + G - + csf - - -Common -Spreadsheet -Format -(JS Object) + + +Common +Spreadsheet +Format +(JS Object) xls2 - -XLS -BIFF2 + +XLS +BIFF2 - + csf->xls2 - - + + xls3 - -XLS -BIFF3 + +XLS +BIFF3 - + csf->xls3 - - + + xls4 - -XLS -BIFF4 + +XLS +BIFF4 - + csf->xls4 - - + + xls5 - -XLS -BIFF5 + +XLS +BIFF5 csf->xls5 - - + + xls8 - -XLS -BIFF8 + +XLS +BIFF8 csf->xls8 - - + + xlml - -SSML -(2003/4) + +SSML +(2003/4) csf->xlml - - + + xlsx - -XLSX -XLSM + +XLSX +XLSM csf->xlsx - - + + xlsb - -XLSB -BIFF12 + +XLSB +BIFF12 csf->xlsb - - + + nums - -NUMBERS + +NUMBERS csf->nums - - + + - + ods - -ODS + +ODS csf->ods - - + + - + fods - -FODS + +FODS csf->fods - - + + - + html - -HTML -Table + +HTML +Table - + csf->html - - + + - + csv - -CSV + +CSV - + csf->csv - - + + - + txt - -TXT -UTF-16 + +TXT +UTF-16 - + csf->txt - - + + - + dbf - -DBF + +DBF - + csf->dbf - - + + - + dif - -DIF + +DIF - + csf->dif - - + + - + slk - -SYLK + +SYLK - + csf->slk - - + + - + prn - -PRN + +PRN - + csf->prn - - + + - + rtf - -RTF + +RTF - + csf->rtf - - + + - + wk1 - -WK1 + +WK1 - + csf->wk1 - - + + - + wk3 - -WK3 + +WK3 csf->wk3 - - + + - + eth - -ETH + +ETH - + csf->eth - - + + - + xls2->csf - - + + - + xls3->csf - - + + - + xls4->csf - - + + xls5->csf - - + + xls8->csf - - + + xlml->csf - - + + xlsx->csf - - + + xlsb->csf - - + + nums->csf - - + + + + + +et + +ET + + + +et->csf + + ods->csf - - + + fods->csf - - + + - + uos - -UOS + +UOS uos->csf - - + + - + html->csf - - + + - + csv->csf - - + + - + txt->csf - - + + - + dbf->csf - - + + - + dif->csf - - + + - + slk->csf - - + + - + prn->csf - - + + - + rtf->csf - - + + - + wk1->csf - - + + - + wksl - -WKS -Lotus + +WKS +Lotus - + wksl->csf - - + + wk3->csf - - + + - + wk4 - -WK4 + +WK4 wk4->csf - - + + - + 123 - -123 + +123 123->csf - - + + - + wksm - -WKS -Works + +WKS +Works - + wksm->csf - - + + - + xlr - -XLR + +XLR - + xlr->csf - - + + - + wq1 - -WQ1 + +WQ1 - + wq1->csf - - + + - + wq2 - -WQ2 -WB* + +WQ2 +WB* wq2->csf - - + + - + qpw - -QPW + +QPW qpw->csf - - + + - + eth->csf - - + + diff --git a/misc/formats.svg.svg b/misc/formats.svg.svg index 60ce144..f96867f 100644 --- a/misc/formats.svg.svg +++ b/misc/formats.svg.svg @@ -1,533 +1,545 @@ - - -G - + + +G + csf - - -Common -Spreadsheet -Format -(JS Object) + + +Common +Spreadsheet +Format +(JS Object) xls2 - -XLS -BIFF2 + +XLS +BIFF2 - + csf->xls2 - - + + xls3 - -XLS -BIFF3 + +XLS +BIFF3 - + csf->xls3 - - + + xls4 - -XLS -BIFF4 + +XLS +BIFF4 - + csf->xls4 - - + + xls5 - -XLS -BIFF5 + +XLS +BIFF5 csf->xls5 - - + + xls8 - -XLS -BIFF8 + +XLS +BIFF8 csf->xls8 - - + + xlml - -SSML -(2003/4) + +SSML +(2003/4) csf->xlml - - + + xlsx - -XLSX -XLSM + +XLSX +XLSM csf->xlsx - - + + xlsb - -XLSB -BIFF12 + +XLSB +BIFF12 csf->xlsb - - + + nums - -NUMBERS + +NUMBERS csf->nums - - + + - + ods - -ODS + +ODS csf->ods - - + + - + fods - -FODS + +FODS csf->fods - - + + - + html - -HTML -Table + +HTML +Table - + csf->html - - + + - + csv - -CSV + +CSV - + csf->csv - - + + - + txt - -TXT -UTF-16 + +TXT +UTF-16 - + csf->txt - - + + - + dbf - -DBF + +DBF - + csf->dbf - - + + - + dif - -DIF + +DIF - + csf->dif - - + + - + slk - -SYLK + +SYLK - + csf->slk - - + + - + prn - -PRN + +PRN - + csf->prn - - + + - + rtf - -RTF + +RTF - + csf->rtf - - + + - + wk1 - -WK1 + +WK1 - + csf->wk1 - - + + - + wk3 - -WK3 + +WK3 csf->wk3 - - + + - + eth - -ETH + +ETH - + csf->eth - - + + - + xls2->csf - - + + - + xls3->csf - - + + - + xls4->csf - - + + xls5->csf - - + + xls8->csf - - + + xlml->csf - - + + xlsx->csf - - + + xlsb->csf - - + + nums->csf - - + + + + + +et + +ET + + + +et->csf + + ods->csf - - + + fods->csf - - + + - + uos - -UOS + +UOS uos->csf - - + + - + html->csf - - + + - + csv->csf - - + + - + txt->csf - - + + - + dbf->csf - - + + - + dif->csf - - + + - + slk->csf - - + + - + prn->csf - - + + - + rtf->csf - - + + - + wk1->csf - - + + - + wksl - -WKS -Lotus + +WKS +Lotus - + wksl->csf - - + + wk3->csf - - + + - + wk4 - -WK4 + +WK4 wk4->csf - - + + - + 123 - -123 + +123 123->csf - - + + - + wksm - -WKS -Works + +WKS +Works - + wksm->csf - - + + - + xlr - -XLR + +XLR - + xlr->csf - - + + - + wq1 - -WQ1 + +WQ1 - + wq1->csf - - + + - + wq2 - -WQ2 -WB* + +WQ2 +WB* wq2->csf - - + + - + qpw - -QPW + +QPW qpw->csf - - + + - + eth->csf - - + + \ No newline at end of file diff --git a/misc/legend.svg.svg b/misc/legend.svg.svg index 5fa67da..c454ba2 100644 --- a/misc/legend.svg.svg +++ b/misc/legend.svg.svg @@ -1,115 +1,115 @@ - + G - + cluster_0 - + Supported Format Types cluster_1 - + Workbook Format Conversions (blue arrow) cluster_2 - + Single-Worksheet Format Conversions (green arrow) XL - + Excel CSF - - + + JS x1i - + XLSX OLD - + Other c1 - - + + JS x1o - + XLSB x1i->c1 - - + + read x2i - + SYLK c1->x1o - - + + write c2 - - + + JS x2o - + CSV x2i->c2 - - + + read c2->x2o - - + + write