forked from sheetjs/sheetjs
version bump 0.18.6
This commit is contained in:
parent
b1dca24a0b
commit
ed18acd63d
@ -119,6 +119,7 @@ utils
|
||||
commonjs
|
||||
async
|
||||
uncheck
|
||||
vendoring
|
||||
|
||||
- demos/altjs/README.md
|
||||
ChakraCore
|
||||
|
@ -4,6 +4,12 @@ This log is intended to keep track of backwards-incompatible changes, including
|
||||
but not limited to API changes and file location changes. Minor behavioral
|
||||
changes may not be included if they are not expected to break existing code.
|
||||
|
||||
## v0.18.6
|
||||
|
||||
* Removed all npm dependencies
|
||||
* Auto-correct bad Google Sheets format `d.m`
|
||||
* NUMBERS write merge cells, cells up to column "ALL"
|
||||
|
||||
## v0.18.5
|
||||
|
||||
* Enabled `sideEffects: false` in package.json
|
||||
|
57
README.md
57
README.md
@ -119,7 +119,7 @@ port calculations to web apps; automate common spreadsheet tasks, and much more!
|
||||
**Standalone Browser Scripts**
|
||||
|
||||
The complete browser standalone build is saved to `dist/xlsx.full.min.js` and
|
||||
can be directly added to a page with a `script` tag:
|
||||
can be directly added to a page with a `<script>` tag:
|
||||
|
||||
```html
|
||||
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
|
||||
@ -140,6 +140,9 @@ A specific release can be referenced by version:
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.18.5/package/dist/xlsx.full.min.js"></script>
|
||||
```
|
||||
|
||||
For production use, scripts should be downloaded and added to a public folder
|
||||
alongside other scripts.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
@ -157,8 +160,8 @@ A slimmer build is generated at `dist/xlsx.mini.min.js`. Compared to full build:
|
||||
These scripts are also available on the CDN:
|
||||
|
||||
```html
|
||||
<!-- use xlsx.core.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.core.min.js"></script>
|
||||
<!-- use xlsx.mini.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.mini.min.js"></script>
|
||||
```
|
||||
|
||||
</details>
|
||||
@ -173,21 +176,21 @@ $ bower install js-xlsx
|
||||
**ECMAScript Modules**
|
||||
|
||||
The ECMAScript Module build is saved to `xlsx.mjs` and can be directly added to
|
||||
a page with a `script` tag using `type=module`:
|
||||
a page with a `script` tag using `type="module"`:
|
||||
|
||||
```html
|
||||
<script type="module">
|
||||
import { read, writeFileXLSX } from "./xlsx.mjs";
|
||||
import { read, writeFileXLSX } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
|
||||
/* load the codepage support library for extended support with older formats */
|
||||
import { set_cptable } from "./xlsx.mjs";
|
||||
import * as cptable from './dist/cpexcel.full.mjs';
|
||||
import { set_cptable } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
import * as cptable from 'https://cdn.sheetjs.com/xlsx-latest/package/dist/cpexcel.full.mjs';
|
||||
set_cptable(cptable);
|
||||
</script>
|
||||
```
|
||||
|
||||
The [npm package](https://www.npmjs.org/package/xlsx) also exposes the module
|
||||
with the `module` parameter, supported in Angular and other projects:
|
||||
The NodeJS package also exposes the module with the `module` parameter, which is
|
||||
supported in Angular and other projects:
|
||||
|
||||
```ts
|
||||
import { read, writeFileXLSX } from "xlsx";
|
||||
@ -213,19 +216,31 @@ XLSX.set_cptable(cptable);
|
||||
|
||||
**NodeJS**
|
||||
|
||||
Modules are available on [the public npm registry](https://www.npmjs.org/package/xlsx):
|
||||
Tarballs are available on <https://cdn.sheetjs.com>.
|
||||
|
||||
<https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz> is a link to the latest
|
||||
version and will refresh on each release.
|
||||
|
||||
Each individual version can be referenced using a similar URL pattern.
|
||||
<https://cdn.sheetjs.com/xlsx-0.18.6/xlsx-0.18.6.tgz> is the URL for `0.18.6`
|
||||
|
||||
For general stability, "vendoring" modules is the recommended approach:
|
||||
|
||||
1) Download the tarball (`xlsx-<version>.tgz`) for the desired version.
|
||||
|
||||
2) Create a `vendor` subdirectory at the root of your project and move the
|
||||
tarball to that folder. Add it to your project repository.
|
||||
|
||||
3) Install the tarball using a package manager:
|
||||
|
||||
```bash
|
||||
$ pnpm install xlsx # using pnpm
|
||||
$ yarn add xlsx # using yarn
|
||||
$ npm install xlsx # using npm
|
||||
# note : replace $VERSION with the actual version (e.g. latest or 0.18.6)
|
||||
$ npm install --save file:vendor/xlsx-$VERSION.tgz # npm
|
||||
$ pnpm install --save file:vendor/xlsx-$VERSION.tgz # pnpm
|
||||
$ yarn add file:vendor/xlsx-$VERSION.tgz # yarn
|
||||
```
|
||||
|
||||
Tarballs are also available on <https://cdn.sheetjs.com>:
|
||||
|
||||
```bash
|
||||
$ npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
```
|
||||
The package will be installed and accessible as `xlsx`.
|
||||
|
||||
By default, the module supports `require`:
|
||||
|
||||
@ -253,9 +268,9 @@ XLSX.set_cptable(cpexcel);
|
||||
|
||||
**Photoshop and InDesign**
|
||||
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign
|
||||
that is included in the `npm` package. It can be directly referenced with a
|
||||
`#include` directive:
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign.
|
||||
<https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js> is the
|
||||
latest build. It can be directly referenced with a `#include` directive:
|
||||
|
||||
```extendscript
|
||||
#include "xlsx.extendscript.js"
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
|
@ -21,7 +21,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -33,7 +33,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
|
@ -16,16 +16,16 @@ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, them
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
'xmlns': XMLNS_main[0],
|
||||
'xmlns:r': XMLNS.r
|
||||
})];
|
||||
o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
return o.join("");
|
||||
}
|
||||
//function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
// var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
// 'xmlns': XMLNS_main[0],
|
||||
// 'xmlns:r': XMLNS.r
|
||||
// })];
|
||||
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
// return o.join("");
|
||||
//}
|
||||
|
||||
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
||||
function parse_BrtCsProp(data, length/*:number*/) {
|
||||
@ -81,22 +81,22 @@ function parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
var ba = buf_array();
|
||||
write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
/* [BrtCsProp] */
|
||||
/* CSVIEWS */
|
||||
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
/* [USERCSVIEWS] */
|
||||
/* [BrtMargins] */
|
||||
/* [BrtCsPageSetup] */
|
||||
/* [HEADERFOOTER] */
|
||||
/* BrtDrawing */
|
||||
/* [BrtLegacyDrawing] */
|
||||
/* [BrtLegacyDrawingHF] */
|
||||
/* [BrtBkHim] */
|
||||
/* [WEBPUBITEMS] */
|
||||
/* FRTCHARTSHEET */
|
||||
write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
return ba.end();
|
||||
}
|
||||
//function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
// var ba = buf_array();
|
||||
// write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
// /* [BrtCsProp] */
|
||||
// /* CSVIEWS */
|
||||
// /* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
// /* [USERCSVIEWS] */
|
||||
// /* [BrtMargins] */
|
||||
// /* [BrtCsPageSetup] */
|
||||
// /* [HEADERFOOTER] */
|
||||
// /* BrtDrawing */
|
||||
// /* [BrtLegacyDrawing] */
|
||||
// /* [BrtLegacyDrawingHF] */
|
||||
// /* [BrtBkHim] */
|
||||
// /* [WEBPUBITEMS] */
|
||||
// /* FRTCHARTSHEET */
|
||||
// write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
// return ba.end();
|
||||
//}
|
||||
|
@ -28,10 +28,6 @@ function parse_sty(data, name/*:string*/, themes, opts) {
|
||||
return parse_sty_xml((data/*:any*/), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data/*:string*/, name/*:string*/, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name/*:string*/, opts)/*:SST*/ {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data/*:any*/), opts);
|
||||
return parse_sst_xml((data/*:any*/), opts);
|
||||
@ -56,37 +52,3 @@ function parse_xlmeta(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data/*:any*/), name, opts);
|
||||
return parse_xlmeta_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data/*:SST*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data/*:Array<any>*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name/*:string*/) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
|
@ -938,19 +938,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -1156,10 +1154,9 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
|
@ -1,7 +1,3 @@
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
@ -65,7 +61,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -76,7 +72,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -93,13 +89,13 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -113,7 +109,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -125,7 +121,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
|
@ -94,7 +94,7 @@ enables testing the development version of the library. In order to use this
|
||||
demo in other applications, add the `xlsx` dependency:
|
||||
|
||||
```bash
|
||||
$ npm install --save xlsx
|
||||
$ npm install --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
```
|
||||
|
||||
## SystemJS Configuration
|
||||
|
@ -8,7 +8,7 @@ if [ ! -e SheetJSIonic ]; then
|
||||
ionic cordova plugin add cordova-plugin-file </dev/null
|
||||
npm install --save @ionic-native/core
|
||||
npm install --save @ionic-native/file
|
||||
npm install --save xlsx
|
||||
npm install --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
cp ../ionic-app.module.ts src/app/app.module.ts
|
||||
cd -
|
||||
fi
|
||||
|
@ -2,7 +2,7 @@
|
||||
if [ ! -e SheetJSNS ]; then
|
||||
ns create SheetJSNS --ng
|
||||
cd SheetJSNS
|
||||
npm install xlsx
|
||||
npm install --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
cd ..
|
||||
fi
|
||||
|
||||
|
@ -8,4 +8,5 @@ lint:
|
||||
eslint *.js
|
||||
.PHONY: run
|
||||
run:
|
||||
electron .
|
||||
npm i
|
||||
npx electron .
|
||||
|
@ -6,7 +6,7 @@
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.0.5",
|
||||
"electron": "^17.1.0",
|
||||
"xlsx": "^0.18.3"
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "electron ."
|
||||
|
@ -7,11 +7,11 @@ aws: lambda-proxy
|
||||
|
||||
.PHONY: lambda-proxy
|
||||
lambda-proxy:
|
||||
cd LambdaProxy; mkdir -p node_modules; npm install xlsx busboy; sam local start-api; cd -
|
||||
cd LambdaProxy; mkdir -p node_modules; npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz busboy; sam local start-api; cd -
|
||||
|
||||
.PHONY: init-azure
|
||||
init-azure:
|
||||
cd AzureHTTPTrigger; mkdir -p node_modules; npm install xlsx formidable fs
|
||||
cd AzureHTTPTrigger; mkdir -p node_modules; npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz formidable fs
|
||||
|
||||
.PHONY: azure
|
||||
azure: init-azure
|
||||
|
@ -30,7 +30,7 @@ utility can stream rows to a standard HTTP response. `XLSX.utils.sheet_to_json`
|
||||
can generate an array of objects that can be fed to another service.
|
||||
|
||||
At the simplest level, a file on the filesystem can be converted using the bin
|
||||
script that ships with the `npm` module:
|
||||
script that ships with the NodeJS package:
|
||||
|
||||
```bash
|
||||
$ xlsx /path/to/uploads/file > /tmp/new_csv_file
|
||||
|
@ -8,7 +8,7 @@ meteor out of the box.
|
||||
Using the npm module, the library can be imported from client or server side:
|
||||
|
||||
```js
|
||||
import XLSX from 'xlsx'
|
||||
import * as XLSX from 'xlsx'
|
||||
```
|
||||
|
||||
All of the functions and utilities are available in both realms. Since the core
|
||||
@ -71,7 +71,7 @@ This tree does not include the `.meteor` structure. Rebuild the project with:
|
||||
|
||||
```bash
|
||||
meteor create .
|
||||
npm install babel-runtime meteor-node-stubs xlsx
|
||||
npm install babel-runtime meteor-node-stubs https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
meteor
|
||||
```
|
||||
|
||||
|
@ -4,4 +4,4 @@ init:
|
||||
|
||||
.PHONY: run
|
||||
run:
|
||||
nw .
|
||||
npx nw .
|
||||
|
@ -1,7 +1,7 @@
|
||||
# NW.js
|
||||
|
||||
This library is compatible with NW.js and should just work out of the box.
|
||||
The demonstration uses NW.js 0.24 with the dist script.
|
||||
The demonstration uses NW.js 0.63.0 with the dist script.
|
||||
|
||||
## Reading data
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
"version": "0.0.0",
|
||||
"main": "index.html",
|
||||
"dependencies": {
|
||||
"nw": "~0.24.4",
|
||||
"xlsx": "*"
|
||||
"nw": "~0.63.0",
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz"
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
"react-dom": "^17.0.2",
|
||||
"react-scripts": "4.0.3",
|
||||
"typescript": "^4.1.2",
|
||||
"xlsx": "^0.18.3"
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
|
@ -5,7 +5,7 @@
|
||||
if [ ! -e SheetJS ]; then react-native init SheetJS --version="0.67.2"; fi
|
||||
|
||||
# Install dependencies
|
||||
cd SheetJS; npm i -S xlsx react-native-table-component; cd -
|
||||
cd SheetJS; npm i -S https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz react-native-table-component; cd -
|
||||
|
||||
cd SheetJS; npm i -S react-native-file-access@2.x; cd -
|
||||
# cd SheetJS; npm i -S react-native-fs; cd -
|
||||
|
@ -14,7 +14,7 @@ appropriate error checking or other production-level features.
|
||||
The following commands are required in order to test the [Express](https://github.com/expressjs/express) demo:
|
||||
|
||||
```bash
|
||||
npm install express printj xlsx express-formidable
|
||||
npm install express printj express-formidable https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
node express.js
|
||||
```
|
||||
|
||||
@ -23,7 +23,7 @@ node express.js
|
||||
The following commands are required in order to test the [Koa](https://github.com/koajs/koa) demo:
|
||||
|
||||
```bash
|
||||
npm install koa printj formidable xlsx
|
||||
npm install koa printj formidable https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
node koa.js
|
||||
```
|
||||
|
||||
@ -34,7 +34,7 @@ node koa.js
|
||||
The following commands are required in order to test the [Hapi](https://github.com/hapijs/hapi) demo:
|
||||
|
||||
```bash
|
||||
npm install hapi@16.x printj tiny-worker xlsx
|
||||
npm install hapi@16.x printj tiny-worker https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
node hapi.js
|
||||
```
|
||||
|
||||
|
@ -7,7 +7,7 @@ if [ ! -e xlsx-demo ]; then
|
||||
fi
|
||||
|
||||
cd xlsx-demo
|
||||
npm i --save xlsx
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
npm i --save-dev @types/multer
|
||||
|
||||
if [ ! -e src/sheetjs/sheetjs.module.ts ]; then
|
||||
|
@ -10,7 +10,7 @@
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"xlsx": "*"
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "~2.6.1",
|
||||
|
@ -4,7 +4,7 @@ vue: ## Simple server for vue
|
||||
|
||||
.PHONY: nuxt
|
||||
nuxt: ## nuxt.js demo
|
||||
npm i xlsx @nuxt/content
|
||||
npm i https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz @nuxt/content
|
||||
npx nuxt
|
||||
|
||||
.PHONY: weex
|
||||
|
@ -10,7 +10,7 @@
|
||||
"dependencies": {
|
||||
"vue": "^3.2.25",
|
||||
"vue3-table-lite": "^1.1.7-1",
|
||||
"xlsx": "^0.18.3"
|
||||
"xlsx": "https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-vue": "^2.2.0",
|
||||
|
28
dist/xlsx.core.min.js
generated
vendored
28
dist/xlsx.core.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.core.min.map
generated
vendored
2
dist/xlsx.core.min.map
generated
vendored
File diff suppressed because one or more lines are too long
271
dist/xlsx.extendscript.js
generated
vendored
271
dist/xlsx.extendscript.js
generated
vendored
@ -160,7 +160,7 @@ var DO_NOT_EXPORT_CODEPAGE = true;
|
||||
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
/*global cptable:true, window */
|
||||
var $cptable;
|
||||
@ -1121,7 +1121,7 @@ function eval_fmt(fmt, v, opts, flen) {
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=SSF_parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
@ -1446,6 +1446,15 @@ function dateNF_fix(str, dateNF, match) {
|
||||
return datestr + "T" + timestr;
|
||||
}
|
||||
|
||||
/* table of bad formats written by third-party tools */
|
||||
var bad_formats = {
|
||||
"d.m": "d\\.m" // Issue #2571 Google Sheets writes invalid format 'd.m', correct format is 'd"."m' or 'd\\.m'
|
||||
};
|
||||
|
||||
function SSF__load(fmt, idx) {
|
||||
return SSF_load(bad_formats[fmt] || fmt, idx);
|
||||
}
|
||||
|
||||
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*jshint eqnull:true */
|
||||
@ -1549,7 +1558,7 @@ return CRC32;
|
||||
/* [MS-CFB] v20171201 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports = {};
|
||||
exports.version = '1.2.1';
|
||||
exports.version = '1.2.2';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l, r) {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -1849,7 +1858,7 @@ function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
||||
if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
|
||||
fat_addrs.push(q);
|
||||
}
|
||||
sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
if(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2025,7 +2034,9 @@ function rebuild_cfb(cfb, f) {
|
||||
for(i = 0; i < data.length; ++i) {
|
||||
var dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
if(!s) {
|
||||
while(!s) {
|
||||
while(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);
|
||||
|
||||
data.push([dad, ({
|
||||
name: filename(dad).replace("/",""),
|
||||
type: 1,
|
||||
@ -2033,8 +2044,12 @@ function rebuild_cfb(cfb, f) {
|
||||
ct: now, mt: now,
|
||||
content: null
|
||||
})]);
|
||||
|
||||
// Add name to set
|
||||
fullPaths[dad] = true;
|
||||
|
||||
dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
}
|
||||
}
|
||||
|
||||
@ -2082,7 +2097,7 @@ function _write(cfb, options) {
|
||||
for(var i = 0; i < cfb.FileIndex.length; ++i) {
|
||||
var file = cfb.FileIndex[i];
|
||||
if(!file.content) continue;
|
||||
var flen = file.content.length;
|
||||
var flen = file.content.length;
|
||||
if(flen > 0){
|
||||
if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
|
||||
else fat_size += (flen + 0x01FF) >> 9;
|
||||
@ -2170,6 +2185,10 @@ flen = file.content.length;
|
||||
file = cfb.FileIndex[i];
|
||||
if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
|
||||
var _nm = (i === 0 && _opts.root) || file.name;
|
||||
if(_nm.length > 32) {
|
||||
console.error("Name " + _nm + " will be truncated to " + _nm.slice(0,32));
|
||||
_nm = _nm.slice(0, 32);
|
||||
}
|
||||
flen = 2*(_nm.length+1);
|
||||
o.write_shift(64, _nm, "utf16le");
|
||||
o.write_shift(2, flen);
|
||||
@ -2805,6 +2824,7 @@ function parse_zip(file, options) {
|
||||
parse_local_file(blob, csz, usz, o, EF);
|
||||
blob.l = L;
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@ -4740,7 +4760,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4752,7 +4772,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -10513,7 +10533,7 @@ function parse_numFmts(t, styles, opts) {
|
||||
for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
|
||||
styles.NumberFmt[j] = f;
|
||||
}
|
||||
SSF_load(f,j);
|
||||
SSF__load(f,j);
|
||||
}
|
||||
} break;
|
||||
case '</numFmt>': break;
|
||||
@ -10880,7 +10900,7 @@ function parse_sty_bin(data, themes, opts) {
|
||||
recordhopper(data, function hopper_sty(val, R, RT) {
|
||||
switch(RT) {
|
||||
case 0x002C: /* BrtFmt */
|
||||
styles.NumberFmt[val[0]] = val[1]; SSF_load(val[1], val[0]);
|
||||
styles.NumberFmt[val[0]] = val[1]; SSF__load(val[1], val[0]);
|
||||
break;
|
||||
case 0x002B: /* BrtFont */
|
||||
styles.Fonts.push(val);
|
||||
@ -14591,7 +14611,7 @@ function get_cell_style(styles, cell, opts) {
|
||||
var i = 0x3c, len = styles.length;
|
||||
if(z == null && opts.ssf) {
|
||||
for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
|
||||
SSF_load(cell.z, i);
|
||||
SSF__load(cell.z, i);
|
||||
// $FlowIgnore
|
||||
opts.ssf[i] = cell.z;
|
||||
opts.revssf[cell.z] = z = i;
|
||||
@ -14617,7 +14637,7 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) {
|
||||
if(p.t === 'z' && !opts.cellStyles) return;
|
||||
if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
|
||||
if((!opts || opts.cellText !== false) && p.t !== 'z') try {
|
||||
if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(table_fmt[fmtid] == null) SSF__load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(p.t === 'e') p.w = p.w || BErr[p.v];
|
||||
else if(fmtid === 0) {
|
||||
if(p.t === 'n') {
|
||||
@ -16404,16 +16424,16 @@ function parse_cs_xml(data, opts, idx, rels, wb) {
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_xml(idx, opts, wb, rels) {
|
||||
var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
'xmlns': XMLNS_main[0],
|
||||
'xmlns:r': XMLNS.r
|
||||
})];
|
||||
o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
return o.join("");
|
||||
}
|
||||
//function write_cs_xml(idx, opts, wb, rels) {
|
||||
// var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
// 'xmlns': XMLNS_main[0],
|
||||
// 'xmlns:r': XMLNS.r
|
||||
// })];
|
||||
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
// return o.join("");
|
||||
//}
|
||||
|
||||
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
||||
function parse_BrtCsProp(data, length) {
|
||||
@ -16469,25 +16489,25 @@ function parse_cs_bin(data, opts, idx, rels, wb) {
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_bin() {
|
||||
var ba = buf_array();
|
||||
write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
/* [BrtCsProp] */
|
||||
/* CSVIEWS */
|
||||
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
/* [USERCSVIEWS] */
|
||||
/* [BrtMargins] */
|
||||
/* [BrtCsPageSetup] */
|
||||
/* [HEADERFOOTER] */
|
||||
/* BrtDrawing */
|
||||
/* [BrtLegacyDrawing] */
|
||||
/* [BrtLegacyDrawingHF] */
|
||||
/* [BrtBkHim] */
|
||||
/* [WEBPUBITEMS] */
|
||||
/* FRTCHARTSHEET */
|
||||
write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
return ba.end();
|
||||
}
|
||||
//function write_cs_bin() {
|
||||
// var ba = buf_array();
|
||||
// write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
// /* [BrtCsProp] */
|
||||
// /* CSVIEWS */
|
||||
// /* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
// /* [USERCSVIEWS] */
|
||||
// /* [BrtMargins] */
|
||||
// /* [BrtCsPageSetup] */
|
||||
// /* [HEADERFOOTER] */
|
||||
// /* BrtDrawing */
|
||||
// /* [BrtLegacyDrawing] */
|
||||
// /* [BrtLegacyDrawingHF] */
|
||||
// /* [BrtBkHim] */
|
||||
// /* [WEBPUBITEMS] */
|
||||
// /* FRTCHARTSHEET */
|
||||
// write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
// return ba.end();
|
||||
//}
|
||||
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
||||
var WBPropsDef = [
|
||||
['allowRefreshQuery', false, "bool"],
|
||||
@ -17204,10 +17224,6 @@ function parse_sty(data, name, themes, opts) {
|
||||
return parse_sty_xml((data), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data, name, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data), opts);
|
||||
return parse_sst_xml((data), opts);
|
||||
@ -17232,40 +17248,6 @@ function parse_xlmeta(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data), name, opts);
|
||||
return parse_xlmeta_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
|
||||
var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
|
||||
function xlml_parsexmltag(tag, skip_root) {
|
||||
@ -17608,7 +17590,7 @@ for(var cma = c; cma <= cc; ++cma) {
|
||||
stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
|
||||
if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];
|
||||
for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == stag.nf) break;
|
||||
if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF_load(stag.nf, ssfidx); break; }
|
||||
if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF__load(stag.nf, ssfidx); break; }
|
||||
break;
|
||||
|
||||
case 'column' /*case 'Column'*/:
|
||||
@ -18986,14 +18968,14 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
|
||||
if(opts.biff == 4) {
|
||||
BIFF2FmtTable[BIFF2Fmt++] = val[1];
|
||||
for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(table_fmt[b4idx] == val[1]) break;
|
||||
if(b4idx >= 163) SSF_load(val[1], BIFF2Fmt + 163);
|
||||
if(b4idx >= 163) SSF__load(val[1], BIFF2Fmt + 163);
|
||||
}
|
||||
else SSF_load(val[1], val[0]);
|
||||
else SSF__load(val[1], val[0]);
|
||||
} break;
|
||||
case 0x001e /* BIFF2FORMAT */: {
|
||||
BIFF2FmtTable[BIFF2Fmt++] = val;
|
||||
for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(table_fmt[b2idx] == val) break;
|
||||
if(b2idx >= 163) SSF_load(val, BIFF2Fmt + 163);
|
||||
if(b2idx >= 163) SSF__load(val, BIFF2Fmt + 163);
|
||||
} break;
|
||||
|
||||
case 0x00e5 /* MergeCells */: merges = merges.concat(val); break;
|
||||
@ -22459,10 +22441,6 @@ function parse_old_storage(buf, sst, rsst, v) {
|
||||
{
|
||||
if (ridx > -1)
|
||||
ret = { t: "s", v: rsst[ridx] };
|
||||
else if (sidx > -1)
|
||||
ret = { t: "s", v: sst[sidx] };
|
||||
else if (!isNaN(ieee))
|
||||
ret = { t: "n", v: ieee };
|
||||
else
|
||||
throw new Error("Unsupported cell type ".concat(buf.slice(0, 4)));
|
||||
}
|
||||
@ -22855,24 +22833,32 @@ function parse_numbers_iwa(cfb) {
|
||||
throw new Error("Cannot find Document root");
|
||||
return parse_TN_DocumentArchive(M, docroot);
|
||||
}
|
||||
function write_tile_row(tri, data, SST) {
|
||||
var _a, _b, _c, _d;
|
||||
function write_tile_row(tri, data, SST, wide) {
|
||||
var _a, _b;
|
||||
if (!((_a = tri[6]) == null ? void 0 : _a[0]) || !((_b = tri[7]) == null ? void 0 : _b[0]))
|
||||
throw "Mutation only works on post-BNC storages!";
|
||||
var wide_offsets = ((_d = (_c = tri[8]) == null ? void 0 : _c[0]) == null ? void 0 : _d.data) && varint_to_i32(tri[8][0].data) > 0 || false;
|
||||
if (wide_offsets)
|
||||
throw "Math only works with normal offsets";
|
||||
var cnt = 0;
|
||||
if (tri[7][0].data.length < 2 * data.length) {
|
||||
var new_7 = new Uint8Array(2 * data.length);
|
||||
new_7.set(tri[7][0].data);
|
||||
tri[7][0].data = new_7;
|
||||
}
|
||||
if (tri[4][0].data.length < 2 * data.length) {
|
||||
var new_4 = new Uint8Array(2 * data.length);
|
||||
new_4.set(tri[4][0].data);
|
||||
tri[4][0].data = new_4;
|
||||
}
|
||||
var dv = u8_to_dataview(tri[7][0].data), last_offset = 0, cell_storage = [];
|
||||
var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage = [];
|
||||
var width = wide ? 4 : 1;
|
||||
for (var C = 0; C < data.length; ++C) {
|
||||
if (data[C] == null) {
|
||||
dv.setUint16(C * 2, 65535, true);
|
||||
_dv.setUint16(C * 2, 65535);
|
||||
continue;
|
||||
}
|
||||
dv.setUint16(C * 2, last_offset, true);
|
||||
_dv.setUint16(C * 2, _last_offset, true);
|
||||
dv.setUint16(C * 2, last_offset / width, true);
|
||||
_dv.setUint16(C * 2, _last_offset / width, true);
|
||||
var celload, _celload;
|
||||
switch (typeof data[C]) {
|
||||
case "string":
|
||||
@ -22892,17 +22878,21 @@ function write_tile_row(tri, data, SST) {
|
||||
}
|
||||
cell_storage.push(celload);
|
||||
last_offset += celload.length;
|
||||
_cell_storage.push(_celload);
|
||||
_last_offset += _celload.length;
|
||||
{
|
||||
_cell_storage.push(_celload);
|
||||
_last_offset += _celload.length;
|
||||
}
|
||||
++cnt;
|
||||
}
|
||||
tri[2][0].data = write_varint49(cnt);
|
||||
tri[5][0].data = write_varint49(5);
|
||||
for (; C < tri[7][0].data.length / 2; ++C) {
|
||||
dv.setUint16(C * 2, 65535, true);
|
||||
_dv.setUint16(C * 2, 65535, true);
|
||||
}
|
||||
tri[6][0].data = u8concat(cell_storage);
|
||||
tri[3][0].data = u8concat(_cell_storage);
|
||||
tri[8] = [{ type: 0, data: write_varint49(wide ? 1 : 0) }];
|
||||
return cnt;
|
||||
}
|
||||
function write_iwam(type, payload) {
|
||||
@ -22911,7 +22901,9 @@ function write_iwam(type, payload) {
|
||||
data: payload
|
||||
};
|
||||
}
|
||||
var USE_WIDE_ROWS = true;
|
||||
function write_numbers_iwa(wb, opts) {
|
||||
var _a;
|
||||
if (!opts || !opts.numbers)
|
||||
throw new Error("Must pass a `numbers` option -- check the README");
|
||||
var ws = wb.Sheets[wb.SheetNames[0]];
|
||||
@ -22920,13 +22912,13 @@ function write_numbers_iwa(wb, opts) {
|
||||
var range = decode_range(ws["!ref"]);
|
||||
range.s.r = range.s.c = 0;
|
||||
var trunc = false;
|
||||
if (range.e.c > 9) {
|
||||
if (range.e.c > 999) {
|
||||
trunc = true;
|
||||
range.e.c = 9;
|
||||
range.e.c = 999;
|
||||
}
|
||||
if (range.e.r > 49) {
|
||||
if (range.e.r > 254) {
|
||||
trunc = true;
|
||||
range.e.r = 49;
|
||||
range.e.r = 254;
|
||||
}
|
||||
if (trunc)
|
||||
console.error("The Numbers writer is currently limited to ".concat(encode_range(range)));
|
||||
@ -22968,19 +22960,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -23084,12 +23074,13 @@ function write_numbers_iwa(wb, opts) {
|
||||
if (_x[0].id != row_header_ref)
|
||||
throw "Bad HeaderStorageBucket";
|
||||
var base_bucket = parse_shallow(_x[0].messages[0].data);
|
||||
for (R = 0; R < data.length; ++R) {
|
||||
var _bucket = parse_shallow(base_bucket[2][0].data);
|
||||
_bucket[1][0].data = write_varint49(R);
|
||||
_bucket[4][0].data = write_varint49(data[R].length);
|
||||
base_bucket[2][R] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) };
|
||||
}
|
||||
if ((_a = base_bucket == null ? void 0 : base_bucket[2]) == null ? void 0 : _a[0])
|
||||
for (R = 0; R < data.length; ++R) {
|
||||
var _bucket = parse_shallow(base_bucket[2][0].data);
|
||||
_bucket[1][0].data = write_varint49(R);
|
||||
_bucket[4][0].data = write_varint49(data[R].length);
|
||||
base_bucket[2][R] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) };
|
||||
}
|
||||
_x[0].messages[0].data = write_shallow(base_bucket);
|
||||
}
|
||||
oldbucket.content = compress_iwa_file(write_iwa_file(_x));
|
||||
@ -23166,7 +23157,7 @@ function write_numbers_iwa(wb, opts) {
|
||||
var tile = parse_shallow(store[3][0].data);
|
||||
{
|
||||
var t = tile[1][0];
|
||||
delete tile[2];
|
||||
tile[3] = [{ type: 0, data: write_varint49(USE_WIDE_ROWS ? 1 : 0) }];
|
||||
var tl = parse_shallow(t.data);
|
||||
{
|
||||
var tileref = parse_TSP_Reference(tl[2][0].data);
|
||||
@ -23185,17 +23176,19 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
tiledata[1] = [{ type: 0, data: write_varint49(range.e.c + 1) }];
|
||||
tiledata[2] = [{ type: 0, data: write_varint49(range.e.r + 1) }];
|
||||
tiledata[3] = [{ type: 0, data: write_varint49(cnt) }];
|
||||
tiledata[1] = [{ type: 0, data: write_varint49(0) }];
|
||||
tiledata[2] = [{ type: 0, data: write_varint49(0) }];
|
||||
tiledata[3] = [{ type: 0, data: write_varint49(0) }];
|
||||
tiledata[4] = [{ type: 0, data: write_varint49(range.e.r + 1) }];
|
||||
tiledata[6] = [{ type: 0, data: write_varint49(5) }];
|
||||
tiledata[7] = [{ type: 0, data: write_varint49(1) }];
|
||||
tiledata[8] = [{ type: 0, data: write_varint49(USE_WIDE_ROWS ? 1 : 0) }];
|
||||
}
|
||||
tileroot.messages[0].data = write_shallow(tiledata);
|
||||
tentry.content = compress_iwa_file(write_iwa_file(tx));
|
||||
@ -23365,7 +23358,7 @@ function parse_zip(zip, opts) {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -23548,18 +23541,7 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
if(opts.bookType == "numbers") return write_numbers_iwa(wb, opts);
|
||||
if(opts.bookType == "xlsb") return write_zip_xlsxb(wb, opts);
|
||||
return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsxb(wb, opts) {
|
||||
function write_zip_xlsb(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = dup(table_fmt);
|
||||
@ -23621,7 +23603,7 @@ f = "docProps/app.xml";
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -23632,7 +23614,7 @@ f = "docProps/app.xml";
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -23649,13 +23631,13 @@ f = "docProps/app.xml";
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -23669,7 +23651,7 @@ f = "docProps/app.xml";
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -23681,7 +23663,7 @@ f = "docProps/app.xml";
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
@ -23977,6 +23959,15 @@ function write_cfb_ctr(cfb, o) {
|
||||
return CFB.write(cfb, o);
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
switch(opts.bookType) {
|
||||
case "ods": return write_ods(wb, opts);
|
||||
case "numbers": return write_numbers_iwa(wb, opts);
|
||||
case "xlsb": return write_zip_xlsb(wb, opts);
|
||||
default: return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
}
|
||||
|
||||
function write_zip_type(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip(wb, o);
|
||||
|
32
dist/xlsx.full.min.js
generated
vendored
32
dist/xlsx.full.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.full.min.map
generated
vendored
2
dist/xlsx.full.min.map
generated
vendored
File diff suppressed because one or more lines are too long
16
dist/xlsx.mini.min.js
generated
vendored
16
dist/xlsx.mini.min.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.mini.min.map
generated
vendored
2
dist/xlsx.mini.min.map
generated
vendored
File diff suppressed because one or more lines are too long
@ -5,7 +5,7 @@
|
||||
**Standalone Browser Scripts**
|
||||
|
||||
The complete browser standalone build is saved to `dist/xlsx.full.min.js` and
|
||||
can be directly added to a page with a `script` tag:
|
||||
can be directly added to a page with a `<script>` tag:
|
||||
|
||||
```html
|
||||
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
|
||||
@ -26,6 +26,9 @@ A specific release can be referenced by version:
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.18.5/package/dist/xlsx.full.min.js"></script>
|
||||
```
|
||||
|
||||
For production use, scripts should be downloaded and added to a public folder
|
||||
alongside other scripts.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
@ -43,8 +46,8 @@ A slimmer build is generated at `dist/xlsx.mini.min.js`. Compared to full build:
|
||||
These scripts are also available on the CDN:
|
||||
|
||||
```html
|
||||
<!-- use xlsx.core.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.core.min.js"></script>
|
||||
<!-- use xlsx.mini.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.mini.min.js"></script>
|
||||
```
|
||||
|
||||
</details>
|
||||
@ -59,21 +62,21 @@ $ bower install js-xlsx
|
||||
**ECMAScript Modules**
|
||||
|
||||
The ECMAScript Module build is saved to `xlsx.mjs` and can be directly added to
|
||||
a page with a `script` tag using `type=module`:
|
||||
a page with a `script` tag using `type="module"`:
|
||||
|
||||
```html
|
||||
<script type="module">
|
||||
import { read, writeFileXLSX } from "./xlsx.mjs";
|
||||
import { read, writeFileXLSX } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
|
||||
/* load the codepage support library for extended support with older formats */
|
||||
import { set_cptable } from "./xlsx.mjs";
|
||||
import * as cptable from './dist/cpexcel.full.mjs';
|
||||
import { set_cptable } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
import * as cptable from 'https://cdn.sheetjs.com/xlsx-latest/package/dist/cpexcel.full.mjs';
|
||||
set_cptable(cptable);
|
||||
</script>
|
||||
```
|
||||
|
||||
The [npm package](https://www.npmjs.org/package/xlsx) also exposes the module
|
||||
with the `module` parameter, supported in Angular and other projects:
|
||||
The NodeJS package also exposes the module with the `module` parameter, which is
|
||||
supported in Angular and other projects:
|
||||
|
||||
```ts
|
||||
import { read, writeFileXLSX } from "xlsx";
|
||||
@ -99,19 +102,31 @@ XLSX.set_cptable(cptable);
|
||||
|
||||
**NodeJS**
|
||||
|
||||
Modules are available on [the public npm registry](https://www.npmjs.org/package/xlsx):
|
||||
Tarballs are available on <https://cdn.sheetjs.com>.
|
||||
|
||||
<https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz> is a link to the latest
|
||||
version and will refresh on each release.
|
||||
|
||||
Each individual version can be referenced using a similar URL pattern.
|
||||
<https://cdn.sheetjs.com/xlsx-0.18.6/xlsx-0.18.6.tgz> is the URL for `0.18.6`
|
||||
|
||||
For general stability, "vendoring" modules is the recommended approach:
|
||||
|
||||
1) Download the tarball (`xlsx-<version>.tgz`) for the desired version.
|
||||
|
||||
2) Create a `vendor` subdirectory at the root of your project and move the
|
||||
tarball to that folder. Add it to your project repository.
|
||||
|
||||
3) Install the tarball using a package manager:
|
||||
|
||||
```bash
|
||||
$ pnpm install xlsx # using pnpm
|
||||
$ yarn add xlsx # using yarn
|
||||
$ npm install xlsx # using npm
|
||||
# note : replace $VERSION with the actual version (e.g. latest or 0.18.6)
|
||||
$ npm install --save file:vendor/xlsx-$VERSION.tgz # npm
|
||||
$ pnpm install --save file:vendor/xlsx-$VERSION.tgz # pnpm
|
||||
$ yarn add file:vendor/xlsx-$VERSION.tgz # yarn
|
||||
```
|
||||
|
||||
Tarballs are also available on <https://cdn.sheetjs.com>:
|
||||
|
||||
```bash
|
||||
$ npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
```
|
||||
The package will be installed and accessible as `xlsx`.
|
||||
|
||||
By default, the module supports `require`:
|
||||
|
||||
@ -139,9 +154,9 @@ XLSX.set_cptable(cpexcel);
|
||||
|
||||
**Photoshop and InDesign**
|
||||
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign
|
||||
that is included in the `npm` package. It can be directly referenced with a
|
||||
`#include` directive:
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign.
|
||||
<https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js> is the
|
||||
latest build. It can be directly referenced with a `#include` directive:
|
||||
|
||||
```extendscript
|
||||
#include "xlsx.extendscript.js"
|
||||
|
@ -116,7 +116,7 @@ port calculations to web apps; automate common spreadsheet tasks, and much more!
|
||||
**Standalone Browser Scripts**
|
||||
|
||||
The complete browser standalone build is saved to `dist/xlsx.full.min.js` and
|
||||
can be directly added to a page with a `script` tag:
|
||||
can be directly added to a page with a `<script>` tag:
|
||||
|
||||
```html
|
||||
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
|
||||
@ -137,6 +137,9 @@ A specific release can be referenced by version:
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.18.5/package/dist/xlsx.full.min.js"></script>
|
||||
```
|
||||
|
||||
For production use, scripts should be downloaded and added to a public folder
|
||||
alongside other scripts.
|
||||
|
||||
|
||||
|
||||
The complete single-file version is generated at `dist/xlsx.full.min.js`
|
||||
@ -151,8 +154,8 @@ A slimmer build is generated at `dist/xlsx.mini.min.js`. Compared to full build:
|
||||
These scripts are also available on the CDN:
|
||||
|
||||
```html
|
||||
<!-- use xlsx.core.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.core.min.js"></script>
|
||||
<!-- use xlsx.mini.min.js from the latest version -->
|
||||
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.mini.min.js"></script>
|
||||
```
|
||||
|
||||
|
||||
@ -166,21 +169,21 @@ $ bower install js-xlsx
|
||||
**ECMAScript Modules**
|
||||
|
||||
The ECMAScript Module build is saved to `xlsx.mjs` and can be directly added to
|
||||
a page with a `script` tag using `type=module`:
|
||||
a page with a `script` tag using `type="module"`:
|
||||
|
||||
```html
|
||||
<script type="module">
|
||||
import { read, writeFileXLSX } from "./xlsx.mjs";
|
||||
import { read, writeFileXLSX } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
|
||||
/* load the codepage support library for extended support with older formats */
|
||||
import { set_cptable } from "./xlsx.mjs";
|
||||
import * as cptable from './dist/cpexcel.full.mjs';
|
||||
import { set_cptable } from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
|
||||
import * as cptable from 'https://cdn.sheetjs.com/xlsx-latest/package/dist/cpexcel.full.mjs';
|
||||
set_cptable(cptable);
|
||||
</script>
|
||||
```
|
||||
|
||||
The [npm package](https://www.npmjs.org/package/xlsx) also exposes the module
|
||||
with the `module` parameter, supported in Angular and other projects:
|
||||
The NodeJS package also exposes the module with the `module` parameter, which is
|
||||
supported in Angular and other projects:
|
||||
|
||||
```ts
|
||||
import { read, writeFileXLSX } from "xlsx";
|
||||
@ -206,19 +209,31 @@ XLSX.set_cptable(cptable);
|
||||
|
||||
**NodeJS**
|
||||
|
||||
Modules are available on [the public npm registry](https://www.npmjs.org/package/xlsx):
|
||||
Tarballs are available on <https://cdn.sheetjs.com>.
|
||||
|
||||
<https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz> is a link to the latest
|
||||
version and will refresh on each release.
|
||||
|
||||
Each individual version can be referenced using a similar URL pattern.
|
||||
<https://cdn.sheetjs.com/xlsx-0.18.6/xlsx-0.18.6.tgz> is the URL for `0.18.6`
|
||||
|
||||
For general stability, "vendoring" modules is the recommended approach:
|
||||
|
||||
1) Download the tarball (`xlsx-<version>.tgz`) for the desired version.
|
||||
|
||||
2) Create a `vendor` subdirectory at the root of your project and move the
|
||||
tarball to that folder. Add it to your project repository.
|
||||
|
||||
3) Install the tarball using a package manager:
|
||||
|
||||
```bash
|
||||
$ pnpm install xlsx # using pnpm
|
||||
$ yarn add xlsx # using yarn
|
||||
$ npm install xlsx # using npm
|
||||
# note : replace $VERSION with the actual version (e.g. latest or 0.18.6)
|
||||
$ npm install --save file:vendor/xlsx-$VERSION.tgz # npm
|
||||
$ pnpm install --save file:vendor/xlsx-$VERSION.tgz # pnpm
|
||||
$ yarn add file:vendor/xlsx-$VERSION.tgz # yarn
|
||||
```
|
||||
|
||||
Tarballs are also available on <https://cdn.sheetjs.com>:
|
||||
|
||||
```bash
|
||||
$ npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
```
|
||||
The package will be installed and accessible as `xlsx`.
|
||||
|
||||
By default, the module supports `require`:
|
||||
|
||||
@ -246,9 +261,9 @@ XLSX.set_cptable(cpexcel);
|
||||
|
||||
**Photoshop and InDesign**
|
||||
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign
|
||||
that is included in the `npm` package. It can be directly referenced with a
|
||||
`#include` directive:
|
||||
`dist/xlsx.extendscript.js` is an ExtendScript build for Photoshop and InDesign.
|
||||
<https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.extendscript.js> is the
|
||||
latest build. It can be directly referenced with a `#include` directive:
|
||||
|
||||
```extendscript
|
||||
#include "xlsx.extendscript.js"
|
||||
|
@ -938,19 +938,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -1156,10 +1154,9 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
|
@ -830,18 +830,16 @@ function write_numbers_iwa(wb: WorkBook, opts: any): CFB$Container {
|
||||
|
||||
/* build dependent tree */
|
||||
cfb.FileIndex.map((fi, idx): [CFB$Entry, string] => ([fi, cfb.FullPaths[idx]])).forEach(row => {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if(!fi.name.match(/\.iwa/)) return;
|
||||
var x = parse_iwa_file(decompress_iwa_file(fi.content as Uint8Array));
|
||||
|
||||
x.forEach(ia => {
|
||||
ia.messages.forEach(m => {
|
||||
indices_varint.forEach(ivi => {
|
||||
if(ia.messages.some(mess => varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]))) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
})
|
||||
});
|
||||
indices_varint.forEach(ivi => {
|
||||
if(ia.messages.some(mess => varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]))) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
@ -1043,10 +1041,10 @@ function write_numbers_iwa(wb: WorkBook, opts: any): CFB$Container {
|
||||
delete tiledata[6]; delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
//var cnt = 0;
|
||||
for(var R = 0; R <= range.e.r; ++R) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R], SST, USE_WIDE_ROWS);
|
||||
/* cnt += */ write_tile_row(tilerow, data[R], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R);
|
||||
tiledata[5].push({data: write_shallow(tilerow), type: 2});
|
||||
}
|
||||
|
18
package.json
18
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.18.5",
|
||||
"version": "0.18.6",
|
||||
"author": "sheetjs",
|
||||
"description": "SheetJS Spreadsheet data parser and writer",
|
||||
"keywords": [
|
||||
@ -34,21 +34,18 @@
|
||||
},
|
||||
"sideEffects": false,
|
||||
"dependencies": {
|
||||
"adler-32": "~1.3.1",
|
||||
"cfb": "~1.2.2",
|
||||
"codepage": "~1.15.0",
|
||||
"crc-32": "~1.2.2",
|
||||
"ssf": "~0.11.2",
|
||||
"wmf": "~1.0.1",
|
||||
"word": "~0.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sheetjs/uglify-js": "~2.7.3",
|
||||
"@types/node": "^8.5.9",
|
||||
"acorn": "7.4.1",
|
||||
"adler-32": "~1.3.1",
|
||||
"alex": "8.1.1",
|
||||
"blanket": "~1.2.3",
|
||||
"cfb": "~1.2.2",
|
||||
"codepage": "~1.15.0",
|
||||
"commander": "~2.17.1",
|
||||
"crc-32": "~1.2.2",
|
||||
"dtslint": "^0.1.2",
|
||||
"eslint": "7.23.0",
|
||||
"eslint-plugin-html": "^6.1.2",
|
||||
@ -59,7 +56,10 @@
|
||||
"markdown-spellcheck": "^1.3.1",
|
||||
"mocha": "~2.5.3",
|
||||
"sinon": "^1.17.7",
|
||||
"typescript": "2.2.0"
|
||||
"ssf": "~0.11.2",
|
||||
"typescript": "2.2.0",
|
||||
"wmf": "~1.0.1",
|
||||
"word": "~0.3.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
139
xlsx.flow.js
139
xlsx.flow.js
@ -4,7 +4,7 @@
|
||||
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
/*:: declare var cptable:any; */
|
||||
/*global cptable:true, window */
|
||||
@ -4689,7 +4689,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4701,7 +4701,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -16363,16 +16363,16 @@ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, them
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
'xmlns': XMLNS_main[0],
|
||||
'xmlns:r': XMLNS.r
|
||||
})];
|
||||
o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
return o.join("");
|
||||
}
|
||||
//function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
// var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
// 'xmlns': XMLNS_main[0],
|
||||
// 'xmlns:r': XMLNS.r
|
||||
// })];
|
||||
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
// return o.join("");
|
||||
//}
|
||||
|
||||
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
||||
function parse_BrtCsProp(data, length/*:number*/) {
|
||||
@ -16428,25 +16428,25 @@ function parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
var ba = buf_array();
|
||||
write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
/* [BrtCsProp] */
|
||||
/* CSVIEWS */
|
||||
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
/* [USERCSVIEWS] */
|
||||
/* [BrtMargins] */
|
||||
/* [BrtCsPageSetup] */
|
||||
/* [HEADERFOOTER] */
|
||||
/* BrtDrawing */
|
||||
/* [BrtLegacyDrawing] */
|
||||
/* [BrtLegacyDrawingHF] */
|
||||
/* [BrtBkHim] */
|
||||
/* [WEBPUBITEMS] */
|
||||
/* FRTCHARTSHEET */
|
||||
write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
return ba.end();
|
||||
}
|
||||
//function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
// var ba = buf_array();
|
||||
// write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
// /* [BrtCsProp] */
|
||||
// /* CSVIEWS */
|
||||
// /* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
// /* [USERCSVIEWS] */
|
||||
// /* [BrtMargins] */
|
||||
// /* [BrtCsPageSetup] */
|
||||
// /* [HEADERFOOTER] */
|
||||
// /* BrtDrawing */
|
||||
// /* [BrtLegacyDrawing] */
|
||||
// /* [BrtLegacyDrawingHF] */
|
||||
// /* [BrtBkHim] */
|
||||
// /* [WEBPUBITEMS] */
|
||||
// /* FRTCHARTSHEET */
|
||||
// write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
// return ba.end();
|
||||
//}
|
||||
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
||||
var WBPropsDef = [
|
||||
['allowRefreshQuery', false, "bool"],
|
||||
@ -17165,10 +17165,6 @@ function parse_sty(data, name/*:string*/, themes, opts) {
|
||||
return parse_sty_xml((data/*:any*/), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data/*:string*/, name/*:string*/, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name/*:string*/, opts)/*:SST*/ {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data/*:any*/), opts);
|
||||
return parse_sst_xml((data/*:any*/), opts);
|
||||
@ -17193,40 +17189,6 @@ function parse_xlmeta(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data/*:any*/), name, opts);
|
||||
return parse_xlmeta_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data/*:SST*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data/*:Array<any>*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name/*:string*/) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
|
||||
var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
|
||||
function xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) {
|
||||
@ -22952,19 +22914,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -23170,10 +23130,9 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
@ -23353,7 +23312,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -23538,10 +23497,6 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
@ -23605,7 +23560,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -23616,7 +23571,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -23633,13 +23588,13 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -23653,7 +23608,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -23665,7 +23620,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
|
139
xlsx.js
generated
139
xlsx.js
generated
@ -4,7 +4,7 @@
|
||||
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
/*global cptable:true, window */
|
||||
var $cptable;
|
||||
@ -4604,7 +4604,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4616,7 +4616,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -16268,16 +16268,16 @@ function parse_cs_xml(data, opts, idx, rels, wb) {
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_xml(idx, opts, wb, rels) {
|
||||
var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
'xmlns': XMLNS_main[0],
|
||||
'xmlns:r': XMLNS.r
|
||||
})];
|
||||
o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
return o.join("");
|
||||
}
|
||||
//function write_cs_xml(idx, opts, wb, rels) {
|
||||
// var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
// 'xmlns': XMLNS_main[0],
|
||||
// 'xmlns:r': XMLNS.r
|
||||
// })];
|
||||
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
// return o.join("");
|
||||
//}
|
||||
|
||||
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
||||
function parse_BrtCsProp(data, length) {
|
||||
@ -16333,25 +16333,25 @@ function parse_cs_bin(data, opts, idx, rels, wb) {
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_bin() {
|
||||
var ba = buf_array();
|
||||
write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
/* [BrtCsProp] */
|
||||
/* CSVIEWS */
|
||||
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
/* [USERCSVIEWS] */
|
||||
/* [BrtMargins] */
|
||||
/* [BrtCsPageSetup] */
|
||||
/* [HEADERFOOTER] */
|
||||
/* BrtDrawing */
|
||||
/* [BrtLegacyDrawing] */
|
||||
/* [BrtLegacyDrawingHF] */
|
||||
/* [BrtBkHim] */
|
||||
/* [WEBPUBITEMS] */
|
||||
/* FRTCHARTSHEET */
|
||||
write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
return ba.end();
|
||||
}
|
||||
//function write_cs_bin() {
|
||||
// var ba = buf_array();
|
||||
// write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
// /* [BrtCsProp] */
|
||||
// /* CSVIEWS */
|
||||
// /* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
// /* [USERCSVIEWS] */
|
||||
// /* [BrtMargins] */
|
||||
// /* [BrtCsPageSetup] */
|
||||
// /* [HEADERFOOTER] */
|
||||
// /* BrtDrawing */
|
||||
// /* [BrtLegacyDrawing] */
|
||||
// /* [BrtLegacyDrawingHF] */
|
||||
// /* [BrtBkHim] */
|
||||
// /* [WEBPUBITEMS] */
|
||||
// /* FRTCHARTSHEET */
|
||||
// write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
// return ba.end();
|
||||
//}
|
||||
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
||||
var WBPropsDef = [
|
||||
['allowRefreshQuery', false, "bool"],
|
||||
@ -17068,10 +17068,6 @@ function parse_sty(data, name, themes, opts) {
|
||||
return parse_sty_xml((data), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data, name, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data), opts);
|
||||
return parse_sst_xml((data), opts);
|
||||
@ -17096,40 +17092,6 @@ function parse_xlmeta(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data), name, opts);
|
||||
return parse_xlmeta_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
|
||||
var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
|
||||
function xlml_parsexmltag(tag, skip_root) {
|
||||
@ -22842,19 +22804,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -23060,10 +23020,9 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
@ -23243,7 +23202,7 @@ function parse_zip(zip, opts) {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -23426,10 +23385,6 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsb(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
@ -23492,7 +23447,7 @@ f = "docProps/app.xml";
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -23503,7 +23458,7 @@ f = "docProps/app.xml";
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -23520,13 +23475,13 @@ f = "docProps/app.xml";
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -23540,7 +23495,7 @@ f = "docProps/app.xml";
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -23552,7 +23507,7 @@ f = "docProps/app.xml";
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
|
||||
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
|
||||
@ -967,7 +967,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=SSF_parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
@ -1299,6 +1299,15 @@ function dateNF_fix(str/*:string*/, dateNF/*:string*/, match/*:Array<string>*/)/
|
||||
return datestr + "T" + timestr;
|
||||
}
|
||||
|
||||
/* table of bad formats written by third-party tools */
|
||||
var bad_formats = {
|
||||
"d.m": "d\\.m" // Issue #2571 Google Sheets writes invalid format 'd.m', correct format is 'd"."m' or 'd\\.m'
|
||||
};
|
||||
|
||||
function SSF__load(fmt, idx) {
|
||||
return SSF_load(bad_formats[fmt] || fmt, idx);
|
||||
}
|
||||
|
||||
/*::
|
||||
declare var ReadShift:any;
|
||||
declare var CheckField:any;
|
||||
@ -1434,7 +1443,7 @@ return CRC32;
|
||||
/* [MS-CFB] v20171201 */
|
||||
var CFB = /*#__PURE__*/(function _CFB(){
|
||||
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
|
||||
exports.version = '1.2.1';
|
||||
exports.version = '1.2.2';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -1734,7 +1743,7 @@ function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array<RawBytes>*/,
|
||||
if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
|
||||
fat_addrs.push(q);
|
||||
}
|
||||
sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
if(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1910,7 +1919,9 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {
|
||||
for(i = 0; i < data.length; ++i) {
|
||||
var dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
if(!s) {
|
||||
while(!s) {
|
||||
while(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);
|
||||
|
||||
data.push([dad, ({
|
||||
name: filename(dad).replace("/",""),
|
||||
type: 1,
|
||||
@ -1918,8 +1929,12 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {
|
||||
ct: now, mt: now,
|
||||
content: null
|
||||
}/*:any*/)]);
|
||||
|
||||
// Add name to set
|
||||
fullPaths[dad] = true;
|
||||
|
||||
dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
}
|
||||
}
|
||||
|
||||
@ -1967,7 +1982,6 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|strin
|
||||
for(var i = 0; i < cfb.FileIndex.length; ++i) {
|
||||
var file = cfb.FileIndex[i];
|
||||
if(!file.content) continue;
|
||||
/*:: if(file.content == null) throw new Error("unreachable"); */
|
||||
var flen = file.content.length;
|
||||
if(flen > 0){
|
||||
if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
|
||||
@ -2058,6 +2072,10 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|strin
|
||||
file = cfb.FileIndex[i];
|
||||
if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
|
||||
var _nm/*:string*/ = (i === 0 && _opts.root) || file.name;
|
||||
if(_nm.length > 32) {
|
||||
console.error("Name " + _nm + " will be truncated to " + _nm.slice(0,32));
|
||||
_nm = _nm.slice(0, 32);
|
||||
}
|
||||
flen = 2*(_nm.length+1);
|
||||
o.write_shift(64, _nm, "utf16le");
|
||||
o.write_shift(2, flen);
|
||||
@ -2696,6 +2714,7 @@ function parse_zip(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/
|
||||
parse_local_file(blob, csz, usz, o, EF);
|
||||
blob.l = L;
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@ -4338,7 +4357,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4350,7 +4369,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -7025,7 +7044,7 @@ function parse_numFmts(t, styles, opts) {
|
||||
for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
|
||||
styles.NumberFmt[j] = f;
|
||||
}
|
||||
SSF_load(f,j);
|
||||
SSF__load(f,j);
|
||||
}
|
||||
} break;
|
||||
case '</numFmt>': break;
|
||||
@ -8061,7 +8080,7 @@ function get_cell_style(styles/*:Array<any>*/, cell/*:Cell*/, opts) {
|
||||
var i = 0x3c, len = styles.length;
|
||||
if(z == null && opts.ssf) {
|
||||
for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
|
||||
SSF_load(cell.z, i);
|
||||
SSF__load(cell.z, i);
|
||||
// $FlowIgnore
|
||||
opts.ssf[i] = cell.z;
|
||||
opts.revssf[cell.z] = z = i;
|
||||
@ -8087,7 +8106,7 @@ function safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, the
|
||||
if(p.t === 'z' && !opts.cellStyles) return;
|
||||
if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
|
||||
if((!opts || opts.cellText !== false) && p.t !== 'z') try {
|
||||
if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(table_fmt[fmtid] == null) SSF__load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(p.t === 'e') p.w = p.w || BErr[p.v];
|
||||
else if(fmtid === 0) {
|
||||
if(p.t === 'n') {
|
||||
@ -9276,10 +9295,6 @@ function parse_sty(data, name/*:string*/, themes, opts) {
|
||||
return parse_sty_xml((data/*:any*/), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data/*:string*/, name/*:string*/, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name/*:string*/, opts)/*:SST*/ {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data/*:any*/), opts);
|
||||
return parse_sst_xml((data/*:any*/), opts);
|
||||
@ -9304,40 +9319,6 @@ function parse_xlmeta(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data/*:any*/), name, opts);
|
||||
return parse_xlmeta_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data/*:SST*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data/*:Array<any>*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name/*:string*/) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
/* note: browser DOM element cannot see mso- style attrs, must parse */
|
||||
function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {
|
||||
var opts = _opts || {};
|
||||
@ -10584,7 +10565,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -10769,18 +10750,7 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
if(opts.bookType == "numbers") return write_numbers_iwa(wb, opts);
|
||||
if(opts.bookType == "xlsb") return write_zip_xlsxb(wb, opts);
|
||||
return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = dup(table_fmt);
|
||||
@ -10843,7 +10813,7 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -10854,7 +10824,7 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -10871,13 +10841,13 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -10891,7 +10861,7 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -10903,7 +10873,7 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
@ -11200,6 +11170,15 @@ function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ {
|
||||
return CFB.write(cfb, o);
|
||||
}
|
||||
|
||||
function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
switch(opts.bookType) {
|
||||
case "ods": return write_ods(wb, opts);
|
||||
case "numbers": return write_numbers_iwa(wb, opts);
|
||||
case "xlsb": return write_zip_xlsb(wb, opts);
|
||||
default: return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
}
|
||||
|
||||
/*:: declare var encrypt_agile:any; */
|
||||
function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {
|
||||
var o = dup(opts||{});
|
||||
|
116
xlsx.mini.js
116
xlsx.mini.js
@ -4,7 +4,7 @@
|
||||
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
|
||||
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
|
||||
@ -945,7 +945,7 @@ function eval_fmt(fmt, v, opts, flen) {
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=SSF_parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
@ -1270,6 +1270,15 @@ function dateNF_fix(str, dateNF, match) {
|
||||
return datestr + "T" + timestr;
|
||||
}
|
||||
|
||||
/* table of bad formats written by third-party tools */
|
||||
var bad_formats = {
|
||||
"d.m": "d\\.m" // Issue #2571 Google Sheets writes invalid format 'd.m', correct format is 'd"."m' or 'd\\.m'
|
||||
};
|
||||
|
||||
function SSF__load(fmt, idx) {
|
||||
return SSF_load(bad_formats[fmt] || fmt, idx);
|
||||
}
|
||||
|
||||
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*jshint eqnull:true */
|
||||
@ -1373,7 +1382,7 @@ return CRC32;
|
||||
/* [MS-CFB] v20171201 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports = {};
|
||||
exports.version = '1.2.1';
|
||||
exports.version = '1.2.2';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l, r) {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -1673,7 +1682,7 @@ function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
||||
if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
|
||||
fat_addrs.push(q);
|
||||
}
|
||||
sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
if(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1849,7 +1858,9 @@ function rebuild_cfb(cfb, f) {
|
||||
for(i = 0; i < data.length; ++i) {
|
||||
var dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
if(!s) {
|
||||
while(!s) {
|
||||
while(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);
|
||||
|
||||
data.push([dad, ({
|
||||
name: filename(dad).replace("/",""),
|
||||
type: 1,
|
||||
@ -1857,8 +1868,12 @@ function rebuild_cfb(cfb, f) {
|
||||
ct: now, mt: now,
|
||||
content: null
|
||||
})]);
|
||||
|
||||
// Add name to set
|
||||
fullPaths[dad] = true;
|
||||
|
||||
dad = dirname(data[i][0]);
|
||||
s = fullPaths[dad];
|
||||
}
|
||||
}
|
||||
|
||||
@ -1906,7 +1921,7 @@ function _write(cfb, options) {
|
||||
for(var i = 0; i < cfb.FileIndex.length; ++i) {
|
||||
var file = cfb.FileIndex[i];
|
||||
if(!file.content) continue;
|
||||
var flen = file.content.length;
|
||||
var flen = file.content.length;
|
||||
if(flen > 0){
|
||||
if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
|
||||
else fat_size += (flen + 0x01FF) >> 9;
|
||||
@ -1994,6 +2009,10 @@ flen = file.content.length;
|
||||
file = cfb.FileIndex[i];
|
||||
if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
|
||||
var _nm = (i === 0 && _opts.root) || file.name;
|
||||
if(_nm.length > 32) {
|
||||
console.error("Name " + _nm + " will be truncated to " + _nm.slice(0,32));
|
||||
_nm = _nm.slice(0, 32);
|
||||
}
|
||||
flen = 2*(_nm.length+1);
|
||||
o.write_shift(64, _nm, "utf16le");
|
||||
o.write_shift(2, flen);
|
||||
@ -2629,6 +2648,7 @@ function parse_zip(file, options) {
|
||||
parse_local_file(blob, csz, usz, o, EF);
|
||||
blob.l = L;
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@ -4253,7 +4273,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4265,7 +4285,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -6939,7 +6959,7 @@ function parse_numFmts(t, styles, opts) {
|
||||
for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
|
||||
styles.NumberFmt[j] = f;
|
||||
}
|
||||
SSF_load(f,j);
|
||||
SSF__load(f,j);
|
||||
}
|
||||
} break;
|
||||
case '</numFmt>': break;
|
||||
@ -7975,7 +7995,7 @@ function get_cell_style(styles, cell, opts) {
|
||||
var i = 0x3c, len = styles.length;
|
||||
if(z == null && opts.ssf) {
|
||||
for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
|
||||
SSF_load(cell.z, i);
|
||||
SSF__load(cell.z, i);
|
||||
// $FlowIgnore
|
||||
opts.ssf[i] = cell.z;
|
||||
opts.revssf[cell.z] = z = i;
|
||||
@ -8001,7 +8021,7 @@ function safe_format(p, fmtid, fillid, opts, themes, styles) {
|
||||
if(p.t === 'z' && !opts.cellStyles) return;
|
||||
if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
|
||||
if((!opts || opts.cellText !== false) && p.t !== 'z') try {
|
||||
if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(table_fmt[fmtid] == null) SSF__load(SSFImplicit[fmtid] || "General", fmtid);
|
||||
if(p.t === 'e') p.w = p.w || BErr[p.v];
|
||||
else if(fmtid === 0) {
|
||||
if(p.t === 'n') {
|
||||
@ -9188,10 +9208,6 @@ function parse_sty(data, name, themes, opts) {
|
||||
return parse_sty_xml((data), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data, name, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data), opts);
|
||||
return parse_sst_xml((data), opts);
|
||||
@ -9216,40 +9232,6 @@ function parse_xlmeta(data, name, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data), name, opts);
|
||||
return parse_xlmeta_xml((data), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data, name, opts, wb, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data, name, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
/* note: browser DOM element cannot see mso- style attrs, must parse */
|
||||
function html_to_sheet(str, _opts) {
|
||||
var opts = _opts || {};
|
||||
@ -10496,7 +10478,7 @@ function parse_zip(zip, opts) {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -10679,18 +10661,7 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
if(opts.bookType == "numbers") return write_numbers_iwa(wb, opts);
|
||||
if(opts.bookType == "xlsb") return write_zip_xlsxb(wb, opts);
|
||||
return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsxb(wb, opts) {
|
||||
function write_zip_xlsb(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = dup(table_fmt);
|
||||
@ -10752,7 +10723,7 @@ f = "docProps/app.xml";
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -10763,7 +10734,7 @@ f = "docProps/app.xml";
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -10780,13 +10751,13 @@ f = "docProps/app.xml";
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -10800,7 +10771,7 @@ f = "docProps/app.xml";
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -10812,7 +10783,7 @@ f = "docProps/app.xml";
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
@ -11108,6 +11079,15 @@ function write_cfb_ctr(cfb, o) {
|
||||
return CFB.write(cfb, o);
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
switch(opts.bookType) {
|
||||
case "ods": return write_ods(wb, opts);
|
||||
case "numbers": return write_numbers_iwa(wb, opts);
|
||||
case "xlsb": return write_zip_xlsb(wb, opts);
|
||||
default: return write_zip_xlsx(wb, opts);
|
||||
}
|
||||
}
|
||||
|
||||
function write_zip_type(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip(wb, o);
|
||||
|
139
xlsx.mjs
generated
139
xlsx.mjs
generated
@ -3,7 +3,7 @@
|
||||
/*exported XLSX */
|
||||
/*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
||||
var XLSX = {};
|
||||
XLSX.version = '0.18.5';
|
||||
XLSX.version = '0.18.6';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
|
||||
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
|
||||
@ -4677,7 +4677,7 @@ var VT_UI4 = 0x0013;
|
||||
//var VT_UI8 = 0x0015;
|
||||
//var VT_INT = 0x0016;
|
||||
//var VT_UINT = 0x0017;
|
||||
var VT_LPSTR = 0x001E;
|
||||
//var VT_LPSTR = 0x001E;
|
||||
//var VT_LPWSTR = 0x001F;
|
||||
var VT_FILETIME = 0x0040;
|
||||
var VT_BLOB = 0x0041;
|
||||
@ -4689,7 +4689,7 @@ var VT_BLOB = 0x0041;
|
||||
var VT_CF = 0x0047;
|
||||
//var VT_CLSID = 0x0048;
|
||||
//var VT_VERSIONED_STREAM = 0x0049;
|
||||
var VT_VECTOR = 0x1000;
|
||||
//var VT_VECTOR = 0x1000;
|
||||
var VT_VECTOR_VARIANT = 0x100C;
|
||||
var VT_VECTOR_LPSTR = 0x101E;
|
||||
//var VT_ARRAY = 0x2000;
|
||||
@ -16351,16 +16351,16 @@ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, them
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
'xmlns': XMLNS_main[0],
|
||||
'xmlns:r': XMLNS.r
|
||||
})];
|
||||
o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
return o.join("");
|
||||
}
|
||||
//function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
|
||||
// var o = [XML_HEADER, writextag('chartsheet', null, {
|
||||
// 'xmlns': XMLNS_main[0],
|
||||
// 'xmlns:r': XMLNS.r
|
||||
// })];
|
||||
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
|
||||
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
|
||||
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
|
||||
// return o.join("");
|
||||
//}
|
||||
|
||||
/* [MS-XLSB] 2.4.331 BrtCsProp */
|
||||
function parse_BrtCsProp(data, length/*:number*/) {
|
||||
@ -16416,25 +16416,25 @@ function parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/
|
||||
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
|
||||
return s;
|
||||
}
|
||||
function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
var ba = buf_array();
|
||||
write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
/* [BrtCsProp] */
|
||||
/* CSVIEWS */
|
||||
/* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
/* [USERCSVIEWS] */
|
||||
/* [BrtMargins] */
|
||||
/* [BrtCsPageSetup] */
|
||||
/* [HEADERFOOTER] */
|
||||
/* BrtDrawing */
|
||||
/* [BrtLegacyDrawing] */
|
||||
/* [BrtLegacyDrawingHF] */
|
||||
/* [BrtBkHim] */
|
||||
/* [WEBPUBITEMS] */
|
||||
/* FRTCHARTSHEET */
|
||||
write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
return ba.end();
|
||||
}
|
||||
//function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
|
||||
// var ba = buf_array();
|
||||
// write_record(ba, 0x0081 /* BrtBeginSheet */);
|
||||
// /* [BrtCsProp] */
|
||||
// /* CSVIEWS */
|
||||
// /* [[BrtCsProtectionIso] BrtCsProtection] */
|
||||
// /* [USERCSVIEWS] */
|
||||
// /* [BrtMargins] */
|
||||
// /* [BrtCsPageSetup] */
|
||||
// /* [HEADERFOOTER] */
|
||||
// /* BrtDrawing */
|
||||
// /* [BrtLegacyDrawing] */
|
||||
// /* [BrtLegacyDrawingHF] */
|
||||
// /* [BrtBkHim] */
|
||||
// /* [WEBPUBITEMS] */
|
||||
// /* FRTCHARTSHEET */
|
||||
// write_record(ba, 0x0082 /* BrtEndSheet */);
|
||||
// return ba.end();
|
||||
//}
|
||||
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
||||
var WBPropsDef = [
|
||||
['allowRefreshQuery', false, "bool"],
|
||||
@ -17153,10 +17153,6 @@ function parse_sty(data, name/*:string*/, themes, opts) {
|
||||
return parse_sty_xml((data/*:any*/), themes, opts);
|
||||
}
|
||||
|
||||
function parse_theme(data/*:string*/, name/*:string*/, opts) {
|
||||
return parse_theme_xml(data, opts);
|
||||
}
|
||||
|
||||
function parse_sst(data, name/*:string*/, opts)/*:SST*/ {
|
||||
if(name.slice(-4)===".bin") return parse_sst_bin((data/*:any*/), opts);
|
||||
return parse_sst_xml((data/*:any*/), opts);
|
||||
@ -17181,40 +17177,6 @@ function parse_xlmeta(data, name/*:string*/, opts) {
|
||||
if(name.slice(-4)===".bin") return parse_xlmeta_bin((data/*:any*/), name, opts);
|
||||
return parse_xlmeta_xml((data/*:any*/), name, opts);
|
||||
}
|
||||
|
||||
function write_wb(wb, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
|
||||
}
|
||||
|
||||
function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {
|
||||
return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
|
||||
}
|
||||
|
||||
function write_sty(data, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_sst(data/*:SST*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
|
||||
}
|
||||
|
||||
function write_cmnt(data/*:Array<any>*/, name/*:string*/, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
|
||||
}
|
||||
/*
|
||||
function write_cc(data, name:string, opts) {
|
||||
return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
|
||||
}
|
||||
*/
|
||||
|
||||
function write_xlmeta(name/*:string*/) {
|
||||
return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)();
|
||||
}
|
||||
var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
|
||||
var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
|
||||
function xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) {
|
||||
@ -22940,19 +22902,17 @@ function write_numbers_iwa(wb, opts) {
|
||||
cfb.FileIndex.map(function(fi, idx) {
|
||||
return [fi, cfb.FullPaths[idx]];
|
||||
}).forEach(function(row) {
|
||||
var fi = row[0], fp = row[1];
|
||||
var fi = row[0];
|
||||
if (!fi.name.match(/\.iwa/))
|
||||
return;
|
||||
var x2 = parse_iwa_file(decompress_iwa_file(fi.content));
|
||||
x2.forEach(function(ia) {
|
||||
ia.messages.forEach(function(m) {
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
indices_varint.forEach(function(ivi) {
|
||||
if (ia.messages.some(function(mess) {
|
||||
return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);
|
||||
})) {
|
||||
dependents[ivi[0]].deps.push(ia.id);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -23158,10 +23118,9 @@ function write_numbers_iwa(wb, opts) {
|
||||
delete tile[7];
|
||||
var rowload = new Uint8Array(tiledata[5][0].data);
|
||||
tiledata[5] = [];
|
||||
var cnt = 0;
|
||||
for (var R2 = 0; R2 <= range.e.r; ++R2) {
|
||||
var tilerow = parse_shallow(rowload);
|
||||
cnt += write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
write_tile_row(tilerow, data[R2], SST, USE_WIDE_ROWS);
|
||||
tilerow[1][0].data = write_varint49(R2);
|
||||
tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
|
||||
}
|
||||
@ -23341,7 +23300,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
strs = [];
|
||||
if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
|
||||
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
|
||||
if(opts.cellStyles && dir.themes.length) themes = parse_theme_xml(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"", opts);
|
||||
|
||||
if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
|
||||
}
|
||||
@ -23526,10 +23485,6 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
|
||||
throw new Error("File is password-protected");
|
||||
}
|
||||
|
||||
/* XLSX and XLSB writing are very similar. Originally they were unified in one
|
||||
export function. This is horrible for tree shaking in the common case (most
|
||||
applications need to export files in one format) so this function supports
|
||||
both formats while write_zip_xlsx only handles XLSX */
|
||||
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
@ -23593,7 +23548,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
|
||||
zip_add_file(zip, f, write_ws_bin(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
@ -23604,7 +23559,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
var cf = "";
|
||||
if(comments && comments.length > 0) {
|
||||
cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
|
||||
zip_add_file(zip, cf, write_comments_bin(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
@ -23621,13 +23576,13 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
|
||||
zip_add_file(zip, f, write_sst_bin(opts.Strings, opts));
|
||||
ct.strs.push(f);
|
||||
add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
|
||||
}
|
||||
|
||||
f = "xl/workbook." + wbext;
|
||||
zip_add_file(zip, f, write_wb(wb, f, opts));
|
||||
zip_add_file(zip, f, write_wb_bin(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
@ -23641,7 +23596,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty(wb, f, opts));
|
||||
zip_add_file(zip, f, write_sty_bin(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
@ -23653,7 +23608,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
}
|
||||
|
||||
f = "xl/metadata." + wbext;
|
||||
zip_add_file(zip, f, write_xlmeta(f));
|
||||
zip_add_file(zip, f, write_xlmeta_bin());
|
||||
ct.metadata.push(f);
|
||||
add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user