This commit is contained in:
SheetJS 2022-02-01 01:12:44 -05:00
parent 098ebf5378
commit b3d7e76c41
3 changed files with 282 additions and 84 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 203 KiB

@ -91,19 +91,19 @@ enhancements, additional features like styling, and dedicated support.</p>
<p><a href="https://sheetjs.com/demos" rel="nofollow"><strong>In-Browser Demos</strong></a></p>
<p><a href="https://git.io/xlsx" rel="nofollow"><strong>Source Code</strong></a></p>
<p><a href="https://github.com/sheetjs/sheetjs/issues"><strong>Issues and Bug Reports</strong></a></p>
<p><a href="#file-formats"><strong>File format support for known spreadsheet data formats:</strong></a></p>
<details>
<summary><b>Graph of supported formats</b> (click to show)</summary>
<p><a href="https://camo.githubusercontent.com/756bdb2076e17b3344ba27668018c9f0011b82a2a02f029790b3e3aa805154d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53686565744a532f73686565746a73" target="_blank" rel="nofollow"><img src="https://camo.githubusercontent.com/756bdb2076e17b3344ba27668018c9f0011b82a2a02f029790b3e3aa805154d7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53686565744a532f73686565746a73" alt="License" data-canonical-src="https://img.shields.io/github/license/SheetJS/sheetjs" style="max-width:100%;"></a>
<a href="https://github.com/SheetJS/sheetjs/actions"><img src="https://camo.githubusercontent.com/dba2780ce8f220a047aa004f096aa7b440ceee8afdb7a8b8f539e240e33673d5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f73686565746a732f73686565746a732f54657374733a2532306e6f64652e6a73" alt="Build Status" data-canonical-src="https://img.shields.io/github/workflow/status/sheetjs/sheetjs/Tests:%20node.js" style="max-width:100%;"></a>
<a href="https://snyk.io/test/github/SheetJS/sheetjs" rel="nofollow"><img src="https://camo.githubusercontent.com/7ce09de464c75d8a533b9b2a156b487ab8db9f025f6ca9119395d894e82f69a7/68747470733a2f2f696d672e736869656c64732e696f2f736e796b2f76756c6e65726162696c69746965732f6769746875622f53686565744a532f73686565746a73" alt="Snyk Vulnerabilities" data-canonical-src="https://img.shields.io/snyk/vulnerabilities/github/SheetJS/sheetjs" style="max-width:100%;"></a>
<a href="https://npmjs.org/package/xlsx" rel="nofollow"><img src="https://camo.githubusercontent.com/d271e8f58341837d08c59de862121e6faa608414d48b74fd12b88c507ee1bcdf/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f786c73782e737667" alt="npm Downloads" data-canonical-src="https://img.shields.io/npm/dm/xlsx.svg" style="max-width:100%;"></a>
<a href="https://www.jsdelivr.com/package/npm/xlsx" rel="nofollow"><img src="https://camo.githubusercontent.com/387e53d00f2bfc61d8145101e8f379fa3102402e558f80b1ba4857af4a41baf8/68747470733a2f2f646174612e6a7364656c6976722e636f6d2f76312f7061636b6167652f6e706d2f786c73782f6261646765" alt="jsDelivr Downloads" data-canonical-src="https://data.jsdelivr.com/v1/package/npm/xlsx/badge" style="max-width:100%;"></a>
<a href="https://github.com/SheetJS/sheetjs"><img src="https://camo.githubusercontent.com/5835ef9524626d64db0c7a60890d3723b178fb5ca8783250f405dd15dfc3b000/68747470733a2f2f67612d626561636f6e2e61707073706f742e636f6d2f55412d33363831303333332d312f53686565744a532f73686565746a733f706978656c" alt="Analytics" data-canonical-src="https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/sheetjs?pixel" style="max-width:100%;"></a></p>
<p><a href="https://oss.sheetjs.com/sheetjs/tests/" rel="nofollow"><strong>Browser Test and Support Matrix</strong></a></p>
<p><a href="https://saucelabs.com/u/sheetjs" rel="nofollow"><img src="https://camo.githubusercontent.com/fd3943851066063e253cd05bc1a8b9436b80f841af7d193c3eacb560012acea6/68747470733a2f2f73617563656c6162732e636f6d2f62726f777365722d6d61747269782f73686565746a732e737667" alt="Build Status" data-canonical-src="https://saucelabs.com/browser-matrix/sheetjs.svg" style="max-width:100%;"></a></p>
<p><strong>Supported File Formats</strong></p>
<p><a href="formats.png" target="_blank" rel="noopener noreferrer"><img src="formats.png" alt="circo graph of format support" style="max-width:100%;"></a></p>
<details><summary><b>Diagram Legend</b> (click to show)</summary>
<p><a href="legend.png" target="_blank" rel="noopener noreferrer"><img src="legend.png" alt="graph legend" style="max-width:100%;"></a></p>
</details>
<p><a href="https://oss.sheetjs.com/sheetjs/tests/" rel="nofollow"><strong>Browser Test</strong></a></p>
<p><a href="https://saucelabs.com/u/sheetjs" rel="nofollow"><img src="https://camo.githubusercontent.com/fd3943851066063e253cd05bc1a8b9436b80f841af7d193c3eacb560012acea6/68747470733a2f2f73617563656c6162732e636f6d2f62726f777365722d6d61747269782f73686565746a732e737667" alt="Build Status" data-canonical-src="https://saucelabs.com/browser-matrix/sheetjs.svg" style="max-width:100%;"></a></p>
<p><a href="https://semaphoreci.com/sheetjs/sheetjs" rel="nofollow"><img src="https://camo.githubusercontent.com/fdf58475670abd49ba7dfd07743cc1115128591b1126c4c792feb332ba089d7e/68747470733a2f2f73656d6170686f726563692e636f6d2f6170692f76312f73686565746a732f73686565746a732f6272616e636865732f6d61737465722f736869656c64735f62616467652e737667" alt="Build Status" data-canonical-src="https://semaphoreci.com/api/v1/sheetjs/sheetjs/branches/master/shields_badge.svg" style="max-width:100%;"></a>
<a href="https://coveralls.io/r/SheetJS/sheetjs?branch=master" rel="nofollow"><img src="https://camo.githubusercontent.com/c510a0022ed4379cc28dd9abc05bac53feef69d66fbd1883e40c7505649916b3/68747470733a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f53686565744a532f73686565746a732f6d61737465722e737667" alt="Coverage Status" data-canonical-src="https://img.shields.io/coveralls/SheetJS/sheetjs/master.svg" style="max-width:100%;"></a>
<a href="https://david-dm.org/sheetjs/sheetjs" rel="nofollow"><img src="https://camo.githubusercontent.com/4e021c513c3dfd1b88c144e855b6e3815d2bc9c93021e39e3fba1aa2d4a11e67/68747470733a2f2f64617669642d646d2e6f72672f73686565746a732f73686565746a732f7374617475732e737667" alt="Dependencies Status" data-canonical-src="https://david-dm.org/sheetjs/sheetjs/status.svg" style="max-width:100%;"></a>
<a href="https://npmjs.org/package/xlsx" rel="nofollow"><img src="https://camo.githubusercontent.com/afba95100349a4110c4408973a3c9c3557762e14fdc9088e7ea6dd3746d2139b/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f786c73782e737667" alt="npm Downloads" data-canonical-src="https://img.shields.io/npm/dt/xlsx.svg" style="max-width:100%;"></a>
<a href="https://github.com/SheetJS/sheetjs"><img src="https://camo.githubusercontent.com/5835ef9524626d64db0c7a60890d3723b178fb5ca8783250f405dd15dfc3b000/68747470733a2f2f67612d626561636f6e2e61707073706f742e636f6d2f55412d33363831303333332d312f53686565744a532f73686565746a733f706978656c" alt="Analytics" data-canonical-src="https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/sheetjs?pixel" style="max-width:100%;"></a></p>
<h2>
<a id="user-content-table-of-contents" class="anchor" href="#table-of-contents" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Table of Contents</h2>
<details>
@ -241,6 +241,8 @@ enhancements, additional features like styling, and dedicated support.</p>
<ul>
<li><a href="#lotus-1-2-3-wkswk1wk2wk3wk4123">Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)</a></li>
<li><a href="#quattro-pro-wq1wq2wb1wb2wb3qpw">Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)</a></li>
<li><a href="#works-for-dos--windows-spreadsheet-wksxlr">Works for DOS / Windows Spreadsheet (WKS/XLR)</a></li>
<li><a href="#numbers-30--iwork-2013-spreadsheet-numbers">Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS)</a></li>
<li><a href="#opendocument-spreadsheet-odsfods">OpenDocument Spreadsheet (ODS/FODS)</a></li>
<li><a href="#uniform-office-spreadsheet-uos12">Uniform Office Spreadsheet (UOS1/2)</a></li>
</ul>
@ -326,7 +328,7 @@ enhancements, additional features like styling, and dedicated support.</p>
<p><strong>Frameworks and APIs</strong></p>
<ul>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/angular/"><code>angularjs</code></a></li>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/angular2/"><code>angular 2 / 4 / 5 / 6 and ionic</code></a></li>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/angular2/"><code>angular and ionic</code></a></li>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/knockout/"><code>knockout</code></a></li>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/meteor/"><code>meteor</code></a></li>
<li><a href="https://github.com/SheetJS/SheetJS/tree/master/demos/react/"><code>react and react-native</code></a></li>
@ -373,7 +375,13 @@ be included directly:</p>
<span class="pl-kos">&lt;</span><span class="pl-ent">script</span> <span class="pl-c1">src</span>="<span class="pl-s">dist/cpexcel.js</span>"<span class="pl-kos">&gt;</span><span class="pl-kos">&lt;/</span><span class="pl-ent">script</span><span class="pl-kos">&gt;</span></pre></div>
<p>An appropriate version for each dependency is included in the dist/ directory.</p>
<p>The complete single-file version is generated at <code>dist/xlsx.full.min.js</code></p>
<p>A slimmer build with XLSX / HTML support is generated at <code>dist/xlsx.mini.min.js</code></p>
<p>A slimmer build is generated at <code>dist/xlsx.mini.min.js</code>. Compared to full build:</p>
<ul>
<li>codepage library skipped (no support for XLS encodings)</li>
<li>XLSX compression option not currently available</li>
<li>no support for XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003</li>
<li>node stream utils removed</li>
</ul>
<p>Webpack and Browserify builds include optional modules by default. Webpack can
be configured to remove support with <code>resolve.alias</code>:</p>
<div class="highlight highlight-source-js"><pre> <span class="pl-c">/* uncomment the lines below to remove support */</span>
@ -482,8 +490,7 @@ includes more examples with <code>XMLHttpRequest</code> and <code>fetch</code>.<
<span class="pl-s1">req</span><span class="pl-kos">.</span><span class="pl-c1">responseType</span> <span class="pl-c1">=</span> <span class="pl-s">"arraybuffer"</span><span class="pl-kos">;</span>
<span class="pl-s1">req</span><span class="pl-kos">.</span><span class="pl-en">onload</span> <span class="pl-c1">=</span> <span class="pl-k">function</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">Uint8Array</span><span class="pl-kos">(</span><span class="pl-s1">req</span><span class="pl-kos">.</span><span class="pl-c1">response</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">,</span> <span class="pl-kos">{</span><span class="pl-c1">type</span>:<span class="pl-s">"array"</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">req</span><span class="pl-kos">.</span><span class="pl-c1">response</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* DO SOMETHING WITH workbook HERE */</span>
<span class="pl-kos">}</span>
@ -492,14 +499,23 @@ includes more examples with <code>XMLHttpRequest</code> and <code>fetch</code>.<
</details>
<details>
<summary><b>Browser drag-and-drop</b> (click to show)</summary>
<p>Drag-and-drop uses the HTML5 <code>FileReader</code> API.</p>
<p>For modern browsers, <code>Blob#arrayBuffer</code> can read data from files:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-k">async</span> <span class="pl-k">function</span> <span class="pl-en">handleDropAsync</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">stopPropagation</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">preventDefault</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">f</span> <span class="pl-c1">=</span> <span class="pl-s1">evt</span><span class="pl-kos">.</span><span class="pl-c1">dataTransfer</span><span class="pl-kos">.</span><span class="pl-c1">files</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">f</span><span class="pl-kos">.</span><span class="pl-en">arrayBuffer</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* DO SOMETHING WITH workbook HERE */</span>
<span class="pl-kos">}</span>
<span class="pl-s1">drop_dom_element</span><span class="pl-kos">.</span><span class="pl-en">addEventListener</span><span class="pl-kos">(</span><span class="pl-s">'drop'</span><span class="pl-kos">,</span> <span class="pl-s1">handleDropAsync</span><span class="pl-kos">,</span> <span class="pl-c1">false</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p>For maximal compatibility, the <code>FileReader</code> API should be used:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-k">function</span> <span class="pl-en">handleDrop</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">stopPropagation</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-en">preventDefault</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">files</span> <span class="pl-c1">=</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">dataTransfer</span><span class="pl-kos">.</span><span class="pl-c1">files</span><span class="pl-kos">,</span> <span class="pl-s1">f</span> <span class="pl-c1">=</span> <span class="pl-s1">files</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">f</span> <span class="pl-c1">=</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">dataTransfer</span><span class="pl-kos">.</span><span class="pl-c1">files</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">reader</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">FileReader</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">reader</span><span class="pl-kos">.</span><span class="pl-en">onload</span> <span class="pl-c1">=</span> <span class="pl-k">function</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">Uint8Array</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">result</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">,</span> <span class="pl-kos">{</span><span class="pl-c1">type</span>: <span class="pl-s">'array'</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">result</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* DO SOMETHING WITH workbook HERE */</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span>
@ -509,14 +525,23 @@ includes more examples with <code>XMLHttpRequest</code> and <code>fetch</code>.<
</details>
<details>
<summary><b>Browser file upload form element</b> (click to show)</summary>
<p>Data from file input elements can be processed using the same <code>FileReader</code> API
as in the drag-and-drop example:</p>
<p>Data from file input elements can be processed using the same APIs as in the
drag-and-drop example.</p>
<p>Using <code>Blob#arrayBuffer</code>:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-k">async</span> <span class="pl-k">function</span> <span class="pl-en">handleFileAsync</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">const</span> <span class="pl-s1">file</span> <span class="pl-c1">=</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">files</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">file</span><span class="pl-kos">.</span><span class="pl-en">arrayBuffer</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* DO SOMETHING WITH workbook HERE */</span>
<span class="pl-kos">}</span>
<span class="pl-s1">input_dom_element</span><span class="pl-kos">.</span><span class="pl-en">addEventListener</span><span class="pl-kos">(</span><span class="pl-s">'change'</span><span class="pl-kos">,</span> <span class="pl-s1">handleFileAsync</span><span class="pl-kos">,</span> <span class="pl-c1">false</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p>Using <code>FileReader</code>:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-k">function</span> <span class="pl-en">handleFile</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">files</span> <span class="pl-c1">=</span> <span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">files</span><span class="pl-kos">,</span> <span class="pl-s1">f</span> <span class="pl-c1">=</span> <span class="pl-s1">files</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">reader</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">FileReader</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">reader</span><span class="pl-kos">.</span><span class="pl-en">onload</span> <span class="pl-c1">=</span> <span class="pl-k">function</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-v">Uint8Array</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">result</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">,</span> <span class="pl-kos">{</span><span class="pl-c1">type</span>: <span class="pl-s">'array'</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">workbook</span> <span class="pl-c1">=</span> <span class="pl-c1">XLSX</span><span class="pl-kos">.</span><span class="pl-en">read</span><span class="pl-kos">(</span><span class="pl-s1">e</span><span class="pl-kos">.</span><span class="pl-c1">target</span><span class="pl-kos">.</span><span class="pl-c1">result</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* DO SOMETHING WITH workbook HERE */</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span>
@ -814,7 +839,7 @@ Stream. They are only exposed in NodeJS.</p>
<p><code>XLSX.write(wb, write_opts)</code> attempts to write the workbook <code>wb</code></p>
<p><code>XLSX.writeFile(wb, filename, write_opts)</code> attempts to write <code>wb</code> to <code>filename</code>.
In browser-based environments, it will attempt to force a client-side download.</p>
<p><code>XLSX.writeFileAsync(filename, wb, o, cb)</code> attempts to write <code>wb</code> to <code>filename</code>.
<p><code>XLSX.writeFileAsync(wb, filename, o, cb)</code> attempts to write <code>wb</code> to <code>filename</code>.
If <code>o</code> is omitted, the writer will use the third argument as the callback.</p>
<p><code>XLSX.stream</code> contains a set of streaming write functions.</p>
<p>Write options are described in the <a href="#writing-options">Writing Options</a> section.</p>
@ -1554,33 +1579,39 @@ prefixed with an apostrophe <code>'</code>, consistent with Excel's formula bar
<tr>
<td align="left">A1-style strings</td>
<td align="left">XLSX</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">RC-style strings</td>
<td align="left">XLML and plain text</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">BIFF Parsed formulae</td>
<td align="left">XLSB and all XLS formats</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">OpenFormula formulae</td>
<td align="left">ODS/FODS/UOS</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Lotus Parsed formulae</td>
<td align="left">All Lotus WK_ formats</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
</tbody>
</table>
<p>Since Excel prohibits named cells from colliding with names of A1 or RC style
cell references, a (not-so-simple) regex conversion is possible. BIFF Parsed
formulae have to be explicitly unwound. OpenFormula formulae can be converted
with regular expressions.</p>
formulae and Lotus Parsed formulae have to be explicitly unwound. OpenFormula
formulae can be converted with regular expressions.</p>
</details>
<h4>
<a id="user-content-column-properties" class="anchor" href="#column-properties" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Column Properties</h4>
@ -1596,6 +1627,7 @@ objects which have the following properties:</p>
<span class="pl-c1">wch</span>?: <span class="pl-smi">number</span><span class="pl-kos">;</span> <span class="pl-c">// width in characters</span>
<span class="pl-c">/* other fields for preserving features from files */</span>
<span class="pl-c1">level</span>?: <span class="pl-smi">number</span><span class="pl-kos">;</span> <span class="pl-c">// 0-indexed outline / group level</span>
<span class="pl-c1">MDW</span>?: <span class="pl-smi">number</span><span class="pl-kos">;</span> <span class="pl-c">// Excel's "Max Digit Width" unit, always integral</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<details>
@ -1825,18 +1857,42 @@ functions accept the <code>dateNF</code> option to override the interpretation o
specific format string.</p>
<h4>
<a id="user-content-hyperlinks" class="anchor" href="#hyperlinks" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Hyperlinks</h4>
<details>
<summary><b>Format Support</b> (click to show)</summary>
<p><strong>Cell Hyperlinks</strong>: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS</p>
<p><strong>Tooltips</strong>: XLSX/M, XLSB, BIFF8 XLS, XLML</p>
</details>
<p>Hyperlinks are stored in the <code>l</code> key of cell objects. The <code>Target</code> field of the
hyperlink object is the target of the link, including the URI fragment. Tooltips
are stored in the <code>Tooltip</code> field and are displayed when you move your mouse
over the text.</p>
<p>For example, the following snippet creates a link from cell <code>A3</code> to
<a href="https://sheetjs.com" rel="nofollow">https://sheetjs.com</a> with the tip <code>"Find us @ SheetJS.com!"</code>:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A3'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"https://sheetjs.com"</span><span class="pl-kos">,</span> <span class="pl-c1">Tooltip</span>:<span class="pl-s">"Find us @ SheetJS.com!"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A1'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"https://sheetjs.com"</span><span class="pl-kos">,</span> <span class="pl-c1">Tooltip</span>:<span class="pl-s">"Find us @ SheetJS.com!"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<p>Note that Excel does not automatically style hyperlinks -- they will generally
be displayed as normal text.</p>
<p><em>Remote Links</em></p>
<p>HTTP / HTTPS links can be used directly:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A2'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"https://docs.sheetjs.com/#hyperlinks"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A3'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"http://localhost:7262/yes_localhost_works"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<p>Excel also supports <code>mailto</code> email links with subject line:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A4'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"mailto:ignored@dev.null"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A5'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"mailto:ignored@dev.null?subject=Test Subject"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<p><em>Local Links</em></p>
<p>Links to absolute paths should use the <code>file://</code> URI scheme:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'B1'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"file:///SheetJS/t.xlsx"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to /SheetJS/t.xlsx */</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'B2'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"file:///c:/SheetJS.xlsx"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to c:\SheetJS.xlsx */</span></pre></div>
<p>Links to relative paths can be specified without a scheme:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'B3'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"SheetJS.xlsb"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to SheetJS.xlsb */</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'B4'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"../SheetJS.xlsm"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to ../SheetJS.xlsm */</span></pre></div>
<p>Relative Paths have undefined behavior in the SpreadsheetML 2003 format. Excel
2019 will treat a <code>..\</code> parent mark as two levels up.</p>
<p><em>Internal Links</em></p>
<p>Links where the target is a cell or range or defined name in the same workbook
("Internal Links") are marked with a leading hash character:</p>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'A2'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"#E2"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* link to cell E2 */</span></pre></div>
<div class="highlight highlight-source-js"><pre><span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'C1'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"#E2"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to cell E2 */</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'C2'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"#Sheet2!E2"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to cell E2 in sheet Sheet2 */</span>
<span class="pl-s1">ws</span><span class="pl-kos">[</span><span class="pl-s">'C3'</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">l</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">Target</span>:<span class="pl-s">"#SomeDefinedName"</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/* Link to Defined Name */</span></pre></div>
<h4>
<a id="user-content-cell-comments" class="anchor" href="#cell-comments" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Cell Comments</h4>
<p>Cell comments are objects stored in the <code>c</code> array of cell objects. The actual
@ -2047,6 +2103,11 @@ property set to <code>"macro"</code>.</p>
<td align="right">false</td>
<td align="left">If true, preserve <code>_xlfn.</code> prefixes in formulae **</td>
</tr>
<tr>
<td align="left"><code>FS</code></td>
<td align="right"></td>
<td align="left">DSV Field Separator override</td>
</tr>
</tbody>
</table>
<ul>
@ -2156,7 +2217,7 @@ file but Excel will know how to handle it. This library applies similar logic:<
<tr>
<td align="left"><code>0xD0</code></td>
<td align="left">CFB Container</td>
<td align="left">BIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW</td>
<td align="left">BIFF 5/8 or protected XLSX/XLSB or WQ3/QPW or XLR</td>
</tr>
<tr>
<td align="left"><code>0x09</code></td>
@ -2171,7 +2232,7 @@ file but Excel will know how to handle it. This library applies similar logic:<
<tr>
<td align="left"><code>0x50</code></td>
<td align="left">ZIP Archive</td>
<td align="left">XLSB or XLSX/M or ODS or UOS2 or plain text</td>
<td align="left">XLSB or XLSX/M or ODS or UOS2 or NUMBERS or text</td>
</tr>
<tr>
<td align="left"><code>0x49</code></td>
@ -2222,6 +2283,7 @@ file but Excel will know how to handle it. This library applies similar logic:<
</table>
<p>DBF files are detected based on the first byte as well as the third and fourth
bytes (corresponding to month and day of the file date)</p>
<p>Works for Windows files are detected based on the BOF record with type <code>0xFF</code></p>
<p>Plain text format guessing follows the priority order:</p>
<table>
<thead>
@ -2242,8 +2304,7 @@ bytes (corresponding to month and day of the file date)</p>
</tr>
<tr>
<td align="left">XML</td>
<td align="left">starts with <code>&lt;</code>
</td>
<td align="left">starts with <code>&lt;</code> and the first tag is valid</td>
</tr>
<tr>
<td align="left">RTF</td>
@ -2256,11 +2317,15 @@ bytes (corresponding to month and day of the file date)</p>
</tr>
<tr>
<td align="left">DSV</td>
<td align="left">more unquoted <code>";"</code> chars than <code>"\t"</code> or <code>","</code> in the first 1024</td>
<td align="left">more unquoted `</td>
</tr>
<tr>
<td align="left">DSV</td>
<td align="left">more unquoted <code>;</code> chars than <code>\t</code> or <code>,</code> in the first 1024</td>
</tr>
<tr>
<td align="left">TSV</td>
<td align="left">more unquoted <code>"\t"</code> chars than <code>","</code> chars in the first 1024</td>
<td align="left">more unquoted <code>\t</code> chars than <code>,</code> chars in the first 1024</td>
</tr>
<tr>
<td align="left">CSV</td>
@ -2274,7 +2339,12 @@ bytes (corresponding to month and day of the file date)</p>
</tr>
<tr>
<td align="left">PRN</td>
<td align="left">(default)</td>
<td align="left">
<code>PRN</code> option is set to true</td>
</tr>
<tr>
<td align="left">CSV</td>
<td align="left">(fallback)</td>
</tr>
</tbody>
</table>
@ -2423,6 +2493,20 @@ output formats. The specific file type is controlled with <code>bookType</code>
<td align="left">Excel 5.0/95 Workbook Format</td>
</tr>
<tr>
<td align="left"><code>biff4</code></td>
<td align="right"><code>.xls</code></td>
<td align="center">none</td>
<td align="left">single</td>
<td align="left">Excel 4.0 Worksheet Format</td>
</tr>
<tr>
<td align="left"><code>biff3</code></td>
<td align="right"><code>.xls</code></td>
<td align="center">none</td>
<td align="left">single</td>
<td align="left">Excel 3.0 Worksheet Format</td>
</tr>
<tr>
<td align="left"><code>biff2</code></td>
<td align="right"><code>.xls</code></td>
<td align="center">none</td>
@ -2451,6 +2535,13 @@ output formats. The specific file type is controlled with <code>bookType</code>
<td align="left">Flat OpenDocument Spreadsheet</td>
</tr>
<tr>
<td align="left"><code>wk3</code></td>
<td align="right"><code>.wk3</code></td>
<td align="center">none</td>
<td align="left">single</td>
<td align="left">Lotus Workbook (WK3)</td>
</tr>
<tr>
<td align="left"><code>csv</code></td>
<td align="right"><code>.csv</code></td>
<td align="center">none</td>
@ -2493,6 +2584,13 @@ output formats. The specific file type is controlled with <code>bookType</code>
<td align="left">dBASE II + VFP Extensions (DBF)</td>
</tr>
<tr>
<td align="left"><code>wk1</code></td>
<td align="right"><code>.wk1</code></td>
<td align="center">none</td>
<td align="left">single</td>
<td align="left">Lotus Worksheet (WK1)</td>
</tr>
<tr>
<td align="left"><code>rtf</code></td>
<td align="right"><code>.rtf</code></td>
<td align="center">none</td>
@ -2604,6 +2702,11 @@ other values are stored as strings. The function takes an options argument:</p>
<td align="center">false</td>
<td align="left">Create cell objects of type <code>z</code> for <code>null</code> values</td>
</tr>
<tr>
<td align="left"><code>nullError</code></td>
<td align="center">false</td>
<td align="left">If true, emit <code>#NULL!</code> error cells for <code>null</code> values</td>
</tr>
</tbody>
</table>
<details>
@ -2643,6 +2746,11 @@ accepts an options argument:</p>
<td align="left">Create cell objects of type <code>z</code> for <code>null</code> values</td>
</tr>
<tr>
<td align="left"><code>nullError</code></td>
<td align="center">false</td>
<td align="left">If true, emit <code>#NULL!</code> error cells for <code>null</code> values</td>
</tr>
<tr>
<td align="left"><code>origin</code></td>
<td align="center"></td>
<td align="left">Use specified cell as starting point (see below)</td>
@ -2709,7 +2817,7 @@ accepts an options argument:</p>
<p><code>XLSX.utils.json_to_sheet</code> takes an array of objects and returns a worksheet
with automatically-generated "headers" based on the keys of the objects. The
default column order is determined by the first appearance of the field using
<code>Object.keys</code>, but can be overridden using the options argument:</p>
<code>Object.keys</code>. The function accepts an options argument:</p>
<table>
<thead>
<tr>
@ -2722,7 +2830,7 @@ default column order is determined by the first appearance of the field using
<tr>
<td align="left"><code>header</code></td>
<td align="center"></td>
<td align="left">Use specified column order (default <code>Object.keys</code>)</td>
<td align="left">Use specified field order (default <code>Object.keys</code>) **</td>
</tr>
<tr>
<td align="left"><code>dateNF</code></td>
@ -2739,8 +2847,21 @@ default column order is determined by the first appearance of the field using
<td align="center">false</td>
<td align="left">If true, do not include header row in output</td>
</tr>
<tr>
<td align="left"><code>nullError</code></td>
<td align="center">false</td>
<td align="left">If true, emit <code>#NULL!</code> error cells for <code>null</code> values</td>
</tr>
</tbody>
</table>
<ul>
<li>All fields from each row will be written. If <code>header</code> is an array and it does
not contain a particular field, the key will be appended to the array.</li>
<li>Cell types are deduced from the type of each value. For example, a <code>Date</code>
object will generate a Date cell, while a string will generate a Text cell.</li>
<li>Null values will be skipped by default. If <code>nullError</code> is true, an error cell
corresponding to <code>#NULL!</code> will be written to the worksheet.</li>
</ul>
<details>
<summary><b>Examples</b> (click to show)</summary>
<p>The original sheet cannot be reproduced using plain objects since JS object keys
@ -2789,6 +2910,11 @@ an options argument:</p>
<td align="left">If true, do not include header row in output</td>
</tr>
<tr>
<td align="left"><code>nullError</code></td>
<td align="center">false</td>
<td align="left">If true, emit <code>#NULL!</code> error cells for <code>null</code> values</td>
</tr>
<tr>
<td align="left"><code>origin</code></td>
<td align="center"></td>
<td align="left">Use specified cell as starting point (see below)</td>
@ -3307,43 +3433,43 @@ be true to generate blank rows</li>
</tr>
<tr>
<td align="left">Excel 2007+ XML Formats (XLSX/XLSM)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 2007+ Binary Format (XLSB BIFF12)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 2003-2004 XML Format (XML "SpreadsheetML")</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 97-2004 (XLS BIFF8)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 5.0/95 (XLS BIFF5)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 4.0 (XLS/XLW BIFF4)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 3.0 (XLS BIFF3)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Excel 2.0/2.1 (XLS BIFF2)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left"><strong>Excel Supported Text Formats</strong></td>
@ -3352,28 +3478,28 @@ be true to generate blank rows</li>
</tr>
<tr>
<td align="left">Delimiter-Separated Values (CSV/TXT)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Data Interchange Format (DIF)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Symbolic Link (SYLK/SLK)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Lotus Formatted Text (PRN)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">UTF-16 Unicode Text (TXT)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left"><strong>Other Workbook/Worksheet Formats</strong></td>
@ -3381,33 +3507,53 @@ be true to generate blank rows</li>
<td align="center">:-----:</td>
</tr>
<tr>
<td align="left">Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS)</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">OpenDocument Spreadsheet (ODS)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Flat XML ODF Spreadsheet (FODS)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Uniform Office Format Spreadsheet (标文通 UOS1/UOS2)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">dBASE II/III/IV / Visual FoxPro (DBF)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="left">Lotus 1-2-3 (WK1/WK3)</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Lotus 1-2-3 (WKS/WK2/WK4/123)</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">Works 1.x-3.x DOS / 2.x-5.x Windows Spreadsheet (WKS)</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">Works 6.x-9.x Spreadsheet (XLR)</td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"></td>
</tr>
<tr>
@ -3417,18 +3563,18 @@ be true to generate blank rows</li>
</tr>
<tr>
<td align="left">HTML Tables</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Rich Text Format tables (RTF)</td>
<td align="center"></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
<tr>
<td align="left">Ethercalc Record Format (ETH)</td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="o" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2b55.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
<td align="center"><g-emoji class="g-emoji" alias="heavy_check_mark" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/2714.png"></g-emoji></td>
</tr>
</tbody>
</table>
@ -3469,11 +3615,35 @@ range limits will be silently truncated:</p>
<td align="right">16384</td>
</tr>
<tr>
<td align="left">Excel 4.0 (XLS BIFF4)</td>
<td align="left">IV16384</td>
<td align="right">256</td>
<td align="right">16384</td>
</tr>
<tr>
<td align="left">Excel 3.0 (XLS BIFF3)</td>
<td align="left">IV16384</td>
<td align="right">256</td>
<td align="right">16384</td>
</tr>
<tr>
<td align="left">Excel 2.0/2.1 (XLS BIFF2)</td>
<td align="left">IV16384</td>
<td align="right">256</td>
<td align="right">16384</td>
</tr>
<tr>
<td align="left">Lotus 1-2-3 R2 - R5 (WK1/WK3/WK4)</td>
<td align="left">IV8192</td>
<td align="right">256</td>
<td align="right">8192</td>
</tr>
<tr>
<td align="left">Lotus 1-2-3 R1 (WKS)</td>
<td align="left">IV2048</td>
<td align="right">256</td>
<td align="right">2048</td>
</tr>
</tbody>
</table>
<p>Excel 2003 SpreadsheetML range limits are governed by the version of Excel and
@ -3565,6 +3735,8 @@ The main focus is data extraction.</p>
<p>The Lotus formats consist of binary records similar to the BIFF structure. Lotus
did release a specification decades ago covering the original WK1 format. Other
features were deduced by producing files and comparing to Excel support.</p>
<p>Generated WK1 worksheets are compatible with Lotus 1-2-3 R2 and Excel 5.0.</p>
<p>Generated WK3 workbooks are compatible with Lotus 1-2-3 R9 and Excel 5.0.</p>
</details>
<h4>
<a id="user-content-quattro-pro-wq1wq2wb1wb2wb3qpw" class="anchor" href="#quattro-pro-wq1wq2wb1wb2wb3qpw" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)</h4>
@ -3575,6 +3747,32 @@ Some of the newer formats (namely WB3 and QPW) use a CFB enclosure just like
BIFF8 XLS.</p>
</details>
<h4>
<a id="user-content-works-for-dos--windows-spreadsheet-wksxlr" class="anchor" href="#works-for-dos--windows-spreadsheet-wksxlr" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Works for DOS / Windows Spreadsheet (WKS/XLR)</h4>
<details>
<summary>(click to show)</summary>
<p>All versions of Works were limited to a single worksheet.</p>
<p>Works for DOS 1.x - 3.x and Works for Windows 2.x extends the Lotus WKS format
with additional record types.</p>
<p>Works for Windows 3.x - 5.x uses the same format and WKS extension. The BOF
record has type <code>FF</code></p>
<p>Works for Windows 6.x - 9.x use the XLR format. XLR is nearly identical to
BIFF8 XLS: it uses the CFB container with a Workbook stream. Works 9 saves the
exact Workbook stream for the XLR and the 97-2003 XLS export. Works 6 XLS
includes two empty worksheets but the main worksheet has an identical encoding.
XLR also includes a <code>WksSSWorkBook</code> stream similar to Lotus FM3/FMT files.</p>
</details>
<h4>
<a id="user-content-numbers-30--iwork-2013-spreadsheet-numbers" class="anchor" href="#numbers-30--iwork-2013-spreadsheet-numbers" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS)</h4>
<details>
<summary>(click to show)</summary>
<p>iWork 2013 (Numbers 3.0 / Pages 5.0 / Keynote 6.0) switched from a proprietary
XML-based format to the current file format based on the iWork Archive (IWA).
This format has been used up through the current release (Numbers 11.2).</p>
<p>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.</p>
</details>
<h4>
<a id="user-content-opendocument-spreadsheet-odsfods" class="anchor" href="#opendocument-spreadsheet-odsfods" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>OpenDocument Spreadsheet (ODS/FODS)</h4>
<details>
<summary>(click to show)</summary>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 111 KiB