version bump 0.18.1: ESM
This commit is contained in:
parent
fbdd43a3f4
commit
8e6c0411d9
2
.github/workflows/deno.yml
vendored
2
.github/workflows/deno.yml
vendored
@ -24,6 +24,8 @@ jobs:
|
||||
# full test
|
||||
full:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
FMTS: misc # TODO: remove this
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: denoland/setup-deno@main
|
||||
|
@ -51,6 +51,8 @@ make.cmd
|
||||
xlsworker.js
|
||||
shim.js
|
||||
test.js
|
||||
test.mjs
|
||||
test.ts
|
||||
.jscs.json
|
||||
.gitmodules
|
||||
.travis.yml
|
||||
|
49
README.md
49
README.md
@ -156,16 +156,6 @@ A slimmer build is generated at `dist/xlsx.mini.min.js`. Compared to full build:
|
||||
- no support for XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003
|
||||
- node stream utils removed
|
||||
|
||||
Webpack and Browserify builds include optional modules by default. Webpack can
|
||||
be configured to remove support with `resolve.alias`:
|
||||
|
||||
```js
|
||||
/* uncomment the lines below to remove support */
|
||||
resolve: {
|
||||
alias: { "./dist/cpexcel.js": "" } // <-- omit international support
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
@ -175,6 +165,34 @@ With [bower](https://bower.io/search/?q=js-xlsx):
|
||||
$ 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`:
|
||||
|
||||
```html
|
||||
<script type="module">
|
||||
import { read, writeFileXLSX } from "./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';
|
||||
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:
|
||||
|
||||
```ts
|
||||
import { read, writeFileXLSX } from "xlsx";
|
||||
|
||||
/* load the codepage support library for extended support with older formats */
|
||||
import { set_cptable } from "xlsx";
|
||||
import * as cptable from 'xlsx/dist/cpexcel.full.mjs';
|
||||
set_cptable(cptable);
|
||||
```
|
||||
|
||||
**Deno**
|
||||
|
||||
The [`sheetjs`](https://deno.land/x/sheetjs) package is hosted by Deno:
|
||||
@ -1460,6 +1478,17 @@ The `writeFile` method uses platform-specific APIs to initiate the file save. In
|
||||
NodeJS, `fs.readFileSync` can create a file. In the web browser, a download is
|
||||
attempted using the HTML5 `download` attribute, with fallbacks for IE.
|
||||
|
||||
_Generate and attempt to save an XLSX file_
|
||||
|
||||
```js
|
||||
XLSX.writeFileXLSX(workbook, filename, opts);
|
||||
```
|
||||
|
||||
The `writeFile` method embeds a number of different export functions. This is
|
||||
great for developer experience but not amenable to dead code elimination using
|
||||
the current toolset. When only XLSX exports are needed, this method avoids
|
||||
referencing the other export codecs.
|
||||
|
||||
The second `opts` argument is optional. ["Writing Options"](#writing-options)
|
||||
covers the supported properties and behaviors.
|
||||
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.18.0';
|
||||
XLSX.version = '0.18.1';
|
||||
|
@ -1,6 +1,10 @@
|
||||
function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
return write_zip_xlsxb(wb, opts);
|
||||
}
|
||||
|
||||
function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
@ -127,3 +131,134 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
|
||||
function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
if(wb && wb.SSF) {
|
||||
make_ssf(SSF); SSF.load_table(wb.SSF);
|
||||
// $FlowIgnore
|
||||
opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
|
||||
opts.ssf = wb.SSF;
|
||||
}
|
||||
opts.rels = {}; opts.wbrels = {};
|
||||
opts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0;
|
||||
if(browser_has_Map) opts.revStrings = new Map();
|
||||
else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }
|
||||
var wbext = "xml";
|
||||
var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
|
||||
var ct = new_ct();
|
||||
fix_write_opts(opts = opts || {});
|
||||
var zip = zip_new();
|
||||
var f = "", rId = 0;
|
||||
|
||||
opts.cellXfs = [];
|
||||
get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
|
||||
|
||||
if(!wb.Props) wb.Props = {};
|
||||
|
||||
f = "docProps/core.xml";
|
||||
zip_add_file(zip, f, write_core_props(wb.Props, opts));
|
||||
ct.coreprops.push(f);
|
||||
add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
|
||||
|
||||
/*::if(!wb.Props) throw "unreachable"; */
|
||||
f = "docProps/app.xml";
|
||||
if(wb.Props && wb.Props.SheetNames){/* empty */}
|
||||
else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
|
||||
else {
|
||||
var _sn = [];
|
||||
for(var _i = 0; _i < wb.SheetNames.length; ++_i)
|
||||
if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
|
||||
wb.Props.SheetNames = _sn;
|
||||
}
|
||||
wb.Props.Worksheets = wb.Props.SheetNames.length;
|
||||
zip_add_file(zip, f, write_ext_props(wb.Props, opts));
|
||||
ct.extprops.push(f);
|
||||
add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
|
||||
|
||||
if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
|
||||
f = "docProps/custom.xml";
|
||||
zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
|
||||
ct.custprops.push(f);
|
||||
add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
|
||||
}
|
||||
|
||||
for(rId=1;rId <= wb.SheetNames.length; ++rId) {
|
||||
var wsrels = {'!id':{}};
|
||||
var ws = wb.Sheets[wb.SheetNames[rId-1]];
|
||||
var _type = (ws || {})["!type"] || "sheet";
|
||||
switch(_type) {
|
||||
case "chart":
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
|
||||
if(ws) {
|
||||
var comments = ws['!comments'];
|
||||
var need_vml = false;
|
||||
if(comments && comments.length > 0) {
|
||||
var cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_comments_xml(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
}
|
||||
if(ws['!legacy']) {
|
||||
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
|
||||
}
|
||||
delete ws['!comments'];
|
||||
delete ws['!legacy'];
|
||||
}
|
||||
|
||||
if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
|
||||
}
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst_xml(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_xml(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
/* TODO: something more intelligent with themes */
|
||||
|
||||
f = "xl/theme/theme1.xml";
|
||||
zip_add_file(zip, f, write_theme(wb.Themes, opts));
|
||||
ct.themes.push(f);
|
||||
add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
|
||||
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty_xml(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
if(wb.vbaraw && vbafmt) {
|
||||
f = "xl/vbaProject.bin";
|
||||
zip_add_file(zip, f, wb.vbaraw);
|
||||
ct.vba.push(f);
|
||||
add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
|
||||
}
|
||||
|
||||
zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
|
||||
zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
|
||||
zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
|
||||
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,14 @@ function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ {
|
||||
function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_typeXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip_xlsx(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_denouement(z/*:any*/, o/*:?WriteOpts*/)/*:any*/ {
|
||||
var oopts = {};
|
||||
if(o.compression) oopts.compression = 'DEFLATE';
|
||||
if(o.password) oopts.type = has_buf ? "nodebuffer" : "string";
|
||||
@ -114,6 +122,15 @@ function write_binary_type(out, opts/*:WriteOpts*/)/*:any*/ {
|
||||
}
|
||||
}
|
||||
|
||||
function writeSyncXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
var o = dup(opts||{});
|
||||
if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
|
||||
if(o.type == "array") { o.type = "binary"; var out/*:string*/ = (writeSyncXLSX(wb, o)/*:any*/); o.type = "array"; return s2ab(out); }
|
||||
return write_zip_typeXLSX(wb, o);
|
||||
}
|
||||
|
||||
function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
@ -174,6 +191,14 @@ function writeFileSync(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOp
|
||||
return writeSync(wb, o);
|
||||
}
|
||||
|
||||
function writeFileSyncXLSX(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOpts*/) {
|
||||
var o = opts||{}; o.type = 'file';
|
||||
o.file = filename;
|
||||
resolve_book_type(o);
|
||||
return writeSyncXLSX(wb, o);
|
||||
}
|
||||
|
||||
|
||||
function writeFileAsync(filename/*:string*/, wb/*:Workbook*/, opts/*:?WriteFileOpts*/, cb/*:?(e?:ErrnoError)=>void*/) {
|
||||
var o = opts||{}; o.type = 'file';
|
||||
o.file = filename;
|
||||
|
@ -8,5 +8,7 @@ XLSX.writeFile = writeFileSync;
|
||||
XLSX.writeFileSync = writeFileSync;
|
||||
XLSX.writeFileAsync = writeFileAsync;
|
||||
XLSX.utils = utils;
|
||||
XLSX.writeXLSX = writeSyncXLSX;
|
||||
XLSX.writeFileXLSX = writeFileSyncXLSX;
|
||||
XLSX.SSF = SSF;
|
||||
if(typeof CFB !== "undefined") XLSX.CFB = CFB;
|
||||
|
@ -6,11 +6,17 @@ ng2 ng4 ng5 ng6 ng7 ng8 ng9 ng10 ng11 ng12 ng13:
|
||||
if [ -e versions/tsconfig.app.json-$@ ]; then cp versions/tsconfig.app.json-$@ tsconfig.app.json; fi
|
||||
if [ -e versions/polyfills.ts-$@ ]; then cp versions/polyfills.ts-$@ src/polyfills.ts; fi
|
||||
rm -rf node_modules
|
||||
npm install
|
||||
if [ ! -e node_modules ]; then mkdir node_modules; fi
|
||||
npm install
|
||||
if [ ! -e node_modules/xlsx ]; then cd node_modules; ln -s ../../../ xlsx; cd -; fi
|
||||
npm run build
|
||||
|
||||
.PHONY: refresh
|
||||
refresh: ## refresh the `xlsx` symlink to force angular to rebuild
|
||||
rm -f node_modules/xlsx
|
||||
cd node_modules; ln -s ../../../ xlsx; cd -
|
||||
touch node_modules/xlsx
|
||||
|
||||
.PHONY: all
|
||||
all:
|
||||
for i in 2 4 5 6 7 8 9 10 11 12 13; do make ng$$i; done
|
||||
|
@ -1,9 +1,9 @@
|
||||
# Angular 2+
|
||||
|
||||
The library can be imported directly from TS code with:
|
||||
The ESM build can be imported directly from TS code with:
|
||||
|
||||
```typescript
|
||||
import * as XLSX from 'xlsx';
|
||||
import { read, utils, writeFileXLSX } from 'xlsx';
|
||||
```
|
||||
|
||||
This demo uses an array of arrays (type `Array<Array<any>>`) as the core state.
|
||||
|
@ -2,7 +2,9 @@
|
||||
/* vim: set ts=2: */
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import * as XLSX from 'xlsx';
|
||||
import { WorkBook, WorkSheet, WritingOptions, read, writeFileXLSX as writeFile, utils, version, set_cptable } from 'xlsx';
|
||||
//import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
|
||||
//set_cptable(cpexcel);
|
||||
|
||||
type AOA = any[][];
|
||||
|
||||
@ -24,9 +26,9 @@ type AOA = any[][];
|
||||
|
||||
export class SheetJSComponent {
|
||||
data: AOA = [ [1, 2], [3, 4] ];
|
||||
wopts: XLSX.WritingOptions = { bookType: 'xlsx', type: 'array' };
|
||||
wopts: WritingOptions = { bookType: 'xlsx', type: 'array' };
|
||||
fileName: string = 'SheetJS.xlsx';
|
||||
ver: string = XLSX.version;
|
||||
ver: string = version;
|
||||
|
||||
onFileChange(evt: any) {
|
||||
/* wire up file reader */
|
||||
@ -36,27 +38,27 @@ export class SheetJSComponent {
|
||||
reader.onload = (e: any) => {
|
||||
/* read workbook */
|
||||
const ab: ArrayBuffer = e.target.result;
|
||||
const wb: XLSX.WorkBook = XLSX.read(ab);
|
||||
const wb: WorkBook = read(ab);
|
||||
|
||||
/* grab first sheet */
|
||||
const wsname: string = wb.SheetNames[0];
|
||||
const ws: XLSX.WorkSheet = wb.Sheets[wsname];
|
||||
const ws: WorkSheet = wb.Sheets[wsname];
|
||||
|
||||
/* save data */
|
||||
this.data = <AOA>(XLSX.utils.sheet_to_json(ws, {header: 1}));
|
||||
this.data = <AOA>(utils.sheet_to_json(ws, {header: 1}));
|
||||
};
|
||||
reader.readAsArrayBuffer(target.files[0]);
|
||||
}
|
||||
|
||||
export(): void {
|
||||
/* generate worksheet */
|
||||
const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(this.data);
|
||||
const ws: WorkSheet = utils.aoa_to_sheet(this.data);
|
||||
|
||||
/* generate workbook and add the worksheet */
|
||||
const wb: XLSX.WorkBook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
|
||||
const wb: WorkBook = utils.book_new();
|
||||
utils.book_append_sheet(wb, ws, 'Sheet1');
|
||||
|
||||
/* save to file */
|
||||
XLSX.writeFile(wb, this.fileName);
|
||||
writeFile(wb, this.fileName);
|
||||
}
|
||||
}
|
||||
|
30
dist/xlsx.core.min.js
generated
vendored
30
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
220
dist/xlsx.extendscript.js
generated
vendored
220
dist/xlsx.extendscript.js
generated
vendored
@ -160,7 +160,7 @@ var DO_NOT_EXPORT_CODEPAGE = true;
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.0';
|
||||
XLSX.version = '0.18.1';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
/*global cptable:true, window */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -355,7 +355,7 @@ function utf8decode(content) {
|
||||
o[widx++] = (128|(c&63));
|
||||
} else if(c >= 0xD800 && c < 0xE000) {
|
||||
c = (c&1023)+64;
|
||||
var d = str.charCodeAt(++ridx)&1023;
|
||||
var d = content.charCodeAt(++ridx)&1023;
|
||||
o[widx++] = (240|((c>>8)&7));
|
||||
o[widx++] = (128|((c>>2)&63));
|
||||
o[widx++] = (128|((d>>6)&15)|((c&3)<<4));
|
||||
@ -3267,6 +3267,16 @@ function blobify(data) {
|
||||
function write_dl(fname, payload, enc) {
|
||||
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
|
||||
if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
|
||||
if(typeof Deno !== 'undefined') {
|
||||
/* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */
|
||||
if(enc) switch(enc) {
|
||||
case "utf8": payload = new TextEncoder(enc).encode(payload); break;
|
||||
case "binary": payload = s2ab(payload); break;
|
||||
/* TODO: binary equivalent */
|
||||
default: throw new Error("Unsupported encoding " + enc);
|
||||
}
|
||||
return Deno.writeFileSync(fname, payload);
|
||||
}
|
||||
var data = (enc == "utf8") ? utf8write(payload) : payload;
|
||||
if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
|
||||
if(typeof Blob !== 'undefined') {
|
||||
@ -3301,6 +3311,7 @@ document.body.removeChild(a);
|
||||
/* read binary data from file */
|
||||
function read_binary(path) {
|
||||
if(typeof _fs !== 'undefined') return _fs.readFileSync(path);
|
||||
if(typeof Deno !== 'undefined') return Deno.readFileSync(path);
|
||||
// $FlowIgnore
|
||||
if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
|
||||
// $FlowIgnore
|
||||
@ -3450,13 +3461,18 @@ function fuzzynum(s) {
|
||||
if(!isNaN(v = Number(ss))) return v / wt;
|
||||
return v;
|
||||
}
|
||||
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
|
||||
function fuzzydate(s) {
|
||||
var o = new Date(s), n = new Date(NaN);
|
||||
var y = o.getYear(), m = o.getMonth(), d = o.getDate();
|
||||
if(isNaN(d)) return n;
|
||||
var lower = s.toLowerCase();
|
||||
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) {
|
||||
lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
|
||||
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
|
||||
} else if(lower.match(/[a-z]/)) return n;
|
||||
if(y < 0 || y > 8099) return n;
|
||||
if((m > 0 || d > 1) && y != 101) return o;
|
||||
if(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
|
||||
if(s.match(/[^-0-9:,\/\\]/)) return n;
|
||||
return o;
|
||||
}
|
||||
@ -3531,7 +3547,7 @@ function getzipbin(zip, file, safe) {
|
||||
|
||||
function zipentries(zip) {
|
||||
var k = zip.FullPaths || keys(zip.files), o = [];
|
||||
for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
|
||||
for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i].replace(/^Root Entry[\/]/, ""));
|
||||
return o.sort();
|
||||
}
|
||||
|
||||
@ -3906,7 +3922,7 @@ if(has_buf) {
|
||||
}
|
||||
|
||||
/* from js-xls */
|
||||
if(typeof cptable !== 'undefined') {
|
||||
function cpdoit() {
|
||||
__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };
|
||||
__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };
|
||||
__lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : "";};
|
||||
@ -3915,6 +3931,7 @@ if(typeof cptable !== 'undefined') {
|
||||
__lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : "";};
|
||||
__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
|
||||
}
|
||||
if(typeof cptable !== 'undefined') cpdoit();
|
||||
|
||||
var __readUInt8 = function(b, idx) { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };
|
||||
@ -8041,7 +8058,7 @@ var SYLK = (function() {
|
||||
case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
|
||||
case 'e': o += cell.w || cell.v; break;
|
||||
case 'd': o += '"' + (cell.w || cell.v) + '"'; break;
|
||||
case 's': o += '"' + cell.v.replace(/"/g,"") + '"'; break;
|
||||
case 's': o += '"' + cell.v.replace(/"/g,"").replace(/;/g, ";;") + '"'; break;
|
||||
}
|
||||
return o;
|
||||
}
|
||||
@ -17444,19 +17461,19 @@ Workbook.WBProps.date1904 = true;
|
||||
break;
|
||||
case 'header' /*case 'Header'*/:
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
|
||||
cursheet['!margins'].header = parsexmltag(Rn[0]).Margin;
|
||||
if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].header = +parsexmltag(Rn[0]).Margin;
|
||||
break;
|
||||
case 'footer' /*case 'Footer'*/:
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
|
||||
cursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;
|
||||
if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].footer = +parsexmltag(Rn[0]).Margin;
|
||||
break;
|
||||
case 'pagemargins' /*case 'PageMargins'*/:
|
||||
var pagemargins = parsexmltag(Rn[0]);
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');
|
||||
if(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;
|
||||
if(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;
|
||||
if(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;
|
||||
if(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;
|
||||
if(!isNaN(+pagemargins.Top)) cursheet['!margins'].top = +pagemargins.Top;
|
||||
if(!isNaN(+pagemargins.Left)) cursheet['!margins'].left = +pagemargins.Left;
|
||||
if(!isNaN(+pagemargins.Right)) cursheet['!margins'].right = +pagemargins.Right;
|
||||
if(!isNaN(+pagemargins.Bottom)) cursheet['!margins'].bottom = +pagemargins.Bottom;
|
||||
break;
|
||||
case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:
|
||||
if(!Workbook.Views) Workbook.Views = [];
|
||||
@ -22867,8 +22884,12 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
return write_zip_xlsxb(wb, opts);
|
||||
}
|
||||
|
||||
function write_zip_xlsxb(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
@ -22994,6 +23015,136 @@ f = "docProps/app.xml";
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
|
||||
function write_zip_xlsx(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
if(wb && wb.SSF) {
|
||||
make_ssf(SSF); SSF.load_table(wb.SSF);
|
||||
// $FlowIgnore
|
||||
opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
|
||||
opts.ssf = wb.SSF;
|
||||
}
|
||||
opts.rels = {}; opts.wbrels = {};
|
||||
opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;
|
||||
if(browser_has_Map) opts.revStrings = new Map();
|
||||
else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }
|
||||
var wbext = "xml";
|
||||
var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
|
||||
var ct = new_ct();
|
||||
fix_write_opts(opts = opts || {});
|
||||
var zip = zip_new();
|
||||
var f = "", rId = 0;
|
||||
|
||||
opts.cellXfs = [];
|
||||
get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
|
||||
|
||||
if(!wb.Props) wb.Props = {};
|
||||
|
||||
f = "docProps/core.xml";
|
||||
zip_add_file(zip, f, write_core_props(wb.Props, opts));
|
||||
ct.coreprops.push(f);
|
||||
add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
|
||||
|
||||
f = "docProps/app.xml";
|
||||
if(wb.Props && wb.Props.SheetNames){/* empty */}
|
||||
else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
|
||||
else {
|
||||
var _sn = [];
|
||||
for(var _i = 0; _i < wb.SheetNames.length; ++_i)
|
||||
if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
|
||||
wb.Props.SheetNames = _sn;
|
||||
}
|
||||
wb.Props.Worksheets = wb.Props.SheetNames.length;
|
||||
zip_add_file(zip, f, write_ext_props(wb.Props, opts));
|
||||
ct.extprops.push(f);
|
||||
add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
|
||||
|
||||
if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
|
||||
f = "docProps/custom.xml";
|
||||
zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
|
||||
ct.custprops.push(f);
|
||||
add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
|
||||
}
|
||||
|
||||
for(rId=1;rId <= wb.SheetNames.length; ++rId) {
|
||||
var wsrels = {'!id':{}};
|
||||
var ws = wb.Sheets[wb.SheetNames[rId-1]];
|
||||
var _type = (ws || {})["!type"] || "sheet";
|
||||
switch(_type) {
|
||||
case "chart":
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
|
||||
if(ws) {
|
||||
var comments = ws['!comments'];
|
||||
var need_vml = false;
|
||||
if(comments && comments.length > 0) {
|
||||
var cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_comments_xml(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
}
|
||||
if(ws['!legacy']) {
|
||||
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
|
||||
}
|
||||
delete ws['!comments'];
|
||||
delete ws['!legacy'];
|
||||
}
|
||||
|
||||
if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
|
||||
}
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst_xml(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_xml(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
/* TODO: something more intelligent with themes */
|
||||
|
||||
f = "xl/theme/theme1.xml";
|
||||
zip_add_file(zip, f, write_theme(wb.Themes, opts));
|
||||
ct.themes.push(f);
|
||||
add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
|
||||
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty_xml(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
if(wb.vbaraw && vbafmt) {
|
||||
f = "xl/vbaProject.bin";
|
||||
zip_add_file(zip, f, wb.vbaraw);
|
||||
ct.vba.push(f);
|
||||
add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
|
||||
}
|
||||
|
||||
zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
|
||||
zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
|
||||
zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
|
||||
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
function firstbyte(f,o) {
|
||||
var x = "";
|
||||
switch((o||{}).type || "base64") {
|
||||
@ -23063,12 +23214,13 @@ function readSync(data, opts) {
|
||||
reset_cp();
|
||||
var o = opts||{};
|
||||
if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o));
|
||||
if(typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && !o.type) o.type = typeof Deno !== "undefined" ? "buffer" : "array";
|
||||
var d = data, n = [0,0,0,0], str = false;
|
||||
if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
|
||||
_ssfopts = {};
|
||||
if(o.dateNF) _ssfopts.dateNF = o.dateNF;
|
||||
if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
|
||||
if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); }
|
||||
if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); if(typeof Uint8Array !== 'undefined' && !has_buf) o.type = "array"; }
|
||||
if(o.type == "string") { str = true; o.type = "binary"; o.codepage = 65001; d = bstrify(data); }
|
||||
if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
|
||||
// $FlowIgnore
|
||||
@ -23147,6 +23299,14 @@ function write_cfb_ctr(cfb, o) {
|
||||
function write_zip_type(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_typeXLSX(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip_xlsx(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_denouement(z, o) {
|
||||
var oopts = {};
|
||||
if(o.compression) oopts.compression = 'DEFLATE';
|
||||
if(o.password) oopts.type = has_buf ? "nodebuffer" : "string";
|
||||
@ -23158,7 +23318,13 @@ function write_zip_type(wb, opts) {
|
||||
case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break;
|
||||
default: throw new Error("Unrecognized type " + o.type);
|
||||
}
|
||||
var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type}) : z.generate(oopts);
|
||||
var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type, compression: !!o.compression}) : z.generate(oopts);
|
||||
if(typeof Deno !== "undefined") {
|
||||
if(typeof out == "string") {
|
||||
if(o.type == "binary" || o.type == "base64") return out;
|
||||
out = new Uint8Array(s2ab(out));
|
||||
}
|
||||
}
|
||||
/*jshint -W083 */
|
||||
if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef
|
||||
/*jshint +W083 */
|
||||
@ -23182,6 +23348,7 @@ function write_string_type(out, opts, bom) {
|
||||
case "file": return write_dl(opts.file, o, 'utf8');
|
||||
case "buffer": {
|
||||
if(has_buf) return Buffer_from(o, 'utf8');
|
||||
else if(typeof TextEncoder !== "undefined") return new TextEncoder().encode(o);
|
||||
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
|
||||
}
|
||||
}
|
||||
@ -23218,6 +23385,15 @@ function write_binary_type(out, opts) {
|
||||
}
|
||||
}
|
||||
|
||||
function writeSyncXLSX(wb, opts) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
var o = dup(opts||{});
|
||||
if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
|
||||
if(o.type == "array") { o.type = "binary"; var out = (writeSyncXLSX(wb, o)); o.type = "array"; return s2ab(out); }
|
||||
return write_zip_typeXLSX(wb, o);
|
||||
}
|
||||
|
||||
function writeSync(wb, opts) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
@ -23278,6 +23454,14 @@ function writeFileSync(wb, filename, opts) {
|
||||
return writeSync(wb, o);
|
||||
}
|
||||
|
||||
function writeFileSyncXLSX(wb, filename, opts) {
|
||||
var o = opts||{}; o.type = 'file';
|
||||
o.file = filename;
|
||||
resolve_book_type(o);
|
||||
return writeSyncXLSX(wb, o);
|
||||
}
|
||||
|
||||
|
||||
function writeFileAsync(filename, wb, opts, cb) {
|
||||
var o = opts||{}; o.type = 'file';
|
||||
o.file = filename;
|
||||
@ -23534,10 +23718,6 @@ var utils = {
|
||||
decode_cell: decode_cell,
|
||||
decode_range: decode_range,
|
||||
format_cell: format_cell,
|
||||
get_formulae: sheet_to_formulae,
|
||||
make_csv: sheet_to_csv,
|
||||
make_json: sheet_to_json,
|
||||
make_formulae: sheet_to_formulae,
|
||||
sheet_add_aoa: sheet_add_aoa,
|
||||
sheet_add_json: sheet_add_json,
|
||||
sheet_add_dom: sheet_add_dom,
|
||||
@ -23804,6 +23984,8 @@ XLSX.writeFile = writeFileSync;
|
||||
XLSX.writeFileSync = writeFileSync;
|
||||
XLSX.writeFileAsync = writeFileAsync;
|
||||
XLSX.utils = utils;
|
||||
XLSX.writeXLSX = writeSyncXLSX;
|
||||
XLSX.writeFileXLSX = writeFileSyncXLSX;
|
||||
XLSX.SSF = SSF;
|
||||
if(typeof CFB !== "undefined") XLSX.CFB = CFB;
|
||||
}
|
||||
|
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
220
dist/xlsx.js
generated
vendored
220
dist/xlsx.js
generated
vendored
@ -4,7 +4,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
|
||||
var XLSX = {};
|
||||
function make_xlsx_lib(XLSX){
|
||||
XLSX.version = '0.18.0';
|
||||
XLSX.version = '0.18.1';
|
||||
var current_codepage = 1200, current_ansi = 1252;
|
||||
/*global cptable:true, window */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -199,7 +199,7 @@ function utf8decode(content) {
|
||||
o[widx++] = (128|(c&63));
|
||||
} else if(c >= 0xD800 && c < 0xE000) {
|
||||
c = (c&1023)+64;
|
||||
var d = str.charCodeAt(++ridx)&1023;
|
||||
var d = content.charCodeAt(++ridx)&1023;
|
||||
o[widx++] = (240|((c>>8)&7));
|
||||
o[widx++] = (128|((c>>2)&63));
|
||||
o[widx++] = (128|((d>>6)&15)|((c&3)<<4));
|
||||
@ -3111,6 +3111,16 @@ function blobify(data) {
|
||||
function write_dl(fname, payload, enc) {
|
||||
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
|
||||
if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
|
||||
if(typeof Deno !== 'undefined') {
|
||||
/* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */
|
||||
if(enc) switch(enc) {
|
||||
case "utf8": payload = new TextEncoder(enc).encode(payload); break;
|
||||
case "binary": payload = s2ab(payload); break;
|
||||
/* TODO: binary equivalent */
|
||||
default: throw new Error("Unsupported encoding " + enc);
|
||||
}
|
||||
return Deno.writeFileSync(fname, payload);
|
||||
}
|
||||
var data = (enc == "utf8") ? utf8write(payload) : payload;
|
||||
if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
|
||||
if(typeof Blob !== 'undefined') {
|
||||
@ -3145,6 +3155,7 @@ document.body.removeChild(a);
|
||||
/* read binary data from file */
|
||||
function read_binary(path) {
|
||||
if(typeof _fs !== 'undefined') return _fs.readFileSync(path);
|
||||
if(typeof Deno !== 'undefined') return Deno.readFileSync(path);
|
||||
// $FlowIgnore
|
||||
if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
|
||||
// $FlowIgnore
|
||||
@ -3294,13 +3305,18 @@ function fuzzynum(s) {
|
||||
if(!isNaN(v = Number(ss))) return v / wt;
|
||||
return v;
|
||||
}
|
||||
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
|
||||
function fuzzydate(s) {
|
||||
var o = new Date(s), n = new Date(NaN);
|
||||
var y = o.getYear(), m = o.getMonth(), d = o.getDate();
|
||||
if(isNaN(d)) return n;
|
||||
var lower = s.toLowerCase();
|
||||
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) {
|
||||
lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
|
||||
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
|
||||
} else if(lower.match(/[a-z]/)) return n;
|
||||
if(y < 0 || y > 8099) return n;
|
||||
if((m > 0 || d > 1) && y != 101) return o;
|
||||
if(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
|
||||
if(s.match(/[^-0-9:,\/\\]/)) return n;
|
||||
return o;
|
||||
}
|
||||
@ -3375,7 +3391,7 @@ function getzipbin(zip, file, safe) {
|
||||
|
||||
function zipentries(zip) {
|
||||
var k = zip.FullPaths || keys(zip.files), o = [];
|
||||
for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
|
||||
for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i].replace(/^Root Entry[\/]/, ""));
|
||||
return o.sort();
|
||||
}
|
||||
|
||||
@ -3750,7 +3766,7 @@ if(has_buf) {
|
||||
}
|
||||
|
||||
/* from js-xls */
|
||||
if(typeof cptable !== 'undefined') {
|
||||
function cpdoit() {
|
||||
__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };
|
||||
__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };
|
||||
__lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : "";};
|
||||
@ -3759,6 +3775,7 @@ if(typeof cptable !== 'undefined') {
|
||||
__lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : "";};
|
||||
__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
|
||||
}
|
||||
if(typeof cptable !== 'undefined') cpdoit();
|
||||
|
||||
var __readUInt8 = function(b, idx) { return b[idx]; };
|
||||
var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };
|
||||
@ -7885,7 +7902,7 @@ var SYLK = (function() {
|
||||
case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
|
||||
case 'e': o += cell.w || cell.v; break;
|
||||
case 'd': o += '"' + (cell.w || cell.v) + '"'; break;
|
||||
case 's': o += '"' + cell.v.replace(/"/g,"") + '"'; break;
|
||||
case 's': o += '"' + cell.v.replace(/"/g,"").replace(/;/g, ";;") + '"'; break;
|
||||
}
|
||||
return o;
|
||||
}
|
||||
@ -17288,19 +17305,19 @@ Workbook.WBProps.date1904 = true;
|
||||
break;
|
||||
case 'header' /*case 'Header'*/:
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
|
||||
cursheet['!margins'].header = parsexmltag(Rn[0]).Margin;
|
||||
if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].header = +parsexmltag(Rn[0]).Margin;
|
||||
break;
|
||||
case 'footer' /*case 'Footer'*/:
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
|
||||
cursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;
|
||||
if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].footer = +parsexmltag(Rn[0]).Margin;
|
||||
break;
|
||||
case 'pagemargins' /*case 'PageMargins'*/:
|
||||
var pagemargins = parsexmltag(Rn[0]);
|
||||
if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');
|
||||
if(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;
|
||||
if(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;
|
||||
if(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;
|
||||
if(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;
|
||||
if(!isNaN(+pagemargins.Top)) cursheet['!margins'].top = +pagemargins.Top;
|
||||
if(!isNaN(+pagemargins.Left)) cursheet['!margins'].left = +pagemargins.Left;
|
||||
if(!isNaN(+pagemargins.Right)) cursheet['!margins'].right = +pagemargins.Right;
|
||||
if(!isNaN(+pagemargins.Bottom)) cursheet['!margins'].bottom = +pagemargins.Bottom;
|
||||
break;
|
||||
case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:
|
||||
if(!Workbook.Views) Workbook.Views = [];
|
||||
@ -22711,8 +22728,12 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
|
||||
}
|
||||
|
||||
function write_zip(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(opts.bookType == "ods") return write_ods(wb, opts);
|
||||
return write_zip_xlsxb(wb, opts);
|
||||
}
|
||||
|
||||
function write_zip_xlsxb(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
@ -22838,6 +22859,136 @@ f = "docProps/app.xml";
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
|
||||
function write_zip_xlsx(wb, opts) {
|
||||
_shapeid = 1024;
|
||||
if(wb && !wb.SSF) {
|
||||
wb.SSF = SSF.get_table();
|
||||
}
|
||||
if(wb && wb.SSF) {
|
||||
make_ssf(SSF); SSF.load_table(wb.SSF);
|
||||
// $FlowIgnore
|
||||
opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
|
||||
opts.ssf = wb.SSF;
|
||||
}
|
||||
opts.rels = {}; opts.wbrels = {};
|
||||
opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;
|
||||
if(browser_has_Map) opts.revStrings = new Map();
|
||||
else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }
|
||||
var wbext = "xml";
|
||||
var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
|
||||
var ct = new_ct();
|
||||
fix_write_opts(opts = opts || {});
|
||||
var zip = zip_new();
|
||||
var f = "", rId = 0;
|
||||
|
||||
opts.cellXfs = [];
|
||||
get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
|
||||
|
||||
if(!wb.Props) wb.Props = {};
|
||||
|
||||
f = "docProps/core.xml";
|
||||
zip_add_file(zip, f, write_core_props(wb.Props, opts));
|
||||
ct.coreprops.push(f);
|
||||
add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
|
||||
|
||||
f = "docProps/app.xml";
|
||||
if(wb.Props && wb.Props.SheetNames){/* empty */}
|
||||
else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
|
||||
else {
|
||||
var _sn = [];
|
||||
for(var _i = 0; _i < wb.SheetNames.length; ++_i)
|
||||
if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
|
||||
wb.Props.SheetNames = _sn;
|
||||
}
|
||||
wb.Props.Worksheets = wb.Props.SheetNames.length;
|
||||
zip_add_file(zip, f, write_ext_props(wb.Props, opts));
|
||||
ct.extprops.push(f);
|
||||
add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
|
||||
|
||||
if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
|
||||
f = "docProps/custom.xml";
|
||||
zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
|
||||
ct.custprops.push(f);
|
||||
add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
|
||||
}
|
||||
|
||||
for(rId=1;rId <= wb.SheetNames.length; ++rId) {
|
||||
var wsrels = {'!id':{}};
|
||||
var ws = wb.Sheets[wb.SheetNames[rId-1]];
|
||||
var _type = (ws || {})["!type"] || "sheet";
|
||||
switch(_type) {
|
||||
case "chart":
|
||||
/* falls through */
|
||||
default:
|
||||
f = "xl/worksheets/sheet" + rId + "." + wbext;
|
||||
zip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels));
|
||||
ct.sheets.push(f);
|
||||
add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
|
||||
}
|
||||
|
||||
if(ws) {
|
||||
var comments = ws['!comments'];
|
||||
var need_vml = false;
|
||||
if(comments && comments.length > 0) {
|
||||
var cf = "xl/comments" + rId + "." + wbext;
|
||||
zip_add_file(zip, cf, write_comments_xml(comments, opts));
|
||||
ct.comments.push(cf);
|
||||
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
|
||||
need_vml = true;
|
||||
}
|
||||
if(ws['!legacy']) {
|
||||
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
|
||||
}
|
||||
delete ws['!comments'];
|
||||
delete ws['!legacy'];
|
||||
}
|
||||
|
||||
if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
|
||||
}
|
||||
|
||||
if(opts.Strings != null && opts.Strings.length > 0) {
|
||||
f = "xl/sharedStrings." + wbext;
|
||||
zip_add_file(zip, f, write_sst_xml(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_xml(wb, opts));
|
||||
ct.workbooks.push(f);
|
||||
add_rels(opts.rels, 1, f, RELS.WB);
|
||||
|
||||
/* TODO: something more intelligent with themes */
|
||||
|
||||
f = "xl/theme/theme1.xml";
|
||||
zip_add_file(zip, f, write_theme(wb.Themes, opts));
|
||||
ct.themes.push(f);
|
||||
add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
|
||||
|
||||
/* TODO: something more intelligent with styles */
|
||||
|
||||
f = "xl/styles." + wbext;
|
||||
zip_add_file(zip, f, write_sty_xml(wb, opts));
|
||||
ct.styles.push(f);
|
||||
add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
|
||||
|
||||
if(wb.vbaraw && vbafmt) {
|
||||
f = "xl/vbaProject.bin";
|
||||
zip_add_file(zip, f, wb.vbaraw);
|
||||
ct.vba.push(f);
|
||||
add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
|
||||
}
|
||||
|
||||
zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
|
||||
zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
|
||||
zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
|
||||
|
||||
delete opts.revssf; delete opts.ssf;
|
||||
return zip;
|
||||
}
|
||||
|
||||
function firstbyte(f,o) {
|
||||
var x = "";
|
||||
switch((o||{}).type || "base64") {
|
||||
@ -22907,12 +23058,13 @@ function readSync(data, opts) {
|
||||
reset_cp();
|
||||
var o = opts||{};
|
||||
if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o));
|
||||
if(typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && !o.type) o.type = typeof Deno !== "undefined" ? "buffer" : "array";
|
||||
var d = data, n = [0,0,0,0], str = false;
|
||||
if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
|
||||
_ssfopts = {};
|
||||
if(o.dateNF) _ssfopts.dateNF = o.dateNF;
|
||||
if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
|
||||
if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); }
|
||||
if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); if(typeof Uint8Array !== 'undefined' && !has_buf) o.type = "array"; }
|
||||
if(o.type == "string") { str = true; o.type = "binary"; o.codepage = 65001; d = bstrify(data); }
|
||||
if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
|
||||
// $FlowIgnore
|
||||
@ -22991,6 +23143,14 @@ function write_cfb_ctr(cfb, o) {
|
||||
function write_zip_type(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_typeXLSX(wb, opts) {
|
||||
var o = dup(opts||{});
|
||||
var z = write_zip_xlsx(wb, o);
|
||||
return write_zip_denouement(z, o);
|
||||
}
|
||||
function write_zip_denouement(z, o) {
|
||||
var oopts = {};
|
||||
if(o.compression) oopts.compression = 'DEFLATE';
|
||||
if(o.password) oopts.type = has_buf ? "nodebuffer" : "string";
|
||||
@ -23002,7 +23162,13 @@ function write_zip_type(wb, opts) {
|
||||
case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break;
|
||||
default: throw new Error("Unrecognized type " + o.type);
|
||||
}
|
||||
var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type}) : z.generate(oopts);
|
||||
var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type, compression: !!o.compression}) : z.generate(oopts);
|
||||
if(typeof Deno !== "undefined") {
|
||||
if(typeof out == "string") {
|
||||
if(o.type == "binary" || o.type == "base64") return out;
|
||||
out = new Uint8Array(s2ab(out));
|
||||
}
|
||||
}
|
||||
/*jshint -W083 */
|
||||
if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef
|
||||
/*jshint +W083 */
|
||||
@ -23026,6 +23192,7 @@ function write_string_type(out, opts, bom) {
|
||||
case "file": return write_dl(opts.file, o, 'utf8');
|
||||
case "buffer": {
|
||||
if(has_buf) return Buffer_from(o, 'utf8');
|
||||
else if(typeof TextEncoder !== "undefined") return new TextEncoder().encode(o);
|
||||
else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
|
||||
}
|
||||
}
|
||||
@ -23062,6 +23229,15 @@ function write_binary_type(out, opts) {
|
||||
}
|
||||
}
|
||||
|
||||
function writeSyncXLSX(wb, opts) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
var o = dup(opts||{});
|
||||
if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
|
||||
if(o.type == "array") { o.type = "binary"; var out = (writeSyncXLSX(wb, o)); o.type = "array"; return s2ab(out); }
|
||||
return write_zip_typeXLSX(wb, o);
|
||||
}
|
||||
|
||||
function writeSync(wb, opts) {
|
||||
reset_cp();
|
||||
check_wb(wb);
|
||||
@ -23122,6 +23298,14 @@ function writeFileSync(wb, filename, opts) {
|
||||
return writeSync(wb, o);
|
||||
}
|
||||
|
||||
function writeFileSyncXLSX(wb, filename, opts) {
|
||||
var o = opts||{}; o.type = 'file';
|
||||
o.file = filename;
|
||||
resolve_book_type(o);
|
||||