version bump 0.18.8: dateless meridien time values

This commit is contained in:
SheetJS 2022-05-22 19:51:41 -04:00
parent b7d3eae3b7
commit 2022f7f4b0
51 changed files with 1337 additions and 3059 deletions

@ -8,6 +8,7 @@ index.html
misc/ misc/
node_modules node_modules
*.tgz *.tgz
*.jsx
_book _book
book.json book.json
tmp tmp

@ -4,6 +4,11 @@ This log is intended to keep track of backwards-incompatible changes, including
but not limited to API changes and file location changes. Minor behavioral 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. changes may not be included if they are not expected to break existing code.
## v0.18.8
* Plaintext parsing of dateless meridien time values (`1:23:45 PM`)
* Legacy format (SYLK / WK# / Multiplan) minutiae
## v0.18.7 ## v0.18.7
* Normalized handling of `\r` and `\n` newline characters * Normalized handling of `\r` and `\n` newline characters

@ -9,7 +9,7 @@ HTMLLINT=index.html
MINITGT=xlsx.mini.js MINITGT=xlsx.mini.js
MINIFLOW=xlsx.mini.flow.js MINIFLOW=xlsx.mini.flow.js
MINIDEPS=$(shell cat mini.lst) MINIDEPS=$(shell cat misc/mini.lst)
ESMJSTGT=xlsx.mjs ESMJSTGT=xlsx.mjs
ESMJSDEPS=$(shell cat misc/mjs.lst) ESMJSDEPS=$(shell cat misc/mjs.lst)
@ -70,7 +70,6 @@ init: ## Initial setup for development
git submodule init git submodule init
git submodule update git submodule update
#git submodule foreach git pull origin master #git submodule foreach git pull origin master
#git submodule foreach make
git submodule foreach make all git submodule foreach make all
mkdir -p tmp mkdir -p tmp
@ -116,6 +115,10 @@ bytes: ## Display minified and gzipped file sizes
@for i in $(BYTEFILER); do npx printj "%-30s %7d" $$i $$(wc -c < $$i); done @for i in $(BYTEFILER); do npx printj "%-30s %7d" $$i $$(wc -c < $$i); done
.PHONY: git
git: ## show version string
@echo "$$(node -pe 'require("./package.json").version')"
.PHONY: nexe .PHONY: nexe
nexe: xlsx.exe ## Build nexe standalone executable nexe: xlsx.exe ## Build nexe standalone executable

@ -1,6 +1,6 @@
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){

@ -1 +1 @@
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';

@ -2,10 +2,6 @@ var current_codepage = 1200, current_ansi = 1252;
/*:: declare var cptable:any; */ /*:: declare var cptable:any; */
/*global cptable:true, window */ /*global cptable:true, window */
var $cptable; var $cptable;
if(typeof cptable !== 'undefined') $cptable = cptable;
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
$cptable = require('./dist/cpexcel.js');
}
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -61,7 +57,9 @@ var debom = function(data/*:string*/)/*:string*/ {
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
if(typeof $cptable !== 'undefined') {
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); }; set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
debom = function(data/*:string*/) { debom = function(data/*:string*/) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); } if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
@ -74,4 +72,5 @@ if(typeof $cptable !== 'undefined') {
_getansi = function _ga2(x/*:number*/)/*:string*/ { _getansi = function _ga2(x/*:number*/)/*:string*/ {
return $cptable.utils.decode(current_ansi, [x])[0]; return $cptable.utils.decode(current_ansi, [x])[0];
}; };
cpdoit();
} }

@ -220,7 +220,7 @@ function parse_extra_field(blob/*:CFBlob*/)/*:any*/ {
return o; return o;
} }
var fs/*:: = require('fs'); */; var fs/*:: = require('fs'); */;
function get_fs() { return fs || (fs = require('fs')); } function get_fs() { return fs || (fs = _fs); }
function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);

@ -1,5 +1,5 @@
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {

@ -156,16 +156,34 @@ function fuzzynum(s/*:string*/)/*:number*/ {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) /*:Date*/ {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s/*:string*/)/*:Date*/ { function fuzzydate(s/*:string*/)/*:Date*/ {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;

4
bits/26_cptable.js Normal file

@ -0,0 +1,4 @@
if(typeof cptable !== 'undefined') set_cptable(cptable);
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
set_cptable(require('./dist/cpexcel.js'));
}

@ -258,8 +258,8 @@ var _XLSIcv = /*#__PURE__*/ rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */

@ -177,45 +177,45 @@ var ct2type/*{[string]:string}*/ = ({
}/*:any*/); }/*:any*/);
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct()/*:any*/ { function new_ct()/*:any*/ {
@ -236,7 +236,7 @@ function parse_ct(data/*:?string*/) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -251,35 +251,37 @@ function parse_ct(data/*:?string*/) {
return ct; return ct;
} }
function write_ct(ct, opts)/*:string*/ { function write_ct(ct, opts, raw)/*:string*/ {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o/*:Array<string>*/ = [], v; var o/*:Array<string>*/ = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -324,6 +326,6 @@ function write_ct(ct, opts)/*:string*/ {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }

@ -249,7 +249,7 @@ function parse_PropertySet(blob, PIDSI) {
blob.l = start_addr + size; /* step ahead to skip padding */ blob.l = start_addr + size; /* step ahead to skip padding */
return PropH; return PropH;
} }
var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ];
function guess_property_type(val/*:any*/)/*:number*/ { function guess_property_type(val/*:any*/)/*:number*/ {
switch(typeof val) { switch(typeof val) {
case "boolean": return 0x0B; case "boolean": return 0x0B;

@ -428,9 +428,9 @@ var SYLK = /*#__PURE__*/(function() {
} break; } break;
case 'W': break; /* window */ case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'NN': { /* defined name */ case 'NN': { /* defined name */
var nn = {Sheet: 0}; var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
@ -509,7 +509,7 @@ var SYLK = /*#__PURE__*/(function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1), 10)-1; C = parseInt(record[rj].slice(1), 10)-1;
@ -529,6 +529,7 @@ var SYLK = /*#__PURE__*/(function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht, wb]; return [arr, sht, wb];
} }

@ -1,20 +1,27 @@
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId/*:number*/, comments) {
function write_comments_vml(rId/*:number*/, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid)/*:string*/ {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/; var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/;
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -22,9 +29,8 @@ function write_comments_vml(rId/*:number*/, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}/*:any*/); var shadata = ({on:"t", 'obscured':"t"}/*:any*/);
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -47,7 +53,5 @@ function write_comments_vml(rId/*:number*/, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }

@ -40,7 +40,7 @@ function slurp(RecordType, R, blob, length/*:number*/, opts)/*:any*/ {
var bufs = []; var bufs = [];
var d = blob.slice(blob.l,blob.l+l); var d = blob.slice(blob.l,blob.l+l);
if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {
case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002F /* FilePass */: case 0x0195 /* FileLock */: case 0x00E1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:
break; break;
case 0x0085 /* BoundSheet8 */: case 0x0085 /* BoundSheet8 */:
break; break;
@ -223,7 +223,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/; if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/;
else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/; else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/;
/*:: val = (val:any); */ /*:: val = (val:any); */
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* BOF */) continue;
switch(RecordType) { switch(RecordType) {
case 0x0022 /* Date1904 */: case 0x0022 /* Date1904 */:
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */

@ -238,7 +238,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) {
/* ... */ /* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"]); if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */ /* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); write_biff_rec(ba, 0x0200 /* Dimensions */, write_Dimensions(range, opts));
/* ... */ /* ... */
if(b8) ws['!links'] = []; if(b8) ws['!links'] = [];
@ -323,11 +323,11 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) {
var C = buf_array(); var C = buf_array();
/* METADATA [MTRSettings] [ForceFullCalculation] */ /* METADATA [MTRSettings] [ForceFullCalculation] */
if(b8) write_biff_rec(C, 0x008C, write_Country()); if(b8) write_biff_rec(C, 0x008C /* Country */, write_Country());
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
/* BIFF8: [SST *Continue] ExtSST */ /* BIFF8: [SST *Continue] ExtSST */
if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); if(b8 && opts.Strings) write_biff_continue(C, 0x00FC /* SST */, write_SST(opts.Strings, opts));
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
write_biff_rec(C, 0x000A /* EOF */); write_biff_rec(C, 0x000A /* EOF */);
@ -387,7 +387,7 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
if(!ws || !ws["!ref"]) continue; if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]); var range = decode_range(ws["!ref"]);
if(range.e.c > 255) { // note: 255 is IV if(range.e.c > 255) { // note: 255 is IV
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
} }
} }

@ -1,5 +1,4 @@
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -78,7 +77,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -134,7 +133,6 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
} }
function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -227,7 +225,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];

@ -365,7 +365,7 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c; if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r; if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c; if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(ws["!ref"]); ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }

@ -124,5 +124,5 @@ var __stream = {
to_json: write_json_stream, to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream, to_csv: write_csv_stream,
set_readable: set_readable set_readable: set_readable
}; };

@ -16,4 +16,5 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = require('stream'); var strmod = require('stream');
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = require('fs'); } catch(e) {}
} }

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

File diff suppressed because one or more lines are too long

412
dist/xlsx.extendscript.js generated vendored

@ -157,17 +157,13 @@ var DO_NOT_EXPORT_CODEPAGE = true;
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */ /*global cptable:true, window */
var $cptable; var $cptable;
if(typeof cptable !== 'undefined') $cptable = cptable;
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
$cptable = undefined;
}
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -223,7 +219,9 @@ var debom = function(data) {
var _getchar = function _gc1(x) { return String.fromCharCode(x); }; var _getchar = function _gc1(x) { return String.fromCharCode(x); };
var _getansi = function _ga1(x) { return String.fromCharCode(x); }; var _getansi = function _ga1(x) { return String.fromCharCode(x); };
if(typeof $cptable !== 'undefined') {
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp) { current_codepage = cp; set_ansi(cp); }; set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
debom = function(data) { debom = function(data) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); } if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
@ -236,6 +234,7 @@ if(typeof $cptable !== 'undefined') {
_getansi = function _ga2(x) { _getansi = function _ga2(x) {
return $cptable.utils.decode(current_ansi, [x])[0]; return $cptable.utils.decode(current_ansi, [x])[0];
}; };
cpdoit();
} }
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
@ -1645,7 +1644,7 @@ function parse_extra_field(blob) {
return o; return o;
} }
var fs; var fs;
function get_fs() { return fs || (fs = undefined); } function get_fs() { return fs || (fs = _fs); }
function parse(file, options) { function parse(file, options) {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -3271,7 +3270,7 @@ return exports;
})(); })();
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = undefined; } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3494,16 +3493,34 @@ function fuzzynum(s) {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s) { function fuzzydate(s) {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4268,6 +4285,10 @@ function encode_range_xls(r, opts) {
} }
return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff); return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
} }
if(typeof cptable !== 'undefined') set_cptable(cptable);
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
set_cptable(undefined);
}
function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; } function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }
function encode_row(row) { return "" + (row + 1); } function encode_row(row) { return "" + (row + 1); }
function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); } function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
@ -5003,8 +5024,8 @@ var _XLSIcv = rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -5228,45 +5249,45 @@ var ct2type/*{[string]:string}*/ = ({
}); });
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct() { function new_ct() {
@ -5287,7 +5308,7 @@ function parse_ct(data) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -5302,35 +5323,37 @@ function parse_ct(data) {
return ct; return ct;
} }
function write_ct(ct, opts) { function write_ct(ct, opts, raw) {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o = [], v; var o = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -5375,7 +5398,7 @@ function write_ct(ct, opts) {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -5410,10 +5433,10 @@ var RELS = ({
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata", XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment", TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person", PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject" VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
}); });
/* 9.3.3 Representing Relationships */ /* 9.3.3 Representing Relationships */
function get_rels_path(file) { function get_rels_path(file) {
var n = file.lastIndexOf("/"); var n = file.lastIndexOf("/");
@ -6130,7 +6153,7 @@ function parse_PropertySet(blob, PIDSI) {
blob.l = start_addr + size; /* step ahead to skip padding */ blob.l = start_addr + size; /* step ahead to skip padding */
return PropH; return PropH;
} }
var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ];
function guess_property_type(val) { function guess_property_type(val) {
switch(typeof val) { switch(typeof val) {
case "boolean": return 0x0B; case "boolean": return 0x0B;
@ -8008,7 +8031,7 @@ var SYLK = (function() {
var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; }; var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; };
var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); }; var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };
sylk_escapes["|"] = 254; sylk_escapes["|"] = 254;
/* TODO: find an actual specification */ /* https://oss.sheetjs.com/notes/sylk/ for more details */
function sylk_to_aoa(d, opts) { function sylk_to_aoa(d, opts) {
switch(opts.type) { switch(opts.type) {
case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts); case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts);
@ -8024,6 +8047,7 @@ var SYLK = (function() {
var next_cell_format = null; var next_cell_format = null;
var sht = {}, rowinfo = [], colinfo = [], cw = []; var sht = {}, rowinfo = [], colinfo = [], cw = [];
var Mval = 0, j; var Mval = 0, j;
var wb = { Workbook: { WBProps: {}, Names: [] } };
if(+opts.codepage >= 0) set_cp(+opts.codepage); if(+opts.codepage >= 0) set_cp(+opts.codepage);
for (; ri !== records.length; ++ri) { for (; ri !== records.length; ++ri) {
Mval = 0; Mval = 0;
@ -8034,19 +8058,34 @@ var SYLK = (function() {
case 'ID': break; /* header */ case 'ID': break; /* header */
case 'E': break; /* EOF */ case 'E': break; /* EOF */
case 'B': break; /* dimensions */ case 'B': break; /* dimensions */
case 'O': break; /* options? */ case 'O': /* workbook options */
case 'W': break; /* window? */ for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'V': {
var d1904 = parseInt(record[rj].slice(1), 10);
// NOTE: it is technically an error if d1904 >= 5 or < 0
if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true;
} break;
} break;
case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'C': case 'NN': { /* defined name */
var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'N': nn.Name = record[rj].slice(1); break;
case 'E': nn.Ref = (opts && opts.sheet || "Sheet1") + "!" + rc_to_a1(record[rj].slice(1)); break;
}
wb.Workbook.Names.push(nn);
} break;
case 'C': /* cell */
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0;
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'K': case 'K':
@ -8056,7 +8095,7 @@ var SYLK = (function() {
else if(val === 'FALSE') val = false; else if(val === 'FALSE') val = false;
else if(!isNaN(fuzzynum(val))) { else if(!isNaN(fuzzynum(val))) {
val = fuzzynum(val); val = fuzzynum(val);
if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val);
} else if(!isNaN(fuzzydate(val).getDate())) { } else if(!isNaN(fuzzydate(val).getDate())) {
val = parseDate(val); val = parseDate(val);
} }
@ -8073,8 +8112,8 @@ var SYLK = (function() {
arr[R][C] = [arr[R][C], "S5S"]; arr[R][C] = [arr[R][C], "S5S"];
break; break;
case 'G': break; // unknown case 'G': break; // unknown
case 'R': _R = parseInt(record[rj].slice(1))-1; break; case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break;
case 'C': _C = parseInt(record[rj].slice(1))-1; break; case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break;
default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
} }
if(C_seen_K) { if(C_seen_K) {
@ -8089,19 +8128,19 @@ var SYLK = (function() {
arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C}); arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
} }
break; break;
case 'F': case 'F': /* Format */
var F_seen = 0; var F_seen = 0;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break;
case 'F': break; /* ??? */ case 'F': break; /* ??? */
case 'G': break; /* hide grid */ case 'G': break; /* hide grid */
case 'P': case 'P':
next_cell_format = formats[parseInt(record[rj].slice(1))]; next_cell_format = formats[parseInt(record[rj].slice(1), 10)];
break; break;
case 'S': break; /* cell style */ case 'S': break; /* cell style */
case 'D': break; /* column */ case 'D': break; /* column */
@ -8110,14 +8149,14 @@ var SYLK = (function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1))-1; C = parseInt(record[rj].slice(1), 10)-1;
if(!colinfo[C]) colinfo[C] = {}; if(!colinfo[C]) colinfo[C] = {};
break; break;
case 'R': /* row properties */ case 'R': /* row properties */
R = parseInt(record[rj].slice(1))-1; R = parseInt(record[rj].slice(1), 10)-1;
if(!rowinfo[R]) rowinfo[R] = {}; if(!rowinfo[R]) rowinfo[R] = {};
if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }
else if(Mval === 0) rowinfo[R].hidden = true; else if(Mval === 0) rowinfo[R].hidden = true;
@ -8130,20 +8169,21 @@ var SYLK = (function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht]; return [arr, sht, wb];
} }
function sylk_to_sheet(d, opts) { function sylk_to_workbook(d, opts) {
var aoasht = sylk_to_aoa(d, opts); var aoasht = sylk_to_aoa(d, opts);
var aoa = aoasht[0], ws = aoasht[1]; var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2];
var o = aoa_to_sheet(aoa, opts); var o = aoa_to_sheet(aoa, opts);
keys(ws).forEach(function(k) { o[k] = ws[k]; }); keys(ws).forEach(function(k) { o[k] = ws[k]; });
return o; var outwb = sheet_to_workbook(o, opts);
keys(wb).forEach(function(k) { outwb[k] = wb[k]; });
return outwb;
} }
function sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
function write_ws_cell_sylk(cell, ws, R, C) { function write_ws_cell_sylk(cell, ws, R, C) {
var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
switch(cell.t) { switch(cell.t) {
@ -8182,7 +8222,7 @@ var SYLK = (function() {
} }
function sheet_to_sylk(ws, opts) { function sheet_to_sylk(ws, opts) {
var preamble = ["ID;PWXL;N;E"], o = []; var preamble = ["ID;PSheetJS;N;E"], o = [];
var r = safe_decode_range(ws['!ref']), cell; var r = safe_decode_range(ws['!ref']), cell;
var dense = Array.isArray(ws); var dense = Array.isArray(ws);
var RS = "\r\n"; var RS = "\r\n";
@ -8206,7 +8246,6 @@ var SYLK = (function() {
return { return {
to_workbook: sylk_to_workbook, to_workbook: sylk_to_workbook,
to_sheet: sylk_to_sheet,
from_sheet: sheet_to_sylk from_sheet: sheet_to_sylk
}; };
})(); })();
@ -9048,16 +9087,88 @@ var WK_ = (function() {
]; */ ]; */
/* TODO: flesh out */ /* TODO: flesh out */
var FuncTab = { var FuncTab = {
0x1F: ["NA", 0],
// 0x20: ["ERR", 0],
0x21: ["ABS", 1],
0x22: ["TRUNC", 1],
0x23: ["SQRT", 1],
0x24: ["LOG", 1],
0x25: ["LN", 1],
0x26: ["PI", 0],
0x27: ["SIN", 1],
0x28: ["COS", 1],
0x29: ["TAN", 1],
0x2A: ["ATAN2", 2],
0x2B: ["ATAN", 1],
0x2C: ["ASIN", 1],
0x2D: ["ACOS", 1],
0x2E: ["EXP", 1],
0x2F: ["MOD", 2],
// 0x30
0x31: ["ISNA", 1],
0x32: ["ISERR", 1],
0x33: ["FALSE", 0], 0x33: ["FALSE", 0],
0x34: ["TRUE", 0], 0x34: ["TRUE", 0],
0x35: ["RAND", 0],
// 0x36 DATE
// 0x37 NOW
// 0x38 PMT
// 0x39 PV
// 0x3A FV
// 0x3B IF
// 0x3C DAY
// 0x3D MONTH
// 0x3E YEAR
0x3F: ["ROUND", 2],
// 0x40 TIME
// 0x41 HOUR
// 0x42 MINUTE
// 0x43 SECOND
0x44: ["ISNUMBER", 1],
0x45: ["ISTEXT", 1],
0x46: ["LEN", 1], 0x46: ["LEN", 1],
0x47: ["VALUE", 1],
// 0x48: ["FIXED", ?? 1],
0x49: ["MID", 3],
0x4A: ["CHAR", 1], 0x4A: ["CHAR", 1],
// 0x4B
// 0x4C FIND
// 0x4D DATEVALUE
// 0x4E TIMEVALUE
// 0x4F CELL
0x50: ["SUM", 69], 0x50: ["SUM", 69],
0x51: ["AVERAGEA", 69], 0x51: ["AVERAGEA", 69],
0x52: ["COUNTA", 69], 0x52: ["COUNTA", 69],
0x53: ["MINA", 69], 0x53: ["MINA", 69],
0x54: ["MAXA", 69], 0x54: ["MAXA", 69],
// 0x55 VLOOKUP
// 0x56 NPV
// 0x57 VAR
// 0x58 STD
// 0x59 IRR
// 0x5A HLOOKUP
// 0x5B DSUM
// 0x5C DAVERAGE
// 0x5D DCOUNTA
// 0x5E DMIN
// 0x5F DMAX
// 0x60 DVARP
// 0x61 DSTDEVP
// 0x62 INDEX
// 0x63 COLS
// 0x64 ROWS
// 0x65 REPEAT
0x66: ["UPPER", 1],
0x67: ["LOWER", 1],
// 0x68 LEFT
// 0x69 RIGHT
// 0x6A REPLACE
0x6B: ["PROPER", 1],
// 0x6C CELL
0x6D: ["TRIM", 1],
// 0x6E CLEAN
0x6F: ["T", 1] 0x6F: ["T", 1]
// 0x70 V
}; };
var BinOpTab = [ var BinOpTab = [
"", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs "", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
@ -9507,7 +9618,7 @@ var WK_ = (function() {
break; break;
case 0x02: /* EOF */ break outer; case 0x02: /* EOF */ break outer;
/* TODO: The behavior here should be consistent with Numbers: QP Notebook ~ .TN.SheetArchive, QP Sheet ~ .TST.TSTable */ /* TODO: The behavior here should be consistent with Numbers: QP Notebook ~ .TN.SheetArchive, QP Sheet ~ .TST.TableModelArchive */
case 0x0401: /* BON */ break; case 0x0401: /* BON */ break;
case 0x0402: /* EON */ /* TODO: backfill missing sheets based on BON cnt */ break; case 0x0402: /* EON */ /* TODO: backfill missing sheets based on BON cnt */ break;
@ -9540,7 +9651,7 @@ var WK_ = (function() {
type = p.read_shift(1); type = p.read_shift(1);
sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr'); sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr');
} }
if(!sname) sname = XLSX.utils.encode_col(sidx); if(!sname) sname = encode_col(sidx);
/* TODO: backfill empty sheets */ /* TODO: backfill empty sheets */
} break; } break;
case 0x0602: { /* EOS */ case 0x0602: { /* EOS */
@ -11943,22 +12054,29 @@ function parse_drawing(data, rels) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId, comments) {
function write_comments_vml(rId, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid) {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = {'color2':"#BEFF82", 'type':"gradient"}; var fillopts = {'color2':"#BEFF82", 'type':"gradient"};
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -11966,9 +12084,8 @@ function write_comments_vml(rId, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}); var shadata = ({on:"t", 'obscured':"t"});
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -11991,9 +12108,7 @@ function write_comments_vml(rId, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments, threaded, people) { function sheet_insert_comments(sheet, comments, threaded, people) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -18702,7 +18817,7 @@ function slurp(RecordType, R, blob, length, opts) {
var bufs = []; var bufs = [];
var d = blob.slice(blob.l,blob.l+l); var d = blob.slice(blob.l,blob.l+l);
if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {
case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002F /* FilePass */: case 0x0195 /* FileLock */: case 0x00E1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:
break; break;
case 0x0085 /* BoundSheet8 */: case 0x0085 /* BoundSheet8 */:
break; break;
@ -18884,7 +18999,7 @@ function parse_workbook(blob, options) {
var val = ({}); var val = ({});
if(RecordType === 0x000a /* EOF */) val = R.f(blob, length, opts); if(RecordType === 0x000a /* EOF */) val = R.f(blob, length, opts);
else val = slurp(RecordType, R, blob, length, opts); else val = slurp(RecordType, R, blob, length, opts);
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* BOF */) continue;
switch(RecordType) { switch(RecordType) {
case 0x0022 /* Date1904 */: case 0x0022 /* Date1904 */:
wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break; wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
@ -20704,6 +20819,16 @@ var XLSRecordEnum = {
0x08cb: { /* n:"CrtCoopt", */ }, 0x08cb: { /* n:"CrtCoopt", */ },
0x08d6: { /* n:"FRTArchId$", */ r:12 }, 0x08d6: { /* n:"FRTArchId$", */ r:12 },
/* --- multiplan 4 records --- */
0x0065: { /* n:"", */ }, // one per window
0x0066: { /* n:"", */ }, // calc settings
0x0069: { /* n:"", */ }, // print header
0x006a: { /* n:"", */ }, // print footer
0x006b: { /* n:"", */ }, // print settings
0x006d: { /* n:"", */ }, // one per window
0x0070: { /* n:"", */ }, // includes default col width
0x0072: { /* n:"", */ }, // includes selected cell
0x7262: {} 0x7262: {}
}; };
@ -20946,7 +21071,7 @@ function write_ws_biff8(idx, opts, wb) {
/* ... */ /* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"]); if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */ /* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); write_biff_rec(ba, 0x0200 /* Dimensions */, write_Dimensions(range, opts));
/* ... */ /* ... */
if(b8) ws['!links'] = []; if(b8) ws['!links'] = [];
@ -21031,11 +21156,11 @@ function write_biff8_global(wb, bufs, opts) {
var C = buf_array(); var C = buf_array();
/* METADATA [MTRSettings] [ForceFullCalculation] */ /* METADATA [MTRSettings] [ForceFullCalculation] */
if(b8) write_biff_rec(C, 0x008C, write_Country()); if(b8) write_biff_rec(C, 0x008C /* Country */, write_Country());
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
/* BIFF8: [SST *Continue] ExtSST */ /* BIFF8: [SST *Continue] ExtSST */
if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); if(b8 && opts.Strings) write_biff_continue(C, 0x00FC /* SST */, write_SST(opts.Strings, opts));
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
write_biff_rec(C, 0x000A /* EOF */); write_biff_rec(C, 0x000A /* EOF */);
@ -21095,7 +21220,7 @@ function write_biff_buf(wb, opts) {
if(!ws || !ws["!ref"]) continue; if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]); var range = decode_range(ws["!ref"]);
if(range.e.c > 255) { // note: 255 is IV if(range.e.c > 255) { // note: 255 is IV
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
} }
} }
@ -21295,7 +21420,7 @@ function sheet_add_dom(ws, table, _opts) {
if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) { if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) {
l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break;
} }
if(l && l.charAt(0) != "#") o.l = ({ Target: l }); if(l && l.charAt(0) != "#" && l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l });
if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }
else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; else ws[encode_cell({c:C + or_C, r:R + or_R})] = o;
if(range.e.c < C + or_C) range.e.c = C + or_C; if(range.e.c < C + or_C) range.e.c = C + or_C;
@ -21335,8 +21460,7 @@ function get_get_computed_style_function(element) {
// If it is not available, try to get one from the global namespace // If it is not available, try to get one from the global namespace
if(typeof getComputedStyle === 'function') return getComputedStyle; if(typeof getComputedStyle === 'function') return getComputedStyle;
return null; return null;
} }/* OpenDocument */
/* OpenDocument */
function parse_text_p(text) { function parse_text_p(text) {
/* 6.1.2 White Space Characters */ /* 6.1.2 White Space Characters */
var fixed = text var fixed = text
@ -23722,7 +23846,6 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
} }
function write_zip_xlsb(wb, opts) { function write_zip_xlsb(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23800,7 +23923,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -23856,7 +23979,6 @@ f = "docProps/app.xml";
} }
function write_zip_xlsx(wb, opts) { function write_zip_xlsx(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23948,7 +24070,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -24119,6 +24241,11 @@ function readSync(data, opts) {
case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break; case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break; case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break;
case 0x08: if(n[1] === 0xE7) throw new Error("Unsupported Multiplan 1.x file!"); break;
case 0x0C:
if(n[1] === 0xEC) throw new Error("Unsupported Multiplan 2.x file!");
if(n[1] === 0xED) throw new Error("Unsupported Multiplan 3.x file!");
break;
} }
if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
return read_prn(data, d, o, str); return read_prn(data, d, o, str);
@ -24686,6 +24813,12 @@ function sheet_set_array_formula(ws, range, formula, dynamic) {
if(dynamic) cell.D = true; if(dynamic) cell.D = true;
} }
} }
var wsr = decode_range(ws["!ref"]);
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -24855,7 +24988,7 @@ var __stream = {
to_json: write_json_stream, to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream, to_csv: write_csv_stream,
set_readable: set_readable set_readable: set_readable
}; };
if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb; if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
XLSX.parse_zip = parse_zip; XLSX.parse_zip = parse_zip;
@ -24875,6 +25008,7 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = undefined; var strmod = undefined;
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = undefined; } catch(e) {}
} }
} }
/*global define */ /*global define */

30
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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

@ -1,75 +0,0 @@
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 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
var CS2CP = ({
/*::[*/0/*::]*/: 1252, /* ANSI */
/*::[*/1/*::]*/: 65001, /* DEFAULT */
/*::[*/2/*::]*/: 65001, /* SYMBOL */
/*::[*/77/*::]*/: 10000, /* MAC */
/*::[*/128/*::]*/: 932, /* SHIFTJIS */
/*::[*/129/*::]*/: 949, /* HANGUL */
/*::[*/130/*::]*/: 1361, /* JOHAB */
/*::[*/134/*::]*/: 936, /* GB2312 */
/*::[*/136/*::]*/: 950, /* CHINESEBIG5 */
/*::[*/161/*::]*/: 1253, /* GREEK */
/*::[*/162/*::]*/: 1254, /* TURKISH */
/*::[*/163/*::]*/: 1258, /* VIETNAMESE */
/*::[*/177/*::]*/: 1255, /* HEBREW */
/*::[*/178/*::]*/: 1256, /* ARABIC */
/*::[*/186/*::]*/: 1257, /* BALTIC */
/*::[*/204/*::]*/: 1251, /* RUSSIAN */
/*::[*/222/*::]*/: 874, /* THAI */
/*::[*/238/*::]*/: 1250, /* EASTEUROPE */
/*::[*/255/*::]*/: 1252, /* OEM */
/*::[*/69/*::]*/: 6969 /* MISC */
}/*:any*/);
var set_ansi = function(cp/*:number*/) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };
function reset_ansi() { set_ansi(1252); }
var set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
function reset_cp() { set_cp(1200); reset_ansi(); }
function char_codes(data/*:string*/)/*:Array<number>*/ { var o/*:Array<number>*/ = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
function utf16leread(data/*:string*/)/*:string*/ {
var o/*:Array<string>*/ = [];
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));
return o.join("");
}
function utf16beread(data/*:string*/)/*:string*/ {
var o/*:Array<string>*/ = [];
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));
return o.join("");
}
var debom = function(data/*:string*/)/*:string*/ {
var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
if(c1 == 0xFEFF) return data.slice(1);
return data;
};
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var $cptable;
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
debom = function(data/*:string*/) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
return data;
};
_getchar = function _gc2(x/*:number*/)/*:string*/ {
if(current_codepage === 1200) return String.fromCharCode(x);
return $cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
};
_getansi = function _ga2(x/*:number*/)/*:string*/ {
return $cptable.utils.decode(current_ansi, [x])[0];
};
cpdoit();
}
export { set_cptable };

@ -1,56 +0,0 @@
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 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
var CS2CP = ({
/*::[*/0/*::]*/: 1252, /* ANSI */
/*::[*/1/*::]*/: 65001, /* DEFAULT */
/*::[*/2/*::]*/: 65001, /* SYMBOL */
/*::[*/77/*::]*/: 10000, /* MAC */
/*::[*/128/*::]*/: 932, /* SHIFTJIS */
/*::[*/129/*::]*/: 949, /* HANGUL */
/*::[*/130/*::]*/: 1361, /* JOHAB */
/*::[*/134/*::]*/: 936, /* GB2312 */
/*::[*/136/*::]*/: 950, /* CHINESEBIG5 */
/*::[*/161/*::]*/: 1253, /* GREEK */
/*::[*/162/*::]*/: 1254, /* TURKISH */
/*::[*/163/*::]*/: 1258, /* VIETNAMESE */
/*::[*/177/*::]*/: 1255, /* HEBREW */
/*::[*/178/*::]*/: 1256, /* ARABIC */
/*::[*/186/*::]*/: 1257, /* BALTIC */
/*::[*/204/*::]*/: 1251, /* RUSSIAN */
/*::[*/222/*::]*/: 874, /* THAI */
/*::[*/238/*::]*/: 1250, /* EASTEUROPE */
/*::[*/255/*::]*/: 1252, /* OEM */
/*::[*/69/*::]*/: 6969 /* MISC */
}/*:any*/);
var set_ansi = function(cp/*:number*/) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };
function reset_ansi() { set_ansi(1252); }
var set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
function reset_cp() { set_cp(1200); reset_ansi(); }
function char_codes(data/*:string*/)/*:Array<number>*/ { var o/*:Array<number>*/ = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
function utf16leread(data/*:string*/)/*:string*/ {
var o/*:Array<string>*/ = [];
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));
return o.join("");
}
function utf16beread(data/*:string*/)/*:string*/ {
var o/*:Array<string>*/ = [];
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));
return o.join("");
}
var debom = function(data/*:string*/)/*:string*/ {
var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
if(c1 == 0xFEFF) return data.slice(1);
return data;
};
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };

File diff suppressed because it is too large Load Diff

@ -1,73 +0,0 @@
let _fs = void 0;
function set_fs(fs) { _fs = fs; }
export { set_fs };
/* normalize data for blob ctor */
function blobify(data) {
if(typeof data === "string") return s2ab(data);
if(Array.isArray(data)) return a2u(data);
return data;
}
/* write or download file */
function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) {
/*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 && typeof payload == "string") 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;
/*:: declare var IE_SaveFile: any; */
if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
if(typeof Blob !== 'undefined') {
var blob = new Blob([blobify(data)], {type:"application/octet-stream"});
/*:: declare var navigator: any; */
if(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);
/*:: declare var saveAs: any; */
if(typeof saveAs !== 'undefined') return saveAs(blob, fname);
if(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {
var url = URL.createObjectURL(blob);
/*:: declare var chrome: any; */
if(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == "function") {
if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
return chrome.downloads.download({ url: url, filename: fname, saveAs: true});
}
var a = document.createElement("a");
if(a.download != null) {
/*:: if(document.body == null) throw new Error("unreachable"); */
a.download = fname; a.href = url; document.body.appendChild(a); a.click();
/*:: if(document.body == null) throw new Error("unreachable"); */ document.body.removeChild(a);
if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
return url;
}
}
}
// $FlowIgnore
if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
// $FlowIgnore
var out = File(fname); out.open("w"); out.encoding = "binary";
if(Array.isArray(payload)) payload = a2s(payload);
out.write(payload); out.close(); return payload;
} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
throw new Error("cannot save file " + fname);
}
/* read binary data from file */
function read_binary(path/*:string*/) {
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
var infile = File(path); infile.open("r"); infile.encoding = "binary";
var data = infile.read(); infile.close();
return data;
} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
throw new Error("Cannot access file " + path);
}

@ -1,85 +0,0 @@
function parse_xlmeta_xml(data, name, opts) {
var out = { Types: [], Cell: [], Value: [] };
if (!data)
return out;
var pass = false;
var metatype = 2;
var lastmeta;
data.replace(tagregex, function(x) {
var y = parsexmltag(x);
switch (strip_ns(y[0])) {
case "<?xml":
break;
case "<metadata":
case "</metadata>":
break;
case "<metadataTypes":
case "</metadataTypes>":
break;
case "<metadataType":
out.Types.push({ name: y.name });
break;
case "</metadataType>":
break;
case "<futureMetadata":
for (var j = 0; j < out.Types.length; ++j)
if (out.Types[j].name == y.name)
lastmeta = out.Types[j];
break;
case "</futureMetadata>":
break;
case "<bk>":
break;
case "</bk>":
break;
case "<rc":
if (metatype == 1)
out.Cell.push({ type: out.Types[y.t - 1].name, index: +y.v });
else if (metatype == 0)
out.Value.push({ type: out.Types[y.t - 1].name, index: +y.v });
break;
case "</rc>":
break;
case "<cellMetadata":
metatype = 1;
break;
case "</cellMetadata>":
metatype = 2;
break;
case "<valueMetadata":
metatype = 0;
break;
case "</valueMetadata>":
metatype = 2;
break;
case "<extLst":
case "<extLst>":
case "</extLst>":
case "<extLst/>":
break;
case "<ext":
pass = true;
break;
case "</ext>":
pass = false;
break;
case "<rvb":
if (!lastmeta)
break;
if (!lastmeta.offsets)
lastmeta.offsets = [];
lastmeta.offsets.push(+y.i);
break;
default:
if (!pass && opts.WTF)
throw new Error("unrecognized " + y[0] + " in metadata");
}
return x;
});
return out;
}
function write_xlmeta_xml() {
var o = [XML_HEADER];
o.push('<metadata xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:xlrd="http://schemas.microsoft.com/office/spreadsheetml/2017/richdata" xmlns:xda="http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray">\n <metadataTypes count="1">\n <metadataType name="XLDAPR" minSupportedVersion="120000" copy="1" pasteAll="1" pasteValues="1" merge="1" splitFirst="1" rowColShift="1" clearFormats="1" clearComments="1" assign="1" coerce="1" cellMeta="1"/>\n </metadataTypes>\n <futureMetadata name="XLDAPR" count="1">\n <bk>\n <extLst>\n <ext uri="{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}">\n <xda:dynamicArrayProperties fDynamic="1" fCollapsed="0"/>\n </ext>\n </extLst>\n </bk>\n </futureMetadata>\n <cellMetadata count="1">\n <bk>\n <rc t="1" v="0"/>\n </bk>\n </cellMetadata>\n</metadata>');
return o.join("");
}

@ -1,5 +1,3 @@
RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
/* 18.3 Worksheets also covers Chartsheets */ /* 18.3 Worksheets also covers Chartsheets */
function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ { function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {
if(!data) return data; if(!data) return data;
@ -18,13 +16,13 @@ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, them
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']]; if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
return s; return s;
} }
function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { //function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
var o = [XML_HEADER, writextag('chartsheet', null, { // var o = [XML_HEADER, writextag('chartsheet', null, {
'xmlns': XMLNS_main[0], // 'xmlns': XMLNS_main[0],
'xmlns:r': XMLNS.r // 'xmlns:r': XMLNS.r
})]; // })];
o[o.length] = writextag("drawing", null, {"r:id": "rId1"}); // o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW); // add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); } // if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); // return o.join("");
} //}

@ -12,6 +12,8 @@ export {
writeSyncXLSX as writeXLSX, writeSyncXLSX as writeXLSX,
writeFileSyncXLSX as writeFileXLSX, writeFileSyncXLSX as writeFileXLSX,
utils, utils,
set_fs,
set_cptable,
__stream as stream, __stream as stream,
SSF, SSF,
CFB CFB

@ -1,6 +1,6 @@
bits/00_header.js bits/00_header.js
bits/01_version.js bits/01_version.js
misc/02_cpmini.js bits/02_codepage.js
bits/03_consts.js bits/03_consts.js
bits/04_base64.js bits/04_base64.js
bits/05_buf.js bits/05_buf.js
@ -28,7 +28,7 @@ bits/42_sstxml.js
bits/46_stycommon.js bits/46_stycommon.js
bits/47_styxml.js bits/47_styxml.js
bits/49_theme.js bits/49_theme.js
misc/51_xlsxmeta.js bits/51_xlsxmeta.js
bits/53_externlink.js bits/53_externlink.js
bits/54_drawing.js bits/54_drawing.js
bits/55_vml.js bits/55_vml.js

@ -1,14 +1,14 @@
misc/00_esmheader.js misc/00_esmheader.js
bits/01_version.js bits/01_version.js
misc/02_codepage.js bits/02_codepage.js
bits/03_consts.js bits/03_consts.js
bits/04_base64.js bits/04_base64.js
bits/05_buf.js bits/05_buf.js
bits/09_types.js bits/09_types.js
bits/10_ssf.js bits/10_ssf.js
bits/11_ssfutils.js bits/11_ssfutils.js
misc/18_esmcfb.js bits/18_cfb.js
misc/19_mjsfs.js bits/19_fsutils.js
bits/20_jsutils.js bits/20_jsutils.js
bits/21_ziputils.js bits/21_ziputils.js
bits/22_xmlutils.js bits/22_xmlutils.js

@ -1,6 +1,6 @@
{ {
"name": "xlsx", "name": "xlsx",
"version": "0.18.7", "version": "0.18.8",
"author": "sheetjs", "author": "sheetjs",
"description": "SheetJS Spreadsheet data parser and writer", "description": "SheetJS Spreadsheet data parser and writer",
"keywords": [ "keywords": [

@ -202,10 +202,11 @@ var paths = {
rhslk: dir + 'row_height.slk', rhslk: dir + 'row_height.slk',
svxls: dir + 'sheet_visibility.xls', svxls: dir + 'sheet_visibility.xls',
svxls5: dir + 'sheet_visibility.xls', svxls5: dir + 'sheet_visibility5.xls',
svxml: dir + 'sheet_visibility.xml', svxml: dir + 'sheet_visibility.xml',
svxlsx: dir + 'sheet_visibility.xlsx', svxlsx: dir + 'sheet_visibility.xlsx',
svxlsb: dir + 'sheet_visibility.xlsb', svxlsb: dir + 'sheet_visibility.xlsb',
svods: dir + 'sheet_visibility.ods',
swcxls: dir + 'apachepoi_SimpleWithComments.xls', swcxls: dir + 'apachepoi_SimpleWithComments.xls',
swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml', swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml',
@ -1655,7 +1656,10 @@ describe('roundtrip features', function() {
describe('should preserve sheet visibility', function() { [ describe('should preserve sheet visibility', function() { [
['xlml', paths.svxml], ['xlml', paths.svxml],
['xlsx', paths.svxlsx], ['xlsx', paths.svxlsx],
['xlsb', paths.svxlsb] ['xlsb', paths.svxlsb],
['xls', paths.svxls],
['biff5', paths.svxls5]
// ['ods', paths.svods]
].forEach(function(w) { ].forEach(function(w) {
it(w[0], function() { it(w[0], function() {
var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE});

8
test.mjs generated

@ -204,10 +204,11 @@ var paths = {
rhslk: dir + 'row_height.slk', rhslk: dir + 'row_height.slk',
svxls: dir + 'sheet_visibility.xls', svxls: dir + 'sheet_visibility.xls',
svxls5: dir + 'sheet_visibility.xls', svxls5: dir + 'sheet_visibility5.xls',
svxml: dir + 'sheet_visibility.xml', svxml: dir + 'sheet_visibility.xml',
svxlsx: dir + 'sheet_visibility.xlsx', svxlsx: dir + 'sheet_visibility.xlsx',
svxlsb: dir + 'sheet_visibility.xlsb', svxlsb: dir + 'sheet_visibility.xlsb',
svods: dir + 'sheet_visibility.ods',
swcxls: dir + 'apachepoi_SimpleWithComments.xls', swcxls: dir + 'apachepoi_SimpleWithComments.xls',
swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml', swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml',
@ -1642,7 +1643,10 @@ describe('roundtrip features', function() {
describe('should preserve sheet visibility', function() { [ describe('should preserve sheet visibility', function() { [
['xlml', paths.svxml], ['xlml', paths.svxml],
['xlsx', paths.svxlsx], ['xlsx', paths.svxlsx],
['xlsb', paths.svxlsb] ['xlsb', paths.svxlsb],
['xls', paths.svxls],
['biff5', paths.svxls5]
// ['ods', paths.svods]
].forEach(function(w) { ].forEach(function(w) {
it(w[0], function() { it(w[0], function() {
var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE});

@ -224,10 +224,11 @@ var paths: any = {
rhslk: dir + 'row_height.slk', rhslk: dir + 'row_height.slk',
svxls: dir + 'sheet_visibility.xls', svxls: dir + 'sheet_visibility.xls',
svxls5: dir + 'sheet_visibility.xls', svxls5: dir + 'sheet_visibility5.xls',
svxml: dir + 'sheet_visibility.xml', svxml: dir + 'sheet_visibility.xml',
svxlsx: dir + 'sheet_visibility.xlsx', svxlsx: dir + 'sheet_visibility.xlsx',
svxlsb: dir + 'sheet_visibility.xlsb', svxlsb: dir + 'sheet_visibility.xlsb',
svods: dir + 'sheet_visibility.ods',
swcxls: dir + 'apachepoi_SimpleWithComments.xls', swcxls: dir + 'apachepoi_SimpleWithComments.xls',
swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml', swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml',
@ -1602,7 +1603,10 @@ Deno.test('roundtrip features', async function(t) {
await t.step('should preserve sheet visibility', async function(t) { var sv = [ await t.step('should preserve sheet visibility', async function(t) { var sv = [
['xlml', paths.svxml], ['xlml', paths.svxml],
['xlsx', paths.svxlsx], ['xlsx', paths.svxlsx],
['xlsb', paths.svxlsb] ['xlsb', paths.svxlsb],
['xls', paths.svxls],
['biff5', paths.svxls5]
// ['ods', paths.svods]
] as Array<[X.BookType, string]>; for(var s1 = 0; s1 < sv.length; ++s1) { var w = sv[s1]; ] as Array<[X.BookType, string]>; for(var s1 = 0; s1 < sv.length; ++s1) { var w = sv[s1];
await t.step(w[0], async function(t) { await t.step(w[0], async function(t) {
var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE});

8
tests/core.js generated

@ -202,10 +202,11 @@ var paths = {
rhslk: dir + 'row_height.slk', rhslk: dir + 'row_height.slk',
svxls: dir + 'sheet_visibility.xls', svxls: dir + 'sheet_visibility.xls',
svxls5: dir + 'sheet_visibility.xls', svxls5: dir + 'sheet_visibility5.xls',
svxml: dir + 'sheet_visibility.xml', svxml: dir + 'sheet_visibility.xml',
svxlsx: dir + 'sheet_visibility.xlsx', svxlsx: dir + 'sheet_visibility.xlsx',
svxlsb: dir + 'sheet_visibility.xlsb', svxlsb: dir + 'sheet_visibility.xlsb',
svods: dir + 'sheet_visibility.ods',
swcxls: dir + 'apachepoi_SimpleWithComments.xls', swcxls: dir + 'apachepoi_SimpleWithComments.xls',
swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml', swcxml: dir + '2011/apachepoi_SimpleWithComments.xls.xml',
@ -1655,7 +1656,10 @@ describe('roundtrip features', function() {
describe('should preserve sheet visibility', function() { [ describe('should preserve sheet visibility', function() { [
['xlml', paths.svxml], ['xlml', paths.svxml],
['xlsx', paths.svxlsx], ['xlsx', paths.svxlsx],
['xlsb', paths.svxlsb] ['xlsb', paths.svxlsb],
['xls', paths.svxls],
['biff5', paths.svxls5]
// ['ods', paths.svods]
].forEach(function(w) { ].forEach(function(w) {
it(w[0], function() { it(w[0], function() {
var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE}); var wb1 = X.read(fs.readFileSync(w[1]), {type:TYPE});

3
tests/fixtures.js generated

File diff suppressed because one or more lines are too long

@ -151,10 +151,11 @@
./test_files/smart_tags_2007.xlsx ./test_files/smart_tags_2007.xlsx
./test_files/smart_tags_2007.xml ./test_files/smart_tags_2007.xml
./test_files/sheet_visibility.xls ./test_files/sheet_visibility.xls
./test_files/sheet_visibility.xls ./test_files/sheet_visibility5.xls
./test_files/sheet_visibility.xml ./test_files/sheet_visibility.xml
./test_files/sheet_visibility.xlsx ./test_files/sheet_visibility.xlsx
./test_files/sheet_visibility.xlsb ./test_files/sheet_visibility.xlsb
./test_files/sheet_visibility.ods
./test_files/sushi.xls ./test_files/sushi.xls
./test_files/sushi.xlsb ./test_files/sushi.xlsb
./test_files/sushi.xlsx ./test_files/sushi.xlsx

@ -205,7 +205,7 @@ filenames.forEach(function(r) {
var ext = r[1] && r[1].bookType || r[0].split(".")[1]; var ext = r[1] && r[1].bookType || r[0].split(".")[1];
ext = {"htm":"html"}[ext] || ext; ext = {"htm":"html"}[ext] || ext;
OUT.forEach(function(type) { OUT.forEach(function(type) {
if(type == "string" && ["xlsx", "xlsm", "xlsb", "xlam", "biff8", "biff5", "biff2", "xla", "ods", "dbf"].indexOf(ext) > -1) return; if(type == "string" && ["xlsx", "xlsm", "xlsb", "xlam", "xls", "biff8", "biff5", "biff2", "xla", "ods", "dbf"].indexOf(ext) > -1) return;
if(type == "array" && ["xlsx", "xlsm", "xlsb", "xlam", "ods"].indexOf(ext) > -1 && typeof Uint8Array === 'undefined') return; if(type == "array" && ["xlsx", "xlsm", "xlsb", "xlam", "ods"].indexOf(ext) > -1 && typeof Uint8Array === 'undefined') return;
var datout = XLSX.write(wb, {type: type, bookType: ext, sheet:r[1] && r[1].sheet || null}); var datout = XLSX.write(wb, {type: type, bookType: ext, sheet:r[1] && r[1].sheet || null});
XLSX.read(datout, {type:type}); XLSX.read(datout, {type:type});

4
types/index.d.ts vendored

@ -841,8 +841,8 @@ export interface XLSX$Utils {
/** Creates a new workbook */ /** Creates a new workbook */
book_new(): WorkBook; book_new(): WorkBook;
/** Append a worksheet to a workbook */ /** Append a worksheet to a workbook, returns new worksheet name */
book_append_sheet(workbook: WorkBook, worksheet: WorkSheet, name?: string, roll?: boolean): void; book_append_sheet(workbook: WorkBook, worksheet: WorkSheet, name?: string, roll?: boolean): string;
/** Set sheet visibility (visible/hidden/very hidden) */ /** Set sheet visibility (visible/hidden/very hidden) */
book_set_sheet_visibility(workbook: WorkBook, sheet: number|string, visibility: number): void; book_set_sheet_visibility(workbook: WorkBook, sheet: number|string, visibility: number): void;

@ -1,18 +1,14 @@
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*:: declare var cptable:any; */ /*:: declare var cptable:any; */
/*global cptable:true, window */ /*global cptable:true, window */
var $cptable; var $cptable;
if(typeof cptable !== 'undefined') $cptable = cptable;
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
$cptable = require('./dist/cpexcel.js');
}
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -68,7 +64,9 @@ var debom = function(data/*:string*/)/*:string*/ {
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
if(typeof $cptable !== 'undefined') {
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); }; set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
debom = function(data/*:string*/) { debom = function(data/*:string*/) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); } if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
@ -81,6 +79,7 @@ if(typeof $cptable !== 'undefined') {
_getansi = function _ga2(x/*:number*/)/*:string*/ { _getansi = function _ga2(x/*:number*/)/*:string*/ {
return $cptable.utils.decode(current_ansi, [x])[0]; return $cptable.utils.decode(current_ansi, [x])[0];
}; };
cpdoit();
} }
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
@ -1551,7 +1550,7 @@ function parse_extra_field(blob/*:CFBlob*/)/*:any*/ {
return o; return o;
} }
var fs/*:: = require('fs'); */; var fs/*:: = require('fs'); */;
function get_fs() { return fs || (fs = require('fs')); } function get_fs() { return fs || (fs = _fs); }
function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -3183,7 +3182,7 @@ return exports;
})(); })();
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3412,16 +3411,34 @@ function fuzzynum(s/*:string*/)/*:number*/ {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) /*:Date*/ {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s/*:string*/)/*:Date*/ { function fuzzydate(s/*:string*/)/*:Date*/ {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4192,6 +4209,10 @@ function encode_range_xls(r, opts)/*:string*/ {
} }
return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff); return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
} }
if(typeof cptable !== 'undefined') set_cptable(cptable);
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
set_cptable(require('./dist/cpexcel.js'));
}
function decode_row(rowstr/*:string*/)/*:number*/ { return parseInt(unfix_row(rowstr),10) - 1; } function decode_row(rowstr/*:string*/)/*:number*/ { return parseInt(unfix_row(rowstr),10) - 1; }
function encode_row(row/*:number*/)/*:string*/ { return "" + (row + 1); } function encode_row(row/*:number*/)/*:string*/ { return "" + (row + 1); }
function fix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); } function fix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
@ -4932,8 +4953,8 @@ var _XLSIcv = /*#__PURE__*/ rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -5157,45 +5178,45 @@ var ct2type/*{[string]:string}*/ = ({
}/*:any*/); }/*:any*/);
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct()/*:any*/ { function new_ct()/*:any*/ {
@ -5216,7 +5237,7 @@ function parse_ct(data/*:?string*/) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -5231,35 +5252,37 @@ function parse_ct(data/*:?string*/) {
return ct; return ct;
} }
function write_ct(ct, opts)/*:string*/ { function write_ct(ct, opts, raw)/*:string*/ {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o/*:Array<string>*/ = [], v; var o/*:Array<string>*/ = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -5304,7 +5327,7 @@ function write_ct(ct, opts)/*:string*/ {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -6062,7 +6085,7 @@ function parse_PropertySet(blob, PIDSI) {
blob.l = start_addr + size; /* step ahead to skip padding */ blob.l = start_addr + size; /* step ahead to skip padding */
return PropH; return PropH;
} }
var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ];
function guess_property_type(val/*:any*/)/*:number*/ { function guess_property_type(val/*:any*/)/*:number*/ {
switch(typeof val) { switch(typeof val) {
case "boolean": return 0x0B; case "boolean": return 0x0B;
@ -7979,9 +8002,9 @@ var SYLK = /*#__PURE__*/(function() {
} break; } break;
case 'W': break; /* window */ case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'NN': { /* defined name */ case 'NN': { /* defined name */
var nn = {Sheet: 0}; var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
@ -8060,7 +8083,7 @@ var SYLK = /*#__PURE__*/(function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1), 10)-1; C = parseInt(record[rj].slice(1), 10)-1;
@ -8080,6 +8103,7 @@ var SYLK = /*#__PURE__*/(function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht, wb]; return [arr, sht, wb];
} }
@ -11967,22 +11991,29 @@ function parse_drawing(data, rels/*:any*/) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId/*:number*/, comments) {
function write_comments_vml(rId/*:number*/, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid)/*:string*/ {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/; var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/;
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -11990,9 +12021,8 @@ function write_comments_vml(rId/*:number*/, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}/*:any*/); var shadata = ({on:"t", 'obscured':"t"}/*:any*/);
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -12015,9 +12045,7 @@ function write_comments_vml(rId/*:number*/, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -18739,7 +18767,7 @@ function slurp(RecordType, R, blob, length/*:number*/, opts)/*:any*/ {
var bufs = []; var bufs = [];
var d = blob.slice(blob.l,blob.l+l); var d = blob.slice(blob.l,blob.l+l);
if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {
case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002F /* FilePass */: case 0x0195 /* FileLock */: case 0x00E1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:
break; break;
case 0x0085 /* BoundSheet8 */: case 0x0085 /* BoundSheet8 */:
break; break;
@ -18922,7 +18950,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/; if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/;
else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/; else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/;
/*:: val = (val:any); */ /*:: val = (val:any); */
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* BOF */) continue;
switch(RecordType) { switch(RecordType) {
case 0x0022 /* Date1904 */: case 0x0022 /* Date1904 */:
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
@ -20997,7 +21025,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) {
/* ... */ /* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"]); if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */ /* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); write_biff_rec(ba, 0x0200 /* Dimensions */, write_Dimensions(range, opts));
/* ... */ /* ... */
if(b8) ws['!links'] = []; if(b8) ws['!links'] = [];
@ -21082,11 +21110,11 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) {
var C = buf_array(); var C = buf_array();
/* METADATA [MTRSettings] [ForceFullCalculation] */ /* METADATA [MTRSettings] [ForceFullCalculation] */
if(b8) write_biff_rec(C, 0x008C, write_Country()); if(b8) write_biff_rec(C, 0x008C /* Country */, write_Country());
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
/* BIFF8: [SST *Continue] ExtSST */ /* BIFF8: [SST *Continue] ExtSST */
if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); if(b8 && opts.Strings) write_biff_continue(C, 0x00FC /* SST */, write_SST(opts.Strings, opts));
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
write_biff_rec(C, 0x000A /* EOF */); write_biff_rec(C, 0x000A /* EOF */);
@ -21146,7 +21174,7 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
if(!ws || !ws["!ref"]) continue; if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]); var range = decode_range(ws["!ref"]);
if(range.e.c > 255) { // note: 255 is IV if(range.e.c > 255) { // note: 255 is IV
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
} }
} }
@ -23774,7 +23802,6 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
} }
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23853,7 +23880,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -23909,7 +23936,6 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
} }
function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -24002,7 +24028,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -24757,7 +24783,7 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c; if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r; if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c; if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(ws["!ref"]); ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -24927,7 +24953,7 @@ var __stream = {
to_json: write_json_stream, to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream, to_csv: write_csv_stream,
set_readable: set_readable set_readable: set_readable
}; };
if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb; if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
XLSX.parse_zip = parse_zip; XLSX.parse_zip = parse_zip;
@ -24947,6 +24973,7 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = require('stream'); var strmod = require('stream');
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = require('fs'); } catch(e) {}
} }
} }
/*global define */ /*global define */

247
xlsx.js generated

@ -1,17 +1,13 @@
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */ /*global cptable:true, window */
var $cptable; var $cptable;
if(typeof cptable !== 'undefined') $cptable = cptable;
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
$cptable = require('./dist/cpexcel.js');
}
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -67,7 +63,9 @@ var debom = function(data) {
var _getchar = function _gc1(x) { return String.fromCharCode(x); }; var _getchar = function _gc1(x) { return String.fromCharCode(x); };
var _getansi = function _ga1(x) { return String.fromCharCode(x); }; var _getansi = function _ga1(x) { return String.fromCharCode(x); };
if(typeof $cptable !== 'undefined') {
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp) { current_codepage = cp; set_ansi(cp); }; set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
debom = function(data) { debom = function(data) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); } if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
@ -80,6 +78,7 @@ if(typeof $cptable !== 'undefined') {
_getansi = function _ga2(x) { _getansi = function _ga2(x) {
return $cptable.utils.decode(current_ansi, [x])[0]; return $cptable.utils.decode(current_ansi, [x])[0];
}; };
cpdoit();
} }
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
@ -1489,7 +1488,7 @@ function parse_extra_field(blob) {
return o; return o;
} }
var fs; var fs;
function get_fs() { return fs || (fs = require('fs')); } function get_fs() { return fs || (fs = _fs); }
function parse(file, options) { function parse(file, options) {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -3115,7 +3114,7 @@ return exports;
})(); })();
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3338,16 +3337,34 @@ function fuzzynum(s) {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s) { function fuzzydate(s) {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4112,6 +4129,10 @@ function encode_range_xls(r, opts) {
} }
return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff); return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
} }
if(typeof cptable !== 'undefined') set_cptable(cptable);
else if(typeof module !== "undefined" && typeof require !== 'undefined') {
set_cptable(require('./dist/cpexcel.js'));
}
function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; } function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }
function encode_row(row) { return "" + (row + 1); } function encode_row(row) { return "" + (row + 1); }
function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); } function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
@ -4847,8 +4868,8 @@ var _XLSIcv = rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -5072,45 +5093,45 @@ var ct2type/*{[string]:string}*/ = ({
}); });
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct() { function new_ct() {
@ -5131,7 +5152,7 @@ function parse_ct(data) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -5146,35 +5167,37 @@ function parse_ct(data) {
return ct; return ct;
} }
function write_ct(ct, opts) { function write_ct(ct, opts, raw) {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o = [], v; var o = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -5219,7 +5242,7 @@ function write_ct(ct, opts) {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -5974,7 +5997,7 @@ function parse_PropertySet(blob, PIDSI) {
blob.l = start_addr + size; /* step ahead to skip padding */ blob.l = start_addr + size; /* step ahead to skip padding */
return PropH; return PropH;
} }
var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ];
function guess_property_type(val) { function guess_property_type(val) {
switch(typeof val) { switch(typeof val) {
case "boolean": return 0x0B; case "boolean": return 0x0B;
@ -7889,9 +7912,9 @@ var SYLK = (function() {
} break; } break;
case 'W': break; /* window */ case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'NN': { /* defined name */ case 'NN': { /* defined name */
var nn = {Sheet: 0}; var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
@ -7970,7 +7993,7 @@ var SYLK = (function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1), 10)-1; C = parseInt(record[rj].slice(1), 10)-1;
@ -7990,6 +8013,7 @@ var SYLK = (function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht, wb]; return [arr, sht, wb];
} }
@ -11874,22 +11898,29 @@ function parse_drawing(data, rels) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId, comments) {
function write_comments_vml(rId, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid) {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = {'color2':"#BEFF82", 'type':"gradient"}; var fillopts = {'color2':"#BEFF82", 'type':"gradient"};
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -11897,9 +11928,8 @@ function write_comments_vml(rId, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}); var shadata = ({on:"t", 'obscured':"t"});
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -11922,9 +11952,7 @@ function write_comments_vml(rId, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments, threaded, people) { function sheet_insert_comments(sheet, comments, threaded, people) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -18633,7 +18661,7 @@ function slurp(RecordType, R, blob, length, opts) {
var bufs = []; var bufs = [];
var d = blob.slice(blob.l,blob.l+l); var d = blob.slice(blob.l,blob.l+l);
if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {
case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002F /* FilePass */: case 0x0195 /* FileLock */: case 0x00E1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:
break; break;
case 0x0085 /* BoundSheet8 */: case 0x0085 /* BoundSheet8 */:
break; break;
@ -18815,7 +18843,7 @@ function parse_workbook(blob, options) {
var val = ({}); var val = ({});
if(RecordType === 0x000a /* EOF */) val = R.f(blob, length, opts); if(RecordType === 0x000a /* EOF */) val = R.f(blob, length, opts);
else val = slurp(RecordType, R, blob, length, opts); else val = slurp(RecordType, R, blob, length, opts);
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* BOF */) continue;
switch(RecordType) { switch(RecordType) {
case 0x0022 /* Date1904 */: case 0x0022 /* Date1904 */:
wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break; wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
@ -20887,7 +20915,7 @@ function write_ws_biff8(idx, opts, wb) {
/* ... */ /* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"]); if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */ /* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); write_biff_rec(ba, 0x0200 /* Dimensions */, write_Dimensions(range, opts));
/* ... */ /* ... */
if(b8) ws['!links'] = []; if(b8) ws['!links'] = [];
@ -20972,11 +21000,11 @@ function write_biff8_global(wb, bufs, opts) {
var C = buf_array(); var C = buf_array();
/* METADATA [MTRSettings] [ForceFullCalculation] */ /* METADATA [MTRSettings] [ForceFullCalculation] */
if(b8) write_biff_rec(C, 0x008C, write_Country()); if(b8) write_biff_rec(C, 0x008C /* Country */, write_Country());
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
/* BIFF8: [SST *Continue] ExtSST */ /* BIFF8: [SST *Continue] ExtSST */
if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); if(b8 && opts.Strings) write_biff_continue(C, 0x00FC /* SST */, write_SST(opts.Strings, opts));
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
write_biff_rec(C, 0x000A /* EOF */); write_biff_rec(C, 0x000A /* EOF */);
@ -21036,7 +21064,7 @@ function write_biff_buf(wb, opts) {
if(!ws || !ws["!ref"]) continue; if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]); var range = decode_range(ws["!ref"]);
if(range.e.c > 255) { // note: 255 is IV if(range.e.c > 255) { // note: 255 is IV
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
} }
} }
@ -23662,7 +23690,6 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
} }
function write_zip_xlsb(wb, opts) { function write_zip_xlsb(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23740,7 +23767,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -23796,7 +23823,6 @@ f = "docProps/app.xml";
} }
function write_zip_xlsx(wb, opts) { function write_zip_xlsx(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23888,7 +23914,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -24636,7 +24662,7 @@ function sheet_set_array_formula(ws, range, formula, dynamic) {
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c; if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r; if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c; if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(ws["!ref"]); ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -24806,7 +24832,7 @@ var __stream = {
to_json: write_json_stream, to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream, to_csv: write_csv_stream,
set_readable: set_readable set_readable: set_readable
}; };
if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb; if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
XLSX.parse_zip = parse_zip; XLSX.parse_zip = parse_zip;
@ -24826,6 +24852,7 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = require('stream'); var strmod = require('stream');
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = require('fs'); } catch(e) {}
} }
} }
/*global define */ /*global define */

@ -1,11 +1,14 @@
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*:: declare var cptable:any; */
/*global cptable:true, window */
var $cptable;
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -61,6 +64,23 @@ var debom = function(data/*:string*/)/*:string*/ {
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
debom = function(data/*:string*/) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
return data;
};
_getchar = function _gc2(x/*:number*/)/*:string*/ {
if(current_codepage === 1200) return String.fromCharCode(x);
return $cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
};
_getansi = function _ga2(x/*:number*/)/*:string*/ {
return $cptable.utils.decode(current_ansi, [x])[0];
};
cpdoit();
}
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
@ -1530,7 +1550,7 @@ function parse_extra_field(blob/*:CFBlob*/)/*:any*/ {
return o; return o;
} }
var fs/*:: = require('fs'); */; var fs/*:: = require('fs'); */;
function get_fs() { return fs || (fs = require('fs')); } function get_fs() { return fs || (fs = _fs); }
function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -3162,7 +3182,7 @@ return exports;
})(); })();
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3391,16 +3411,34 @@ function fuzzynum(s/*:string*/)/*:number*/ {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) /*:Date*/ {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s/*:string*/)/*:Date*/ { function fuzzydate(s/*:string*/)/*:Date*/ {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4600,8 +4638,8 @@ var _XLSIcv = /*#__PURE__*/ rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -4825,45 +4863,45 @@ var ct2type/*{[string]:string}*/ = ({
}/*:any*/); }/*:any*/);
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct()/*:any*/ { function new_ct()/*:any*/ {
@ -4884,7 +4922,7 @@ function parse_ct(data/*:?string*/) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -4899,35 +4937,37 @@ function parse_ct(data/*:?string*/) {
return ct; return ct;
} }
function write_ct(ct, opts)/*:string*/ { function write_ct(ct, opts, raw)/*:string*/ {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o/*:Array<string>*/ = [], v; var o/*:Array<string>*/ = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -4972,7 +5012,7 @@ function write_ct(ct, opts)/*:string*/ {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -5007,10 +5047,10 @@ var RELS = ({
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata", XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment", TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person", PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject" VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
}/*:any*/); }/*:any*/);
/* 9.3.3 Representing Relationships */ /* 9.3.3 Representing Relationships */
function get_rels_path(file/*:string*/)/*:string*/ { function get_rels_path(file/*:string*/)/*:string*/ {
var n = file.lastIndexOf("/"); var n = file.lastIndexOf("/");
@ -5780,7 +5820,7 @@ var SYLK = /*#__PURE__*/(function() {
var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; }; var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; };
var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); }; var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };
sylk_escapes["|"] = 254; sylk_escapes["|"] = 254;
/* TODO: find an actual specification */ /* https://oss.sheetjs.com/notes/sylk/ for more details */
function sylk_to_aoa(d/*:RawData*/, opts)/*:[AOA, Worksheet]*/ { function sylk_to_aoa(d/*:RawData*/, opts)/*:[AOA, Worksheet]*/ {
switch(opts.type) { switch(opts.type) {
case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts); case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts);
@ -5796,6 +5836,7 @@ var SYLK = /*#__PURE__*/(function() {
var next_cell_format/*:string|null*/ = null; var next_cell_format/*:string|null*/ = null;
var sht = {}, rowinfo/*:Array<RowInfo>*/ = [], colinfo/*:Array<ColInfo>*/ = [], cw/*:Array<string>*/ = []; var sht = {}, rowinfo/*:Array<RowInfo>*/ = [], colinfo/*:Array<ColInfo>*/ = [], cw/*:Array<string>*/ = [];
var Mval = 0, j; var Mval = 0, j;
var wb = { Workbook: { WBProps: {}, Names: [] } };
if(+opts.codepage >= 0) set_cp(+opts.codepage); if(+opts.codepage >= 0) set_cp(+opts.codepage);
for (; ri !== records.length; ++ri) { for (; ri !== records.length; ++ri) {
Mval = 0; Mval = 0;
@ -5806,19 +5847,34 @@ var SYLK = /*#__PURE__*/(function() {
case 'ID': break; /* header */ case 'ID': break; /* header */
case 'E': break; /* EOF */ case 'E': break; /* EOF */
case 'B': break; /* dimensions */ case 'B': break; /* dimensions */
case 'O': break; /* options? */ case 'O': /* workbook options */
case 'W': break; /* window? */ for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'V': {
var d1904 = parseInt(record[rj].slice(1), 10);
// NOTE: it is technically an error if d1904 >= 5 or < 0
if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true;
} break;
} break;
case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'C': case 'NN': { /* defined name */
var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'N': nn.Name = record[rj].slice(1); break;
case 'E': nn.Ref = (opts && opts.sheet || "Sheet1") + "!" + rc_to_a1(record[rj].slice(1)); break;
}
wb.Workbook.Names.push(nn);
} break;
case 'C': /* cell */
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0;
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'K': case 'K':
@ -5828,7 +5884,7 @@ var SYLK = /*#__PURE__*/(function() {
else if(val === 'FALSE') val = false; else if(val === 'FALSE') val = false;
else if(!isNaN(fuzzynum(val))) { else if(!isNaN(fuzzynum(val))) {
val = fuzzynum(val); val = fuzzynum(val);
if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val);
} else if(!isNaN(fuzzydate(val).getDate())) { } else if(!isNaN(fuzzydate(val).getDate())) {
val = parseDate(val); val = parseDate(val);
} }
@ -5845,8 +5901,8 @@ var SYLK = /*#__PURE__*/(function() {
arr[R][C] = [arr[R][C], "S5S"]; arr[R][C] = [arr[R][C], "S5S"];
break; break;
case 'G': break; // unknown case 'G': break; // unknown
case 'R': _R = parseInt(record[rj].slice(1))-1; break; case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break;
case 'C': _C = parseInt(record[rj].slice(1))-1; break; case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break;
default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
} }
if(C_seen_K) { if(C_seen_K) {
@ -5861,19 +5917,19 @@ var SYLK = /*#__PURE__*/(function() {
arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C}); arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
} }
break; break;
case 'F': case 'F': /* Format */
var F_seen = 0; var F_seen = 0;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break;
case 'F': break; /* ??? */ case 'F': break; /* ??? */
case 'G': break; /* hide grid */ case 'G': break; /* hide grid */
case 'P': case 'P':
next_cell_format = formats[parseInt(record[rj].slice(1))]; next_cell_format = formats[parseInt(record[rj].slice(1), 10)];
break; break;
case 'S': break; /* cell style */ case 'S': break; /* cell style */
case 'D': break; /* column */ case 'D': break; /* column */
@ -5882,14 +5938,14 @@ var SYLK = /*#__PURE__*/(function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1))-1; C = parseInt(record[rj].slice(1), 10)-1;
if(!colinfo[C]) colinfo[C] = {}; if(!colinfo[C]) colinfo[C] = {};
break; break;
case 'R': /* row properties */ case 'R': /* row properties */
R = parseInt(record[rj].slice(1))-1; R = parseInt(record[rj].slice(1), 10)-1;
if(!rowinfo[R]) rowinfo[R] = {}; if(!rowinfo[R]) rowinfo[R] = {};
if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }
else if(Mval === 0) rowinfo[R].hidden = true; else if(Mval === 0) rowinfo[R].hidden = true;
@ -5902,20 +5958,21 @@ var SYLK = /*#__PURE__*/(function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht]; return [arr, sht, wb];
} }
function sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ {
var aoasht = sylk_to_aoa(d, opts); var aoasht = sylk_to_aoa(d, opts);
var aoa = aoasht[0], ws = aoasht[1]; var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2];
var o = aoa_to_sheet(aoa, opts); var o = aoa_to_sheet(aoa, opts);
keys(ws).forEach(function(k) { o[k] = ws[k]; }); keys(ws).forEach(function(k) { o[k] = ws[k]; });
return o; var outwb = sheet_to_workbook(o, opts);
keys(wb).forEach(function(k) { outwb[k] = wb[k]; });
return outwb;
} }
function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ { function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ {
var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
switch(cell.t) { switch(cell.t) {
@ -5954,7 +6011,7 @@ var SYLK = /*#__PURE__*/(function() {
} }
function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ { function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ {
var preamble/*:Array<string>*/ = ["ID;PWXL;N;E"], o/*:Array<string>*/ = []; var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = [];
var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/;
var dense = Array.isArray(ws); var dense = Array.isArray(ws);
var RS = "\r\n"; var RS = "\r\n";
@ -5978,7 +6035,6 @@ var SYLK = /*#__PURE__*/(function() {
return { return {
to_workbook: sylk_to_workbook, to_workbook: sylk_to_workbook,
to_sheet: sylk_to_sheet,
from_sheet: sheet_to_sylk from_sheet: sheet_to_sylk
}; };
})(); })();
@ -7638,22 +7694,29 @@ function parse_drawing(data, rels/*:any*/) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId/*:number*/, comments) {
function write_comments_vml(rId/*:number*/, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid)/*:string*/ {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/; var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/;
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -7661,9 +7724,8 @@ function write_comments_vml(rId/*:number*/, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}/*:any*/); var shadata = ({on:"t", 'obscured':"t"}/*:any*/);
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -7686,9 +7748,7 @@ function write_comments_vml(rId/*:number*/, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -8853,8 +8913,6 @@ function parse_chart(data/*:?string*/, name/*:string*/, opts, rels, wb, csheet)
if(C > 0) cs["!ref"] = encode_range(refguess); if(C > 0) cs["!ref"] = encode_range(refguess);
return cs; return cs;
} }
RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
/* 18.3 Worksheets also covers Chartsheets */ /* 18.3 Worksheets also covers Chartsheets */
function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ { function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {
if(!data) return data; if(!data) return data;
@ -8873,16 +8931,16 @@ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, them
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']]; if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
return s; return s;
} }
function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { //function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
var o = [XML_HEADER, writextag('chartsheet', null, { // var o = [XML_HEADER, writextag('chartsheet', null, {
'xmlns': XMLNS_main[0], // 'xmlns': XMLNS_main[0],
'xmlns:r': XMLNS.r // 'xmlns:r': XMLNS.r
})]; // })];
o[o.length] = writextag("drawing", null, {"r:id": "rId1"}); // o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW); // add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); } // if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); // return o.join("");
} //}
/* 18.2.28 (CT_WorkbookProtection) Defaults */ /* 18.2.28 (CT_WorkbookProtection) Defaults */
var WBPropsDef = [ var WBPropsDef = [
['allowRefreshQuery', false, "bool"], ['allowRefreshQuery', false, "bool"],
@ -9517,7 +9575,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/
if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) { if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) {
l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break;
} }
if(l && l.charAt(0) != "#") o.l = ({ Target: l }); if(l && l.charAt(0) != "#" && l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l });
if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }
else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; else ws[encode_cell({c:C + or_C, r:R + or_R})] = o;
if(range.e.c < C + or_C) range.e.c = C + or_C; if(range.e.c < C + or_C) range.e.c = C + or_C;
@ -9557,8 +9615,7 @@ function get_get_computed_style_function(element/*:HTMLElement*/)/*:?function*/
// If it is not available, try to get one from the global namespace // If it is not available, try to get one from the global namespace
if(typeof getComputedStyle === 'function') return getComputedStyle; if(typeof getComputedStyle === 'function') return getComputedStyle;
return null; return null;
} }/* OpenDocument */
/* OpenDocument */
function parse_text_p(text/*:string*//*::, tag*/)/*:Array<any>*/ { function parse_text_p(text/*:string*//*::, tag*/)/*:Array<any>*/ {
/* 6.1.2 White Space Characters */ /* 6.1.2 White Space Characters */
var fixed = text var fixed = text
@ -10760,7 +10817,6 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
} }
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -10839,7 +10895,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -10895,7 +10951,6 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
} }
function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -10988,7 +11043,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -11159,6 +11214,11 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break; case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break; case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break;
case 0x08: if(n[1] === 0xE7) throw new Error("Unsupported Multiplan 1.x file!"); break;
case 0x0C:
if(n[1] === 0xEC) throw new Error("Unsupported Multiplan 2.x file!");
if(n[1] === 0xED) throw new Error("Unsupported Multiplan 3.x file!");
break;
} }
if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
return read_prn(data, d, o, str); return read_prn(data, d, o, str);
@ -11733,6 +11793,12 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
if(dynamic) cell.D = true; if(dynamic) cell.D = true;
} }
} }
var wsr = decode_range(ws["!ref"]);
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -11794,6 +11860,7 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = require('stream'); var strmod = require('stream');
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = require('fs'); } catch(e) {}
} }
} }
/*global define */ /*global define */

@ -1,11 +1,13 @@
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */ /* vim: set ts=2: */
/*exported XLSX */ /*exported XLSX */
/*global exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
function make_xlsx_lib(XLSX){ function make_xlsx_lib(XLSX){
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*global cptable:true, window */
var $cptable;
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -61,6 +63,23 @@ var debom = function(data) {
var _getchar = function _gc1(x) { return String.fromCharCode(x); }; var _getchar = function _gc1(x) { return String.fromCharCode(x); };
var _getansi = function _ga1(x) { return String.fromCharCode(x); }; var _getansi = function _ga1(x) { return String.fromCharCode(x); };
function set_cptable(cptable) {
$cptable = cptable;
set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
debom = function(data) {
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
return data;
};
_getchar = function _gc2(x) {
if(current_codepage === 1200) return String.fromCharCode(x);
return $cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
};
_getansi = function _ga2(x) {
return $cptable.utils.decode(current_ansi, [x])[0];
};
cpdoit();
}
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
@ -1469,7 +1488,7 @@ function parse_extra_field(blob) {
return o; return o;
} }
var fs; var fs;
function get_fs() { return fs || (fs = require('fs')); } function get_fs() { return fs || (fs = _fs); }
function parse(file, options) { function parse(file, options) {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -3095,7 +3114,7 @@ return exports;
})(); })();
var _fs; var _fs;
if(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {} function set_fs(fs) { _fs = fs; }
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3318,16 +3337,34 @@ function fuzzynum(s) {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s) { function fuzzydate(s) {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4516,8 +4553,8 @@ var _XLSIcv = rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -4741,45 +4778,45 @@ var ct2type/*{[string]:string}*/ = ({
}); });
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct() { function new_ct() {
@ -4800,7 +4837,7 @@ function parse_ct(data) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -4815,35 +4852,37 @@ function parse_ct(data) {
return ct; return ct;
} }
function write_ct(ct, opts) { function write_ct(ct, opts, raw) {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o = [], v; var o = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -4888,7 +4927,7 @@ function write_ct(ct, opts) {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -4923,10 +4962,10 @@ var RELS = ({
XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata", XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment", TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person", PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
CONN: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections",
VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject" VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
}); });
/* 9.3.3 Representing Relationships */ /* 9.3.3 Representing Relationships */
function get_rels_path(file) { function get_rels_path(file) {
var n = file.lastIndexOf("/"); var n = file.lastIndexOf("/");
@ -5695,7 +5734,7 @@ var SYLK = (function() {
var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; }; var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; };
var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); }; var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };
sylk_escapes["|"] = 254; sylk_escapes["|"] = 254;
/* TODO: find an actual specification */ /* https://oss.sheetjs.com/notes/sylk/ for more details */
function sylk_to_aoa(d, opts) { function sylk_to_aoa(d, opts) {
switch(opts.type) { switch(opts.type) {
case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts); case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts);
@ -5711,6 +5750,7 @@ var SYLK = (function() {
var next_cell_format = null; var next_cell_format = null;
var sht = {}, rowinfo = [], colinfo = [], cw = []; var sht = {}, rowinfo = [], colinfo = [], cw = [];
var Mval = 0, j; var Mval = 0, j;
var wb = { Workbook: { WBProps: {}, Names: [] } };
if(+opts.codepage >= 0) set_cp(+opts.codepage); if(+opts.codepage >= 0) set_cp(+opts.codepage);
for (; ri !== records.length; ++ri) { for (; ri !== records.length; ++ri) {
Mval = 0; Mval = 0;
@ -5721,19 +5761,34 @@ var SYLK = (function() {
case 'ID': break; /* header */ case 'ID': break; /* header */
case 'E': break; /* EOF */ case 'E': break; /* EOF */
case 'B': break; /* dimensions */ case 'B': break; /* dimensions */
case 'O': break; /* options? */ case 'O': /* workbook options */
case 'W': break; /* window? */ for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'V': {
var d1904 = parseInt(record[rj].slice(1), 10);
// NOTE: it is technically an error if d1904 >= 5 or < 0
if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true;
} break;
} break;
case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'C': case 'NN': { /* defined name */
var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'N': nn.Name = record[rj].slice(1); break;
case 'E': nn.Ref = (opts && opts.sheet || "Sheet1") + "!" + rc_to_a1(record[rj].slice(1)); break;
}
wb.Workbook.Names.push(nn);
} break;
case 'C': /* cell */
var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'A': break; // TODO: comment case 'A': break; // TODO: comment
case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0;
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'K': case 'K':
@ -5743,7 +5798,7 @@ var SYLK = (function() {
else if(val === 'FALSE') val = false; else if(val === 'FALSE') val = false;
else if(!isNaN(fuzzynum(val))) { else if(!isNaN(fuzzynum(val))) {
val = fuzzynum(val); val = fuzzynum(val);
if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val);
} else if(!isNaN(fuzzydate(val).getDate())) { } else if(!isNaN(fuzzydate(val).getDate())) {
val = parseDate(val); val = parseDate(val);
} }
@ -5760,8 +5815,8 @@ var SYLK = (function() {
arr[R][C] = [arr[R][C], "S5S"]; arr[R][C] = [arr[R][C], "S5S"];
break; break;
case 'G': break; // unknown case 'G': break; // unknown
case 'R': _R = parseInt(record[rj].slice(1))-1; break; case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break;
case 'C': _C = parseInt(record[rj].slice(1))-1; break; case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break;
default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
} }
if(C_seen_K) { if(C_seen_K) {
@ -5776,19 +5831,19 @@ var SYLK = (function() {
arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C}); arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
} }
break; break;
case 'F': case 'F': /* Format */
var F_seen = 0; var F_seen = 0;
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break;
case 'Y': case 'Y':
R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/
for(j = arr.length; j <= R; ++j) arr[j] = []; for(j = arr.length; j <= R; ++j) arr[j] = [];
break; break;
case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break;
case 'F': break; /* ??? */ case 'F': break; /* ??? */
case 'G': break; /* hide grid */ case 'G': break; /* hide grid */
case 'P': case 'P':
next_cell_format = formats[parseInt(record[rj].slice(1))]; next_cell_format = formats[parseInt(record[rj].slice(1), 10)];
break; break;
case 'S': break; /* cell style */ case 'S': break; /* cell style */
case 'D': break; /* column */ case 'D': break; /* column */
@ -5797,14 +5852,14 @@ var SYLK = (function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1))-1; C = parseInt(record[rj].slice(1), 10)-1;
if(!colinfo[C]) colinfo[C] = {}; if(!colinfo[C]) colinfo[C] = {};
break; break;
case 'R': /* row properties */ case 'R': /* row properties */
R = parseInt(record[rj].slice(1))-1; R = parseInt(record[rj].slice(1), 10)-1;
if(!rowinfo[R]) rowinfo[R] = {}; if(!rowinfo[R]) rowinfo[R] = {};
if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }
else if(Mval === 0) rowinfo[R].hidden = true; else if(Mval === 0) rowinfo[R].hidden = true;
@ -5817,20 +5872,21 @@ var SYLK = (function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht]; return [arr, sht, wb];
} }
function sylk_to_sheet(d, opts) { function sylk_to_workbook(d, opts) {
var aoasht = sylk_to_aoa(d, opts); var aoasht = sylk_to_aoa(d, opts);
var aoa = aoasht[0], ws = aoasht[1]; var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2];
var o = aoa_to_sheet(aoa, opts); var o = aoa_to_sheet(aoa, opts);
keys(ws).forEach(function(k) { o[k] = ws[k]; }); keys(ws).forEach(function(k) { o[k] = ws[k]; });
return o; var outwb = sheet_to_workbook(o, opts);
keys(wb).forEach(function(k) { outwb[k] = wb[k]; });
return outwb;
} }
function sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
function write_ws_cell_sylk(cell, ws, R, C) { function write_ws_cell_sylk(cell, ws, R, C) {
var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
switch(cell.t) { switch(cell.t) {
@ -5869,7 +5925,7 @@ var SYLK = (function() {
} }
function sheet_to_sylk(ws, opts) { function sheet_to_sylk(ws, opts) {
var preamble = ["ID;PWXL;N;E"], o = []; var preamble = ["ID;PSheetJS;N;E"], o = [];
var r = safe_decode_range(ws['!ref']), cell; var r = safe_decode_range(ws['!ref']), cell;
var dense = Array.isArray(ws); var dense = Array.isArray(ws);
var RS = "\r\n"; var RS = "\r\n";
@ -5893,7 +5949,6 @@ var SYLK = (function() {
return { return {
to_workbook: sylk_to_workbook, to_workbook: sylk_to_workbook,
to_sheet: sylk_to_sheet,
from_sheet: sheet_to_sylk from_sheet: sheet_to_sylk
}; };
})(); })();
@ -7553,22 +7608,29 @@ function parse_drawing(data, rels) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId, comments) {
function write_comments_vml(rId, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid) {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = {'color2':"#BEFF82", 'type':"gradient"}; var fillopts = {'color2':"#BEFF82", 'type':"gradient"};
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -7576,9 +7638,8 @@ function write_comments_vml(rId, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}); var shadata = ({on:"t", 'obscured':"t"});
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -7601,9 +7662,7 @@ function write_comments_vml(rId, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments, threaded, people) { function sheet_insert_comments(sheet, comments, threaded, people) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -8768,8 +8827,6 @@ function parse_chart(data, name, opts, rels, wb, csheet) {
if(C > 0) cs["!ref"] = encode_range(refguess); if(C > 0) cs["!ref"] = encode_range(refguess);
return cs; return cs;
} }
RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
/* 18.3 Worksheets also covers Chartsheets */ /* 18.3 Worksheets also covers Chartsheets */
function parse_cs_xml(data, opts, idx, rels, wb) { function parse_cs_xml(data, opts, idx, rels, wb) {
if(!data) return data; if(!data) return data;
@ -8788,16 +8845,16 @@ function parse_cs_xml(data, opts, idx, rels, wb) {
if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']]; if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
return s; return s;
} }
function write_cs_xml(idx, opts, wb, rels) { //function write_cs_xml(idx, opts, wb, rels) {
var o = [XML_HEADER, writextag('chartsheet', null, { // var o = [XML_HEADER, writextag('chartsheet', null, {
'xmlns': XMLNS_main[0], // 'xmlns': XMLNS_main[0],
'xmlns:r': XMLNS.r // 'xmlns:r': XMLNS.r
})]; // })];
o[o.length] = writextag("drawing", null, {"r:id": "rId1"}); // o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW); // add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); } // if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); // return o.join("");
} //}
/* 18.2.28 (CT_WorkbookProtection) Defaults */ /* 18.2.28 (CT_WorkbookProtection) Defaults */
var WBPropsDef = [ var WBPropsDef = [
['allowRefreshQuery', false, "bool"], ['allowRefreshQuery', false, "bool"],
@ -9430,7 +9487,7 @@ function sheet_add_dom(ws, table, _opts) {
if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) { if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) {
l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break;
} }
if(l && l.charAt(0) != "#") o.l = ({ Target: l }); if(l && l.charAt(0) != "#" && l.slice(0, 11).toLowerCase() != 'javascript:') o.l = ({ Target: l });
if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }
else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; else ws[encode_cell({c:C + or_C, r:R + or_R})] = o;
if(range.e.c < C + or_C) range.e.c = C + or_C; if(range.e.c < C + or_C) range.e.c = C + or_C;
@ -9470,8 +9527,7 @@ function get_get_computed_style_function(element) {
// If it is not available, try to get one from the global namespace // If it is not available, try to get one from the global namespace
if(typeof getComputedStyle === 'function') return getComputedStyle; if(typeof getComputedStyle === 'function') return getComputedStyle;
return null; return null;
} }/* OpenDocument */
/* OpenDocument */
function parse_text_p(text) { function parse_text_p(text) {
/* 6.1.2 White Space Characters */ /* 6.1.2 White Space Characters */
var fixed = text var fixed = text
@ -10671,7 +10727,6 @@ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std7
} }
function write_zip_xlsb(wb, opts) { function write_zip_xlsb(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -10749,7 +10804,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -10805,7 +10860,6 @@ f = "docProps/app.xml";
} }
function write_zip_xlsx(wb, opts) { function write_zip_xlsx(wb, opts) {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -10897,7 +10951,7 @@ f = "docProps/app.xml";
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -11068,6 +11122,11 @@ function readSync(data, opts) {
case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break; case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break; case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break;
case 0x08: if(n[1] === 0xE7) throw new Error("Unsupported Multiplan 1.x file!"); break;
case 0x0C:
if(n[1] === 0xEC) throw new Error("Unsupported Multiplan 2.x file!");
if(n[1] === 0xED) throw new Error("Unsupported Multiplan 3.x file!");
break;
} }
if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
return read_prn(data, d, o, str); return read_prn(data, d, o, str);
@ -11635,6 +11694,12 @@ function sheet_set_array_formula(ws, range, formula, dynamic) {
if(dynamic) cell.D = true; if(dynamic) cell.D = true;
} }
} }
var wsr = decode_range(ws["!ref"]);
if(wsr.s.r > rng.s.r) wsr.s.r = rng.s.r;
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -11696,6 +11761,7 @@ if(typeof CFB !== "undefined") XLSX.CFB = CFB;
if(typeof require !== "undefined") { if(typeof require !== "undefined") {
var strmod = require('stream'); var strmod = require('stream');
if((strmod||{}).Readable) set_readable(strmod.Readable); if((strmod||{}).Readable) set_readable(strmod.Readable);
try { _fs = require('fs'); } catch(e) {}
} }
} }
/*global define */ /*global define */

259
xlsx.mjs generated

@ -3,8 +3,11 @@
/*exported XLSX */ /*exported XLSX */
/*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ /*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
var XLSX = {}; var XLSX = {};
XLSX.version = '0.18.7'; XLSX.version = '0.18.8';
var current_codepage = 1200, current_ansi = 1252; var current_codepage = 1200, current_ansi = 1252;
/*:: declare var cptable:any; */
/*global cptable:true, window */
var $cptable;
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */ /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
@ -61,7 +64,6 @@ var debom = function(data/*:string*/)/*:string*/ {
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
var $cptable;
function set_cptable(cptable) { function set_cptable(cptable) {
$cptable = cptable; $cptable = cptable;
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); }; set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
@ -78,7 +80,6 @@ function set_cptable(cptable) {
}; };
cpdoit(); cpdoit();
} }
export { set_cptable };
var DENSE = null; var DENSE = null;
var DIF_XL = true; var DIF_XL = true;
var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
@ -1460,8 +1461,8 @@ return CRC32;
})(); })();
/* [MS-CFB] v20171201 */ /* [MS-CFB] v20171201 */
var CFB = /*#__PURE__*/(function _CFB(){ var CFB = /*#__PURE__*/(function _CFB(){
var exports = {}; var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
exports.version = '1.2.1'; exports.version = '1.2.2';
/* [MS-CFB] 2.6.4 */ /* [MS-CFB] 2.6.4 */
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
var L = l.split("/"), R = r.split("/"); var L = l.split("/"), R = r.split("/");
@ -1548,7 +1549,7 @@ function parse_extra_field(blob/*:CFBlob*/)/*:any*/ {
return o; return o;
} }
var fs/*:: = require('fs'); */; var fs/*:: = require('fs'); */;
function get_fs() { return fs || (fs = {}); } function get_fs() { return fs || (fs = _fs); }
function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {
if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);
@ -1761,7 +1762,7 @@ function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array<RawBytes>*/,
if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break; if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
fat_addrs.push(q); 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);
} }
} }
@ -1937,7 +1938,9 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {
for(i = 0; i < data.length; ++i) { for(i = 0; i < data.length; ++i) {
var dad = dirname(data[i][0]); var dad = dirname(data[i][0]);
s = fullPaths[dad]; s = fullPaths[dad];
if(!s) { while(!s) {
while(dirname(dad) && !fullPaths[dirname(dad)]) dad = dirname(dad);
data.push([dad, ({ data.push([dad, ({
name: filename(dad).replace("/",""), name: filename(dad).replace("/",""),
type: 1, type: 1,
@ -1945,8 +1948,12 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {
ct: now, mt: now, ct: now, mt: now,
content: null content: null
}/*:any*/)]); }/*:any*/)]);
// Add name to set // Add name to set
fullPaths[dad] = true; fullPaths[dad] = true;
dad = dirname(data[i][0]);
s = fullPaths[dad];
} }
} }
@ -1994,7 +2001,6 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|strin
for(var i = 0; i < cfb.FileIndex.length; ++i) { for(var i = 0; i < cfb.FileIndex.length; ++i) {
var file = cfb.FileIndex[i]; var file = cfb.FileIndex[i];
if(!file.content) continue; if(!file.content) continue;
/*:: if(file.content == null) throw new Error("unreachable"); */
var flen = file.content.length; var flen = file.content.length;
if(flen > 0){ if(flen > 0){
if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6; if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
@ -2085,6 +2091,10 @@ function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|strin
file = cfb.FileIndex[i]; file = cfb.FileIndex[i];
if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN; if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
var _nm/*:string*/ = (i === 0 && _opts.root) || file.name; 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); flen = 2*(_nm.length+1);
o.write_shift(64, _nm, "utf16le"); o.write_shift(64, _nm, "utf16le");
o.write_shift(2, flen); o.write_shift(2, flen);
@ -2723,6 +2733,7 @@ function parse_zip(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/
parse_local_file(blob, csz, usz, o, EF); parse_local_file(blob, csz, usz, o, EF);
blob.l = L; blob.l = L;
} }
return o; return o;
} }
@ -3169,9 +3180,8 @@ exports.utils = {
return exports; return exports;
})(); })();
let _fs = void 0; var _fs;
function set_fs(fs) { _fs = fs; } function set_fs(fs) { _fs = fs; }
export { set_fs };
/* normalize data for blob ctor */ /* normalize data for blob ctor */
function blobify(data) { function blobify(data) {
@ -3400,16 +3410,34 @@ function fuzzynum(s/*:string*/)/*:number*/ {
if(!isNaN(v = Number(ss))) return v / wt; if(!isNaN(v = Number(ss))) return v / wt;
return v; return v;
} }
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/;
function fuzzytime1(M) /*:Date*/ {
/* TODO: 1904 adjustment */
if(!M[2]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), 0, 0, 0);
if(M[3]) {
if(M[4]) return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[4], parseFloat(M[3])*1000);
else return new Date(1900,0,0,(M[7] == "p" ? 12 : 0), +M[1], +M[2], parseFloat(M[3])*1000);
}
else if(M[5]) return new Date(1900, 0, 0, (+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], +M[5], M[6] ? parseFloat(M[6]) * 1000 : 0);
else return new Date(1900,0,0,(+M[1]%12) + (M[7] == "p" ? 12 : 0), +M[2], 0, 0);
}
var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
function fuzzydate(s/*:string*/)/*:Date*/ { function fuzzydate(s/*:string*/)/*:Date*/ {
var lower = s.toLowerCase();
var lnos = lower.replace(/\s+/g, "");
var M = lnos.match(FDRE1);
if(M) return fuzzytime1(M);
var o = new Date(s), n = new Date(NaN); var o = new Date(s), n = new Date(NaN);
var y = o.getYear(), m = o.getMonth(), d = o.getDate(); var y = o.getYear(), m = o.getMonth(), d = o.getDate();
if(isNaN(d)) return n; if(isNaN(d)) return n;
var lower = s.toLowerCase();
if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { 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]|$)/,""); lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,"");
if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;
} else if(lower.match(/[a-z]/)) return n; } else if(lower.replace(/[ap]m?/, "").match(/[a-z]/)) return n;
if(y < 0 || y > 8099) return n; if(y < 0 || y > 8099) return n;
if((m > 0 || d > 1) && y != 101) return o; if((m > 0 || d > 1) && y != 101) return o;
if(s.match(/[^-0-9:,\/\\]/)) return n; if(s.match(/[^-0-9:,\/\\]/)) return n;
@ -4920,8 +4948,8 @@ var _XLSIcv = /*#__PURE__*/ rgbify([
0x333333, 0x333333,
/* Other entries to appease BIFF8/12 */ /* Other entries to appease BIFF8/12 */
0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x40 icvForeground ?? */
0x000000, /* 0x41 icvBackground ?? */ 0xFFFFFF, /* 0x41 icvBackground ?? */
0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x42 icvFrame ?? */
0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x43 icv3D ?? */
0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x44 icv3DText ?? */
@ -5145,45 +5173,45 @@ var ct2type/*{[string]:string}*/ = ({
}/*:any*/); }/*:any*/);
var CT_LIST = { var CT_LIST = {
workbooks: { workbooks: {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
}, },
strs: { /* Shared Strings */ strs: { /* Shared Strings */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
xlsb: "application/vnd.ms-excel.sharedStrings" xlsb: "application/vnd.ms-excel.sharedStrings"
}, },
comments: { /* Comments */ comments: { /* Comments */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
xlsb: "application/vnd.ms-excel.comments" xlsb: "application/vnd.ms-excel.comments"
}, },
sheets: { /* Worksheet */ sheets: { /* Worksheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
xlsb: "application/vnd.ms-excel.worksheet" xlsb: "application/vnd.ms-excel.worksheet"
}, },
charts: { /* Chartsheet */ charts: { /* Chartsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
xlsb: "application/vnd.ms-excel.chartsheet" xlsb: "application/vnd.ms-excel.chartsheet"
}, },
dialogs: { /* Dialogsheet */ dialogs: { /* Dialogsheet */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
xlsb: "application/vnd.ms-excel.dialogsheet" xlsb: "application/vnd.ms-excel.dialogsheet"
}, },
macros: { /* Macrosheet (Excel 4.0 Macros) */ macros: { /* Macrosheet (Excel 4.0 Macros) */
xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsx: "application/vnd.ms-excel.macrosheet+xml",
xlsb: "application/vnd.ms-excel.macrosheet" xlsb: "application/vnd.ms-excel.macrosheet"
}, },
metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ metadata: { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml",
xlsb: "application/vnd.ms-excel.sheetMetadata" xlsb: "application/vnd.ms-excel.sheetMetadata"
}, },
styles: { /* Styles */ styles: { /* Styles */
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
xlsb: "application/vnd.ms-excel.styles" xlsb: "application/vnd.ms-excel.styles"
} }
}; };
function new_ct()/*:any*/ { function new_ct()/*:any*/ {
@ -5204,7 +5232,7 @@ function parse_ct(data/*:?string*/) {
switch(y[0].replace(nsregex,"<")) { switch(y[0].replace(nsregex,"<")) {
case '<?xml': break; case '<?xml': break;
case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break; case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
case '<Default': ctext[y.Extension] = y.ContentType; break; case '<Default': ctext[y.Extension.toLowerCase()] = y.ContentType; break;
case '<Override': case '<Override':
if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
break; break;
@ -5219,35 +5247,37 @@ function parse_ct(data/*:?string*/) {
return ct; return ct;
} }
function write_ct(ct, opts)/*:string*/ { function write_ct(ct, opts, raw)/*:string*/ {
var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type); var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
var o/*:Array<string>*/ = [], v; var o/*:Array<string>*/ = [], v;
o[o.length] = (XML_HEADER);
o[o.length] = writextag('Types', null, {
'xmlns': XMLNS.CT,
'xmlns:xsd': XMLNS.xsd,
'xmlns:xsi': XMLNS.xsi
});
o = o.concat([ if(!raw) {
['xml', 'application/xml'], o[o.length] = (XML_HEADER);
['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], o[o.length] = writextag('Types', null, {
['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], 'xmlns': XMLNS.CT,
['data', 'application/vnd.openxmlformats-officedocument.model+data'], 'xmlns:xsd': XMLNS.xsd,
/* from test files */ 'xmlns:xsi': XMLNS.xsi
['bmp', 'image/bmp'], });
['png', 'image/png'], o = o.concat([
['gif', 'image/gif'], ['xml', 'application/xml'],
['emf', 'image/x-emf'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
['wmf', 'image/x-wmf'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'], /* from test files */
['pdf', 'application/pdf'], ['bmp', 'image/bmp'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ['png', 'image/png'],
].map(function(x) { ['gif', 'image/gif'],
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); ['emf', 'image/x-emf'],
})); ['wmf', 'image/x-wmf'],
['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
['tif', 'image/tiff'], ['tiff', 'image/tiff'],
['pdf', 'application/pdf'],
['rels', 'application/vnd.openxmlformats-package.relationships+xml']
].map(function(x) {
return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
}));
}
/* only write first instance */ /* only write first instance */
var f1 = function(w) { var f1 = function(w) {
@ -5292,7 +5322,7 @@ function write_ct(ct, opts)/*:string*/ {
f3('drawings'); f3('drawings');
f2('metadata'); f2('metadata');
f3('people'); f3('people');
if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); } if(!raw && o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
return o.join(""); return o.join("");
} }
/* 9.3 Relationships */ /* 9.3 Relationships */
@ -6050,7 +6080,7 @@ function parse_PropertySet(blob, PIDSI) {
blob.l = start_addr + size; /* step ahead to skip padding */ blob.l = start_addr + size; /* step ahead to skip padding */
return PropH; return PropH;
} }
var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ];
function guess_property_type(val/*:any*/)/*:number*/ { function guess_property_type(val/*:any*/)/*:number*/ {
switch(typeof val) { switch(typeof val) {
case "boolean": return 0x0B; case "boolean": return 0x0B;
@ -7967,9 +7997,9 @@ var SYLK = /*#__PURE__*/(function() {
} break; } break;
case 'W': break; /* window */ case 'W': break; /* window */
case 'P': case 'P':
if(record[1].charAt(0) == 'P') switch(record[1].charAt(0)){
formats.push(rstr.slice(3).replace(/;;/g, ";")); case 'P': formats.push(rstr.slice(3).replace(/;;/g, ";")); break;
break; } break;
case 'NN': { /* defined name */ case 'NN': { /* defined name */
var nn = {Sheet: 0}; var nn = {Sheet: 0};
for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
@ -8048,7 +8078,7 @@ var SYLK = /*#__PURE__*/(function() {
cw = record[rj].slice(1).split(" "); cw = record[rj].slice(1).split(" ");
for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) { for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
Mval = parseInt(cw[2], 10); Mval = parseInt(cw[2], 10);
colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval};
} break; } break;
case 'C': /* default column format */ case 'C': /* default column format */
C = parseInt(record[rj].slice(1), 10)-1; C = parseInt(record[rj].slice(1), 10)-1;
@ -8068,6 +8098,7 @@ var SYLK = /*#__PURE__*/(function() {
} }
if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(rowinfo.length > 0) sht['!rows'] = rowinfo;
if(colinfo.length > 0) sht['!cols'] = colinfo; if(colinfo.length > 0) sht['!cols'] = colinfo;
colinfo.forEach(function(col) { process_col(col); });
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
return [arr, sht, wb]; return [arr, sht, wb];
} }
@ -11955,22 +11986,29 @@ function parse_drawing(data, rels/*:any*/) {
} }
/* L.5.5.2 SpreadsheetML Comments + VML Schema */ /* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024; function write_vml(rId/*:number*/, comments) {
function write_comments_vml(rId/*:number*/, comments) {
var csize = [21600, 21600]; var csize = [21600, 21600];
/* L.5.2.1.2 Path Attribute */ /* L.5.2.1.2 Path Attribute */
var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
var o = [ var o = [
writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"})
writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
]; ];
while(_shapeid < rId * 1000) _shapeid += 1000;
comments.forEach(function(x) { var _shapeid = 65536 * rId;
var _comments = comments || [];
if(_comments.length > 0) o.push(writextag("v:shapetype", [
writextag("v:stroke", null, {joinstyle:"miter"}),
writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
].join(""), {id:"_x0000_t202", coordsize:csize.join(","), 'o:spt':202, path:bbox}));
_comments.forEach(function(x) { ++_shapeid; o.push(write_vml_comment(x, _shapeid)); });
o.push('</xml>');
return o.join("");
}
function write_vml_comment(x, _shapeid)/*:string*/ {
var c = decode_cell(x[0]); var c = decode_cell(x[0]);
var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/; var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/;
if(fillopts.type == "gradient") fillopts.angle = "-180"; if(fillopts.type == "gradient") fillopts.angle = "-180";
@ -11978,9 +12016,8 @@ function write_comments_vml(rId/*:number*/, comments) {
var fillxml = writextag('v:fill', fillparm, fillopts); var fillxml = writextag('v:fill', fillparm, fillopts);
var shadata = ({on:"t", 'obscured':"t"}/*:any*/); var shadata = ({on:"t", 'obscured':"t"}/*:any*/);
++_shapeid;
o = o.concat([ return [
'<v:shape' + wxt_helper({ '<v:shape' + wxt_helper({
id:'_x0000_s' + _shapeid, id:'_x0000_s' + _shapeid,
type:"#_x0000_t202", type:"#_x0000_t202",
@ -12003,9 +12040,7 @@ function write_comments_vml(rId/*:number*/, comments) {
x[1].hidden ? '' : '<x:Visible/>', x[1].hidden ? '' : '<x:Visible/>',
'</x:ClientData>', '</x:ClientData>',
'</v:shape>' '</v:shape>'
]); }); ].join("");
o.push('</xml>');
return o.join("");
} }
function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) { function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*:boolean*/, people/*:?Array<any>*/) {
var dense = Array.isArray(sheet); var dense = Array.isArray(sheet);
@ -18727,7 +18762,7 @@ function slurp(RecordType, R, blob, length/*:number*/, opts)/*:any*/ {
var bufs = []; var bufs = [];
var d = blob.slice(blob.l,blob.l+l); var d = blob.slice(blob.l,blob.l+l);
if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {
case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002F /* FilePass */: case 0x0195 /* FileLock */: case 0x00E1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:
break; break;
case 0x0085 /* BoundSheet8 */: case 0x0085 /* BoundSheet8 */:
break; break;
@ -18910,7 +18945,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/; if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/;
else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/; else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/;
/*:: val = (val:any); */ /*:: val = (val:any); */
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* BOF */) continue;
switch(RecordType) { switch(RecordType) {
case 0x0022 /* Date1904 */: case 0x0022 /* Date1904 */:
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
@ -20985,7 +21020,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) {
/* ... */ /* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"]); if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */ /* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); write_biff_rec(ba, 0x0200 /* Dimensions */, write_Dimensions(range, opts));
/* ... */ /* ... */
if(b8) ws['!links'] = []; if(b8) ws['!links'] = [];
@ -21070,11 +21105,11 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) {
var C = buf_array(); var C = buf_array();
/* METADATA [MTRSettings] [ForceFullCalculation] */ /* METADATA [MTRSettings] [ForceFullCalculation] */
if(b8) write_biff_rec(C, 0x008C, write_Country()); if(b8) write_biff_rec(C, 0x008C /* Country */, write_Country());
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
/* BIFF8: [SST *Continue] ExtSST */ /* BIFF8: [SST *Continue] ExtSST */
if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); if(b8 && opts.Strings) write_biff_continue(C, 0x00FC /* SST */, write_SST(opts.Strings, opts));
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
write_biff_rec(C, 0x000A /* EOF */); write_biff_rec(C, 0x000A /* EOF */);
@ -21134,7 +21169,7 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
if(!ws || !ws["!ref"]) continue; if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]); var range = decode_range(ws["!ref"]);
if(range.e.c > 255) { // note: 255 is IV if(range.e.c > 255) { // note: 255 is IV
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
} }
} }
@ -23762,7 +23797,6 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {
} }
function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23841,7 +23875,7 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -23897,7 +23931,6 @@ function write_zip_xlsb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
} }
function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
_shapeid = 1024;
if(wb && !wb.SSF) { if(wb && !wb.SSF) {
wb.SSF = dup(table_fmt); wb.SSF = dup(table_fmt);
} }
@ -23990,7 +24023,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
need_vml = true; need_vml = true;
} }
if(ws['!legacy']) { if(ws['!legacy']) {
if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_vml(rId, ws['!comments']));
} }
delete ws['!comments']; delete ws['!comments'];
delete ws['!legacy']; delete ws['!legacy'];
@ -24745,7 +24778,7 @@ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dy
if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c; if(wsr.s.c > rng.s.c) wsr.s.c = rng.s.c;
if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r; if(wsr.e.r < rng.e.r) wsr.e.r = rng.e.r;
if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c; if(wsr.e.c < rng.e.c) wsr.e.c = rng.e.c;
ws["!ref"] = encode_range(ws["!ref"]); ws["!ref"] = encode_range(wsr);
return ws; return ws;
} }
@ -24915,7 +24948,7 @@ var __stream = {
to_json: write_json_stream, to_json: write_json_stream,
to_html: write_html_stream, to_html: write_html_stream,
to_csv: write_csv_stream, to_csv: write_csv_stream,
set_readable: set_readable set_readable: set_readable
}; };
export const version = XLSX.version; export const version = XLSX.version;
export { export {
@ -24931,6 +24964,8 @@ export {
writeSyncXLSX as writeXLSX, writeSyncXLSX as writeXLSX,
writeFileSyncXLSX as writeFileXLSX, writeFileSyncXLSX as writeFileXLSX,
utils, utils,
set_fs,
set_cptable,
__stream as stream, __stream as stream,
SSF, SSF,
CFB CFB