version bump 0.18.4

This commit is contained in:
SheetJS 2022-03-15 23:18:09 -04:00
parent 2cbc28d6ed
commit 61b17a8bc8
63 changed files with 7920 additions and 7505 deletions

@ -186,7 +186,7 @@ fullint: lint mdlint ## Run all checks (removed: old-lint, tslint, flow)
.PHONY: lint
lint: $(TARGET) $(AUXTARGETS) ## Run eslint checks
@./node_modules/.bin/eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json bower.json
@./node_modules/.bin/eslint --ext .js,.njs,.json,.html,.htm $(FLOWTARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json bower.json
@if [ -x "$(CLOSURE)" ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
.PHONY: old-lint

@ -578,6 +578,7 @@ The [`demos` directory](demos/) includes sample projects for:
- [`canvas-datagrid`](demos/datagrid/)
- [`x-spreadsheet`](demos/xspreadsheet/)
- [`react-data-grid`](demos/react/modify/)
- [`vue3-table-light`](demos/vue/modify/)
- [`Swift JSC and other engines`](demos/altjs/)
- [`"serverless" functions`](demos/function/)
- [`internet explorer`](demos/oldie/)
@ -1831,6 +1832,14 @@ export default function App() {
</details>
<details>
<summary><b>Previewing data in a VueJS data grid</b> (click to show)</summary>
[`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) is a simple
VueJS 3 data table. It is featured [in the VueJS demo](/demos/vue/modify/).
</details>
<details>
<summary><b>Populating a database (SQL or no-SQL)</b> (click to show)</summary>

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

@ -1 +1 @@
XLSX.version = '0.18.3';
XLSX.version = '0.18.4';

@ -21,7 +21,7 @@ declare var Buffer_from:any;
/* vim: set ts=2: */
/*jshint eqnull:true */
/*exported CFB */
/*global module, require:false, process:false, Buffer:false, Uint8Array:false, Uint16Array:false */
/*global Uint8Array:false, Uint16Array:false */
/*::
type SectorEntry = {

@ -129,8 +129,7 @@ function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length
/* TODO: stress test */
function fuzzynum(s/*:string*/)/*:number*/ {
var v/*:number*/ = Number(s);
if(isFinite(v)) return v;
if(!isNaN(v)) return NaN;
if(!isNaN(v)) return isFinite(v) ? v : NaN;
if(!/\d/.test(s)) return v;
var wt = 1;
var ss = s.replace(/([\d]),([\d])/g,"$1$2").replace(/[$]/g,"").replace(/[%]/g, function() { wt *= 100; return "";});

@ -81,7 +81,7 @@ var xlml_fixstr/*:StringConv*/ = /*#__PURE__*/(function() {
function entrepl($$/*:string*/,$1/*:string*/)/*:string*/ { return String.fromCharCode(parseInt($1,10)); }
return function xlml_fixstr(str/*:string*/)/*:string*/ { return str.replace(entregex,entrepl); };
})();
function xlml_unfixstr(str/*:string*/)/*:string*/ { return str.replace(/(\r\n|[\r\n])/g,"\&#10;"); };
function xlml_unfixstr(str/*:string*/)/*:string*/ { return str.replace(/(\r\n|[\r\n])/g,"\&#10;"); }
function parsexmlbool(value/*:any*/)/*:boolean*/ {
switch(value) {

@ -94,10 +94,6 @@ var ct2type/*{[string]:string}*/ = ({
"application/vnd.ms-excel.externalLink": "links",
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
/* Metadata */
"application/vnd.ms-excel.sheetMetadata": "metadata",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "metadata",
/* PivotCache */
"application/vnd.ms-excel.pivotCacheDefinition": "TODO",
"application/vnd.ms-excel.pivotCacheRecords": "TODO",

@ -17,7 +17,7 @@ var RELS = ({
STY: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
THEME: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
CHART: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",
CHARTEX: "http://schemas.microsoft.com/office/2014/relationships/chartEx",
CHARTEX: "http://schemas.microsoft.com/office/2014/relationships/chartEx",
CS: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",
WS: [
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",

@ -373,10 +373,10 @@ var WK_ = /*#__PURE__*/(function() {
V = (rel ? B : 0) + ((V >= 0x2000) ? V - 0x4000 : V);
return (rel ? "" : "$") + (col ? encode_col(V) : encode_row(V));
}
var oprec = [
/* var oprec = [
8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 4, 5, 5, 7, 3, 3,
3, 3, 3, 3, 1, 1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8
];
]; */
/* TODO: flesh out */
var FuncTab = {
0x33: ["FALSE", 0],
@ -390,10 +390,10 @@ var WK_ = /*#__PURE__*/(function() {
0x6F: ["T", 1]
};
var BinOpTab = [
"", "", "", "", "", "", "", "",
"", "+", "-", "*", "/", "^", "=", "<>",
"<=", ">=", "<", ">", "", "", "", "",
"&", "", "", "", "", "", "", ""
"", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
"", "+", "-", "*", "/", "^", "=", "<>", // eslint-disable-line no-mixed-spaces-and-tabs
"<=", ">=", "<", ">", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs
"&", "", "", "", "", "", "", "" // eslint-disable-line no-mixed-spaces-and-tabs
];
function wk1_fmla_to_csf(blob, o) {
@ -592,7 +592,7 @@ var WK_ = /*#__PURE__*/(function() {
if(!opts.qpro || length < 21) return;
var id = blob.read_shift(1);
blob.l += 17;
var len = blob.read_shift(1);
blob.l += 1; //var len = blob.read_shift(1);
blob.l += 2;
var nm = blob.read_shift(length - 21, 'cstr');
return [id, nm];

@ -102,7 +102,7 @@ var XLSBFillPTNames = [
"gray125",
"gray0625"
];
var rev_XLSBFillPTNames/*:EvertNumType*/
var rev_XLSBFillPTNames/*:EvertNumType*/;
/* TODO: gradient fill representation */
var parse_BrtFill = parsenoop;
function write_BrtFill(fill, o) {

@ -12,7 +12,7 @@ function write_BrtMdtinfo(data) {
write_XLWideString(data.name, o);
return o.slice(0, o.l);
}
function parse_BrtMdb(data, length) {
function parse_BrtMdb(data) {
var out = [];
var cnt = data.read_shift(4);
while (cnt-- > 0)
@ -34,7 +34,7 @@ function write_BrtBeginEsfmd(cnt, name) {
write_XLWideString(name, o);
return o.slice(0, o.l);
}
function parse_BrtBeginEsmdb(data, length) {
function parse_BrtBeginEsmdb(data) {
data.l += 4;
return data.read_shift(4) != 0;
}
@ -49,7 +49,7 @@ function parse_xlmeta_bin(data, name, _opts) {
var opts = _opts || {};
var state = [];
var pass = false;
var esmdb = 0;
var metatype = 2;
recordhopper(data, function(val, R, RT) {
switch (RT) {
case 335:
@ -57,11 +57,17 @@ function parse_xlmeta_bin(data, name, _opts) {
break;
case 51:
val.forEach(function(r) {
(esmdb == 1 ? out.Cell : out.Value).push({ type: out.Types[r[0] - 1].name, index: r[1] });
if (metatype == 1)
out.Cell.push({ type: out.Types[r[0] - 1].name, index: r[1] });
else if (metatype == 0)
out.Value.push({ type: out.Types[r[0] - 1].name, index: r[1] });
});
break;
case 337:
esmdb = val ? 1 : 0;
metatype = val ? 1 : 0;
break;
case 338:
metatype = 2;
break;
case 35:
state.push(RT);

@ -3,8 +3,8 @@ function parse_xlmeta_xml(data, name, opts) {
if (!data)
return out;
var pass = false;
var metatype = "";
data.replace(tagregex, function(x, idx) {
var metatype = 2;
data.replace(tagregex, function(x) {
var y = parsexmltag(x);
switch (strip_ns(y[0])) {
case "<?xml":
@ -29,24 +29,24 @@ function parse_xlmeta_xml(data, name, opts) {
case "</bk>":
break;
case "<rc":
if (metatype == "cell")
if (metatype == 1)
out.Cell.push({ type: out.Types[y.t - 1].name, index: +y.v });
else if (metatype == "value")
else if (metatype == 0)
out.Value.push({ type: out.Types[y.t - 1].name, index: +y.v });
break;
case "</rc>":
break;
case "<cellMetadata":
metatype = "cell";
metatype = 1;
break;
case "</cellMetadata>":
metatype = "";
metatype = 2;
break;
case "<valueMetadata":
metatype = "value";
metatype = 0;
break;
case "</valueMetadata>":
metatype = "";
metatype = 2;
break;
case "<extLst":
case "<extLst>":

@ -29,7 +29,7 @@ function sheet_insert_comments(sheet, comments/*:Array<RawComment>*/, threaded/*
if(!threaded && cell.c[i].T) return;
if(threaded && !cell.c[i].T) cell.c.splice(i, 1);
}
if(threaded && people) for(var i = 0; i < people.length; ++i) {
if(threaded && people) for(i = 0; i < people.length; ++i) {
if(o.a == people[i].id) { o.a = people[i].name || o.a; break; }
}
cell.c.push(o);

@ -135,8 +135,8 @@ function write_tcmnt_xml(comments, people, opts) {
/* [MS-XLSX] 2.1.18 */
function parse_people_xml(data/*:string*/, opts) {
var out = [];
var pass = false, tidx = 0;
data.replace(tagregex, function xml_tcmnt(x, idx) {
var pass = false;
data.replace(tagregex, function xml_tcmnt(x) {
var y/*:any*/ = parsexmltag(x);
switch(strip_ns(y[0])) {
case '<?xml': break;
@ -161,7 +161,7 @@ function parse_people_xml(data/*:string*/, opts) {
});
return out;
}
function write_people_xml(people, opts) {
function write_people_xml(people/*, opts*/) {
var o = [XML_HEADER, writextag('personList', null, {
'xmlns': XMLNS.TCMNT,
'xmlns:x': XMLNS_main[0]

@ -106,7 +106,7 @@ function parse_ws_xml_sheetpr(sheetPr/*:string*/, s, wb/*:WBWBProps*/, idx/*:num
if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
if(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));
}
function parse_ws_xml_sheetpr2(sheetPr/*:string*/, body/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/, styles, themes) {
function parse_ws_xml_sheetpr2(sheetPr/*:string*/, body/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/) {
parse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(">")), s, wb, idx);
}
function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {

@ -180,7 +180,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
var state = [], tmp;
if(DENSE != null && opts.dense == null) opts.dense = DENSE;
var sheets = {}, sheetnames/*:Array<string>*/ = [], cursheet/*:Worksheet*/ = (opts.dense ? [] : {}), sheetname = "";
var table = {}, cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars
var cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars
var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0;
var c = 0, r = 0;
var refguess/*:Range*/ = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
@ -305,7 +305,6 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
else if(Rn[0].slice(-2) == "/>") break;
else {
table = xlml_parsexmltag(Rn[0]);
state.push([Rn[3], false]);
cstys = []; seencol = false;
}

@ -181,8 +181,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
var merges/*:Array<Range>*/ = [];
var objects = [];
var colinfo/*:Array<ColInfo>*/ = [], rowinfo/*:Array<RowInfo>*/ = [];
// eslint-disable-next-line no-unused-vars
var defwidth = 0, defheight = 0; // twips / MDW respectively
var seencol = false;
var supbooks = ([]/*:any*/); // 1-indexed, will hold extern names
supbooks.SheetNames = opts.snames;
@ -227,7 +225,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
/*:: val = (val:any); */
if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue;
switch(RecordType) {
/* Workbook Options */
case 0x0022 /* Date1904 */:
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
@ -240,7 +237,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(!val.valid) throw new Error("Password is incorrect");
break;
case 0x005c /* WriteAccess */: opts.lastuser = val; break;
case 0x005b /* FileSharing */: break; //TODO
case 0x0042 /* CodePage */:
var cpval = Number(val);
/* overrides based on test cases */
@ -254,10 +250,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
break;
case 0x013d /* RRTabId */: opts.rrtabid = val; break;
case 0x0019 /* WinProtect */: opts.winlocked = val; break;
case 0x0060 /* Template */: break; // TODO
case 0x00da /* BookBool */: break; // TODO
case 0x0160 /* UsesELFs */: break;
case 0x089a /* MTRSettings */: break;
case 0x01b7 /* RefreshAll */: wb.opts["RefreshAll"] = val; break;
case 0x000c /* CalcCount */: wb.opts["CalcCount"] = val; break;
case 0x0010 /* CalcDelta */: wb.opts["CalcDelta"] = val; break;
@ -266,7 +258,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
case 0x000e /* CalcPrecision */: wb.opts["CalcPrecision"] = val; break;
case 0x005f /* CalcSaveRecalc */: wb.opts["CalcSaveRecalc"] = val; break;
case 0x000f /* CalcRefMode */: opts.CalcRefMode = val; break; // TODO: implement R1C1
case 0x005e /* Uncalced */: break;
case 0x08a3 /* ForceFullCalculation */: wb.opts.FullCalc = val; break;
case 0x0081 /* WsBool */:
if(val.fDialog) out["!type"] = "dialog";
@ -275,11 +266,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
break; // TODO
case 0x00e0 /* XF */:
XFs.push(val); break;
case 0x00ff /* ExtSST */: break; // TODO
case 0x0863 /* BookExt */: break; // TODO
case 0x08a6 /* RichTextStream */: break;
case 0x00e9 /* BkHim */: break;
case 0x01ae /* SupBook */:
supbooks.push([val]);
supbooks[supbooks.length-1].XTI = [];
@ -287,7 +273,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
case 0x0023: case 0x0223 /* ExternName */:
supbooks[supbooks.length-1].push(val);
break;
case 0x000b: case 0x020b /* Index */: break; // TODO
case 0x0018: case 0x0218 /* Lbl */:
last_lbl = ({
Name: val.Name,
@ -310,11 +295,8 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(opts.biff < 8) break;
if(last_lbl != null) last_lbl.Comment = val[1];
break;
case 0x0012 /* Protect */: out["!protect"] = val; break; /* for sheet or book */
case 0x0013 /* Password */: if(val !== 0 && opts.WTF) console.error("Password verifier: " + val); break;
case 0x01af /* Prot4Rev */: case 0x01bc /* Prot4RevPass */: break; /*TODO: Revision Control*/
case 0x0085 /* BoundSheet8 */: {
Directory[val.pos] = val;
opts.snames.push(val.name);
@ -380,11 +362,9 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
objects = [];
opts.arrayf = arrayf = [];
colinfo = []; rowinfo = [];
defwidth = defheight = 0;
seencol = false;
wsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };
} break;
case 0x0203 /* Number */: case 0x0003 /* BIFF2NUM */: case 0x0002 /* BIFF2INT */: {
if(out["!type"] == "chart") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;
temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'}/*:any*/);
@ -538,8 +518,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(cc && cc.l) cc.l.Tooltip = val[1];
}
} break;
/* Comments */
case 0x001c /* Note */: {
if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */
cc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];
@ -560,13 +538,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
cmnt = {a:val[1],t:noteobj.TxO.t};
cc.c.push(cmnt);
} break;
case 0x105c /* ClrtClient */: break;
case 0x087d /* XFExt */: update_xfext(XFs[val.ixfe], val.ext); break;
case 0x0055 /* DefColWidth */: defwidth = val; break;
case 0x0225 /* DefaultRowHeight */: defheight = val[1]; break; // TODO: flags
case 0x007d /* ColInfo */: {
if(!opts.cellStyles) break;
while(val.e >= val.s) {
@ -584,7 +556,6 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
rowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);
}
} break;
case 0x0026 /* LeftMargin */:
case 0x0027 /* RightMargin */:
case 0x0028 /* TopMargin */:
@ -592,161 +563,126 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
if(!out['!margins']) default_margins(out['!margins'] = {});
out['!margins'][({0x26: "left", 0x27:"right", 0x28:"top", 0x29:"bottom"})[RecordType]] = val;
break;
case 0x001d /* Selection */: break;
case 0x00a1 /* Setup */: // TODO
if(!out['!margins']) default_margins(out['!margins'] = {});
out['!margins'].header = val.header;
out['!margins'].footer = val.footer;
break;
case 0x023e /* Window2 */: // TODO
// $FlowIgnore
if(val.RTL) Workbook.Views[0].RTL = true;
break;
case 0x0014 /* Header */: // TODO
case 0x0015 /* Footer */: // TODO
case 0x0083 /* HCenter */: // TODO
case 0x0084 /* VCenter */: // TODO
case 0x004d /* Pls */: // TODO
case 0x00ab /* GCW */:
case 0x0094 /* LHRecord */:
case 0x00d7 /* DBCell */: // TODO
case 0x01c2 /* EntExU2 */: // TODO
case 0x00b0 /* SxView */: // TODO
case 0x00b1 /* Sxvd */: // TODO
case 0x00b2 /* SXVI */: // TODO
case 0x0100 /* SXVDEx */: // TODO
case 0x00b4 /* SxIvd */: // TODO
case 0x00cd /* SXString */: // TODO
case 0x0097 /* Sync */:
case 0x0087 /* Addin */:
case 0x00c5 /* SXDI */: // TODO
case 0x00b5 /* SXLI */: // TODO
case 0x00f1 /* SXEx */: // TODO
case 0x0802 /* QsiSXTag */: // TODO
case 0x0868 /* Feat */:
case 0x0867 /* FeatHdr */: case 0x0871 /* FeatHdr11 */:
case 0x0872 /* Feature11 */: case 0x0878 /* Feature12 */: case 0x0877 /* List12 */: break;
case 0x008c /* Country */: country = val; break;
case 0x01c1 /* RecalcId */:
case 0x0099 /* DxGCol */: // TODO: htmlify
case 0x1060 /* Fbi */: case 0x1068 /* Fbi2 */: case 0x1066 /* GelFrame */:
case 0x0031 /* Font */: // TODO
case 0x087c /* XFCRC */: // TODO
case 0x0293 /* Style */: // TODO
case 0x0892 /* StyleExt */: break; // TODO
case 0x0092 /* Palette */: palette = val; break;
case 0x0896 /* Theme */: themes = val; break;
/* Protection */
case 0x00dd /* ScenarioProtect */:
case 0x0063 /* ObjProtect */: break;
/* Conditional Formatting */
case 0x0879 /* CondFmt12 */:
/* Table */
case 0x0236 /* Table */: // TODO
case 0x088e /* TableStyles */: // TODO
case 0x088f /* TableStyle */: // TODO
case 0x0890 /* TableStyleElement */: // TODO
/* PivotTable */
case 0x00d5 /* SXStreamID */: // TODO
case 0x00e3 /* SXVS */: // TODO
case 0x0051 /* DConRef */: // TODO
case 0x0864 /* SXAddl */: // TODO
case 0x01b5 /* DConBin */: // TODO
case 0x0052 /* DConName */: // TODO
case 0x00b6 /* SXPI */: // TODO
case 0x00fb /* SxFormat */: // TODO
case 0x00f7 /* SxSelect */: // TODO
case 0x00f0 /* SxRule */: // TODO
case 0x00f2 /* SxFilt */: // TODO
case 0x00f5 /* SxItm */: // TODO
case 0x00f4 /* SxDXF */: // TODO
/* Scenario Manager */
case 0x00ae /* ScenMan */:
/* Data Consolidation */
case 0x0050 /* DCon */:
/* Watched Cell */
case 0x086c /* CellWatch */:
/* Print Settings */
case 0x002a /* PrintRowCol */:
case 0x002b /* PrintGrid */:
case 0x0033 /* PrintSize */:
case 0x0059 /* XCT */:
case 0x005a /* CRN */:
case 0x00a0 /* Scl */: {
//console.log("Zoom Level:", val[0]/val[1],val);
}
case 0x0862 /* SheetExt */: {
/* empty */
}
/* VBA */
case 0x01bd /* ObNoMacros */: {
/* empty */
}
case 0x00d3 /* ObProj */: {
/* empty */
}
case 0x008c /* Country */: country = val; break;
case 0x01ba /* CodeName */: {
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
else wsprops.CodeName = val || wsprops.name;
}
case 0x0897 /* GUIDTypeLib */: {
/* empty */
}
case 0x080b /* WOpt */: // TODO: WTF?
} break;
case 0x0055 /* DefColWidth */:
case 0x0225 /* DefaultRowHeight */:
case 0x005e /* Uncalced */:
case 0x01af /* Prot4Rev */: case 0x01bc /* Prot4RevPass */: /*TODO: Revision Control*/
case 0x005b /* FileSharing */:
case 0x00ff /* ExtSST */:
case 0x0863 /* BookExt */:
case 0x08a6 /* RichTextStream */:
case 0x00e9 /* BkHim */:
case 0x0060 /* Template */:
case 0x00da /* BookBool */:
case 0x0160 /* UsesELFs */:
case 0x089a /* MTRSettings */:
case 0x000b: case 0x020b /* Index */:
case 0x105c /* ClrtClient */:
case 0x001d /* Selection */:
case 0x0014 /* Header */:
case 0x0015 /* Footer */:
case 0x0083 /* HCenter */:
case 0x0084 /* VCenter */:
case 0x004d /* Pls */:
case 0x00ab /* GCW */:
case 0x0094 /* LHRecord */:
case 0x00d7 /* DBCell */:
case 0x01c2 /* EntExU2 */:
case 0x00b0 /* SxView */:
case 0x00b1 /* Sxvd */:
case 0x00b2 /* SXVI */:
case 0x0100 /* SXVDEx */:
case 0x00b4 /* SxIvd */:
case 0x00cd /* SXString */:
case 0x0097 /* Sync */:
case 0x0087 /* Addin */:
case 0x00c5 /* SXDI */:
case 0x00b5 /* SXLI */:
case 0x00f1 /* SXEx */:
case 0x0802 /* QsiSXTag */:
case 0x0868 /* Feat */:
case 0x0867 /* FeatHdr */: case 0x0871 /* FeatHdr11 */:
case 0x0872 /* Feature11 */: case 0x0878 /* Feature12 */: case 0x0877 /* List12 */:
case 0x01c1 /* RecalcId */:
case 0x0099 /* DxGCol */:
case 0x1060 /* Fbi */: case 0x1068 /* Fbi2 */: case 0x1066 /* GelFrame */:
case 0x0031 /* Font */:
case 0x087c /* XFCRC */:
case 0x0293 /* Style */:
case 0x0892 /* StyleExt */:
case 0x00dd /* ScenarioProtect */:
case 0x0063 /* ObjProtect */:
case 0x0879 /* CondFmt12 */:
case 0x0236 /* Table */:
case 0x088e /* TableStyles */:
case 0x088f /* TableStyle */:
case 0x0890 /* TableStyleElement */:
case 0x00d5 /* SXStreamID */:
case 0x00e3 /* SXVS */:
case 0x0051 /* DConRef */:
case 0x0864 /* SXAddl */:
case 0x01b5 /* DConBin */:
case 0x0052 /* DConName */:
case 0x00b6 /* SXPI */:
case 0x00fb /* SxFormat */:
case 0x00f7 /* SxSelect */:
case 0x00f0 /* SxRule */:
case 0x00f2 /* SxFilt */:
case 0x00f5 /* SxItm */:
case 0x00f4 /* SxDXF */:
case 0x00ae /* ScenMan */:
case 0x0050 /* DCon */:
case 0x086c /* CellWatch */:
case 0x002a /* PrintRowCol */:
case 0x002b /* PrintGrid */:
case 0x0033 /* PrintSize */:
case 0x0059 /* XCT */:
case 0x005a /* CRN */:
case 0x00a0 /* Scl */:
case 0x0862 /* SheetExt */:
case 0x01bd /* ObNoMacros */:
case 0x00d3 /* ObProj */:
case 0x0897 /* GUIDTypeLib */:
case 0x080b /* WOpt */:
case 0x00ef /* PhoneticInfo */:
case 0x00de /* OleObjectSize */:
/* Differential Formatting */
case 0x088d /* DXF */:
/* Data Validation */
case 0x01be /* Dv */: case 0x01b2 /* DVal */:
/* Data Series */
case 0x1051 /* BRAI */: case 0x1003 /* Series */: case 0x100d /* SeriesText */: break;
/* Data Connection */
case 0x1051 /* BRAI */: case 0x1003 /* Series */: case 0x100d /* SeriesText */:
case 0x0876 /* DConn */:
case 0x00dc /* DbOrParamQry */:
case 0x0803 /* DBQueryExt */:
case 0x080a /* OleDbConn */:
case 0x0804 /* ExtString */:
/* Formatting */
case 0x104e /* IFmtRecord */:
case 0x01b0 /* CondFmt */: case 0x01b1 /* CF */: case 0x087a /* CF12 */: case 0x087b /* CFEx */:
/* Explicitly Ignored */
case 0x01c0 /* Excel9File */:
case 0x1001 /* Units */:
case 0x00e1 /* InterfaceHdr' */: case 0x00c1 /* Mms */: case 0x00e2 /* InterfaceEnd */: case 0x0161 /* DSF */:
case 0x009c /* BuiltInFnGroupCount */: /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;
/* View Stuff */
case 0x003d /* Window1 */: case 0x008d /* HideObj */: case 0x0082 /* GridSet */: case 0x0080 /* Guts */:
case 0x01a9 /* UserBView */: case 0x01aa /* UserSViewBegin */: case 0x01aa /* UserSViewEnd */:
case 0x01a9 /* UserBView */: case 0x01aa /* UserSViewBegin */: case 0x01ab /* UserSViewEnd */:
case 0x0041 /* Pane */:
/* Chart */
case 0x1063 /* Dat */:
case 0x1033 /* Begin */: case 0x1033 /* End */:
case 0x0852 /* StartBlock */: case 0x0853 /* EndBlock */: break;
case 0x1033 /* Begin */: case 0x1034 /* End */:
case 0x0852 /* StartBlock */: case 0x0853 /* EndBlock */:
case 0x1032 /* Frame */: case 0x101a /* Area */:
case 0x101d /* Axis */: case 0x1021 /* AxisLine */: case 0x101e /* Tick */:
case 0x1046 /* AxesUsed */:
@ -767,69 +703,41 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
case 0x1050 /* AlRuns */: case 0x1027 /* ObjectLink */:
case 0x1065 /* SIIndex */:
case 0x100c /* AttachedLabel */: case 0x0857 /* YMult */:
/* Chart Group */
case 0x1018 /* Line */: case 0x1017 /* Bar */:
case 0x103f /* Surf */:
/* Axis Group */
case 0x1041 /* AxisParent */:
case 0x104f /* Pos */:
case 0x101f /* ValueRange */:
/* Pivot Chart */
case 0x0810 /* SXViewEx9 */: // TODO
case 0x0810 /* SXViewEx9 */:
case 0x0858 /* SXViewLink */:
case 0x0859 /* PivotChartBits */:
case 0x1048 /* SBaseRef */:
case 0x08a5 /* TextPropsStream */:
/* Chart Misc */
case 0x08c9 /* LnExt */:
case 0x08ca /* MkrExt */:
case 0x08cb /* CrtCoopt */:
/* Query Table */
case 0x01ad /* Qsi */: case 0x0807 /* Qsif */: case 0x0806 /* Qsir */: case 0x0802 /* QsiSXTag */:
case 0x01ad /* Qsi */: case 0x0807 /* Qsif */: case 0x0806 /* Qsir */:
case 0x0805 /* TxtQry */:
/* Filter */
case 0x009b /* FilterMode */:
case 0x009e /* AutoFilter */: case 0x009d /* AutoFilterInfo */:
case 0x087e /* AutoFilter12 */:
case 0x0874 /* DropDownObjIds */:
case 0x0090 /* Sort */:
case 0x0895 /* SortData */:
/* Drawing */
case 0x08a4 /* ShapePropsStream */:
case 0x00ec /* MsoDrawing */: case 0x00eb /* MsoDrawingGroup*/: case 0x00ed /* MsoDrawingSelection */:
/* Pub Stuff */
case 0x0801 /* WebPub */: case 0x08c0 /* AutoWebPub */:
/* Print Stuff */
case 0x089c /* HeaderFooter */: case 0x0866 /* HFPicture */: case 0x088b /* PLV */:
case 0x001b /* HorizontalPageBreaks */: case 0x001a /* VerticalPageBreaks */:
/* Behavioral */
case 0x0040 /* Backup */: case 0x089b /* CompressPictures */: case 0x088c /* Compat12 */:
/* Should not Happen */
case 0x003c /* 'Continue' */: case 0x087f /* 'ContinueFrt12' */:
/* Future Records */
case 0x085a /* FrtFontList */: case 0x0851 /* 'FrtWrapper' */:
/* BIFF5 records */
case 0x00ea /* TabIdConf */: case 0x103e /* Radar */: case 0x1040 /* RadarArea */: case 0x103d /* DropBar */: case 'Intl': case 'CoordList': case 'SerAuxErrBar':
/* BIFF2-4 records */
case 0x0045 /* BIFF2FONTCLR */: case 0x001f /* BIFF2FMTCNT */: case 0x0032 /* BIFF2FONTXTRA */:
case 0x0043 /* BIFF2XF */: case 0x0243 /* BIFF3XF */: case 0x0443 /* BIFF4XF */:
case 0x0044 /* BIFF2XFINDEX */:
case 0x0056 /* BIFF4FMTCNT */: case 0x0008 /* BIFF2ROW */: case 0x003e /* BIFF2WINDOW2 */:
/* Miscellaneous */
case 0x00af /* SCENARIO */: case 0x01b5 /* DConBin */: case 0x103c /* PicF */: case 0x086a /* DataLabExt */:
case 0x00af /* SCENARIO */: case 0x103c /* PicF */: case 0x086a /* DataLabExt */:
case 0x01b9 /* Lel */: case 0x1061 /* BopPop */: case 0x1067 /* BopPopCustom */: case 0x0813 /* RealTimeData */:
case 0x0095 /* LHNGraph */: case 0x009a /* FnGroupName */: case 0x00c2 /* AddMenu */: case 0x0098 /* LPr */:
case 0x08c1 /* ListObj */: case 0x08c2 /* ListField */:

@ -163,7 +163,7 @@ function write_ws_biff8_hlinks(ba/*:BufArray*/, ws) {
delete ws['!links'];
}
function write_ws_cols_biff8(ba, cols, ws) {
function write_ws_cols_biff8(ba, cols) {
if(!cols) return;
var cnt = 0;
cols.forEach(function(col, idx) {
@ -236,7 +236,7 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) {
write_biff_rec(ba, 0x0083 /* HCenter */, writebool(false));
write_biff_rec(ba, 0x0084 /* VCenter */, writebool(false));
/* ... */
if(b8) write_ws_cols_biff8(ba, ws["!cols"], ws);
if(b8) write_ws_cols_biff8(ba, ws["!cols"]);
/* ... */
write_biff_rec(ba, 0x200, write_Dimensions(range, opts));
/* ... */
@ -387,7 +387,7 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
if(!ws || !ws["!ref"]) continue;
var range = decode_range(ws["!ref"]);
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.");
}
}

@ -60,43 +60,6 @@ function parse_varint49(buf, ptr) {
ptr[0] = l;
return usz;
}
function write_varint49(v) {
var usz = new Uint8Array(7);
usz[0] = v & 127;
var L = 1;
sz:
if (v > 127) {
usz[L - 1] |= 128;
usz[L] = v >> 7 & 127;
++L;
if (v <= 16383)
break sz;
usz[L - 1] |= 128;
usz[L] = v >> 14 & 127;
++L;
if (v <= 2097151)
break sz;
usz[L - 1] |= 128;
usz[L] = v >> 21 & 127;
++L;
if (v <= 268435455)
break sz;
usz[L - 1] |= 128;
usz[L] = v / 256 >>> 21 & 127;
++L;
if (v <= 34359738367)
break sz;
usz[L - 1] |= 128;
usz[L] = v / 65536 >>> 21 & 127;
++L;
if (v <= 4398046511103)
break sz;
usz[L - 1] |= 128;
usz[L] = v / 16777216 >>> 21 & 127;
++L;
}
return usz.slice(0, L);
}
function varint_to_i32(buf) {
var l = 0, i32 = buf[l] & 127;
varint:
@ -162,16 +125,6 @@ function parse_shallow(buf) {
}
return out;
}
function write_shallow(proto) {
var out = [];
proto.forEach(function(field, idx) {
field.forEach(function(item) {
out.push(write_varint49(idx * 8 + item.type));
out.push(item.data);
});
});
return u8concat(out);
}
function mappa(data, cb) {
if (!data)
return [];

@ -13,7 +13,7 @@ function safe_parse_wbrels(wbrels, sheets) {
return !wbrels || wbrels.length === 0 ? null : wbrels;
}
function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/*:number*/, sheetRels, sheets, stype/*:string*/, opts, wb, themes, styles, people) {
function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/*:number*/, sheetRels, sheets, stype/*:string*/, opts, wb, themes, styles) {
try {
sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);
var data = getzipdata(zip, path);
@ -36,7 +36,7 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/
sheets[sheet] = _ws;
/* scan rels for comments and threaded comments */
var tcomments = [], tauthors = [];
var tcomments = [];
if(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {
var dfile = "";
if(sheetRels[sheet][n].Type == RELS.CMNT) {

@ -79,8 +79,9 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
if(ws) {
var comments = ws['!comments'];
var need_vml = false;
var cf = "";
if(comments && comments.length > 0) {
var cf = "xl/comments" + rId + "." + wbext;
cf = "xl/comments" + rId + "." + wbext;
zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
ct.comments.push(cf);
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
@ -216,6 +217,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
if(ws) {
var comments = ws['!comments'];
var need_vml = false;
var cf = "";
if(comments && comments.length > 0) {
var needtc = false;
comments.forEach(function(carr) {
@ -228,7 +230,7 @@ function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
add_rels(wsrels, -1, "../threadedComments/threadedComment" + rId + "." + wbext, RELS.TCMNT);
}
var cf = "xl/comments" + rId + "." + wbext;
cf = "xl/comments" + rId + "." + wbext;
zip_add_file(zip, cf, write_comments_xml(comments, opts));
ct.comments.push(cf);
add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

29
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

6212
dist/xlsx.extendscript.js generated vendored

File diff suppressed because it is too large Load Diff

31
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

@ -35,6 +35,7 @@ The [`demos` directory](demos/) includes sample projects for:
- [`canvas-datagrid`](demos/datagrid/)
- [`x-spreadsheet`](demos/xspreadsheet/)
- [`react-data-grid`](demos/react/modify/)
- [`vue3-table-light`](demos/vue/modify/)
- [`Swift JSC and other engines`](demos/altjs/)
- [`"serverless" functions`](demos/function/)
- [`internet explorer`](demos/oldie/)

@ -80,6 +80,14 @@ export default function App() {
</details>
<details>
<summary><b>Previewing data in a VueJS data grid</b> (click to show)</summary>
[`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) is a simple
VueJS 3 data table. It is featured [in the VueJS demo](/demos/vue/modify/).
</details>
<details>
<summary><b>Populating a database (SQL or no-SQL)</b> (click to show)</summary>

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

@ -3,8 +3,8 @@ function parse_xlmeta_xml(data, name, opts) {
if (!data)
return out;
var pass = false;
var metatype = "";
data.replace(tagregex, function(x, idx) {
var metatype = 2;
data.replace(tagregex, function(x) {
var y = parsexmltag(x);
switch (strip_ns(y[0])) {
case "<?xml":
@ -29,24 +29,24 @@ function parse_xlmeta_xml(data, name, opts) {
case "</bk>":
break;
case "<rc":
if (metatype == "cell")
if (metatype == 1)
out.Cell.push({ type: out.Types[y.t - 1].name, index: +y.v });
else if (metatype == "value")
else if (metatype == 0)
out.Value.push({ type: out.Types[y.t - 1].name, index: +y.v });
break;
case "</rc>":
break;
case "<cellMetadata":
metatype = "cell";
metatype = 1;
break;
case "</cellMetadata>":
metatype = "";
metatype = 2;
break;
case "<valueMetadata":
metatype = "value";
metatype = 0;
break;
case "</valueMetadata>":
metatype = "";
metatype = 2;
break;
case "<extLst":
case "<extLst>":

@ -563,6 +563,7 @@ The [`demos` directory](demos/) includes sample projects for:
- [`canvas-datagrid`](demos/datagrid/)
- [`x-spreadsheet`](demos/xspreadsheet/)
- [`react-data-grid`](demos/react/modify/)
- [`vue3-table-light`](demos/vue/modify/)
- [`Swift JSC and other engines`](demos/altjs/)
- [`"serverless" functions`](demos/function/)
- [`internet explorer`](demos/oldie/)
@ -1721,6 +1722,11 @@ export default function App() {
[`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) is a simple
VueJS 3 data table. It is featured [in the VueJS demo](/demos/vue/modify/).
The [`database` demo](/demos/database/) includes examples of working with
databases and query results.

@ -12,7 +12,7 @@ function write_BrtMdtinfo(data) {
write_XLWideString(data.name, o);
return o.slice(0, o.l);
}
function parse_BrtMdb(data, length) {
function parse_BrtMdb(data) {
var out = [];
var cnt = data.read_shift(4);
while (cnt-- > 0)
@ -34,7 +34,7 @@ function write_BrtBeginEsfmd(cnt, name) {
write_XLWideString(name, o);
return o.slice(0, o.l);
}
function parse_BrtBeginEsmdb(data, length) {
function parse_BrtBeginEsmdb(data) {
data.l += 4;
return data.read_shift(4) != 0;
}
@ -49,7 +49,7 @@ function parse_xlmeta_bin(data, name, _opts) {
var opts = _opts || {};
var state = [];
var pass = false;
var esmdb = 0;
var metatype = 2;
recordhopper(data, function(val, R, RT) {
switch (RT) {
case 335:
@ -57,11 +57,17 @@ function parse_xlmeta_bin(data, name, _opts) {
break;
case 51:
val.forEach(function(r) {
(esmdb == 1 ? out.Cell : out.Value).push({ type: out.Types[r[0] - 1].name, index: r[1] });
if (metatype == 1)
out.Cell.push({ type: out.Types[r[0] - 1].name, index: r[1] });
else if (metatype == 0)
out.Value.push({ type: out.Types[r[0] - 1].name, index: r[1] });
});
break;
case 337:
esmdb = val ? 1 : 0;
metatype = val ? 1 : 0;
break;
case 338:
metatype = 2;
break;
case 35:
state.push(RT);

@ -24,7 +24,7 @@ function write_BrtMdtinfo(data: BrtMdtinfo): RawData {
/* [MS-XLSB] 2.4.697 BrtMdb */
type Mdir = [number, number]; // "t", "v" in XLSX parlance
type BrtMdb = Mdir[];
function parse_BrtMdb(data: ReadableData, length: number): BrtMdb {
function parse_BrtMdb(data: ReadableData/*, length: number*/): BrtMdb {
var out: Mdir[] = [];
var cnt = data.read_shift(4);
while(cnt-- > 0) out.push([data.read_shift(4), data.read_shift(4)]);
@ -49,7 +49,7 @@ function write_BrtBeginEsfmd(cnt: number, name: string): RawData {
}
/* [MS-XLSB] 2.4.73 BrtBeginEsmdb */
function parse_BrtBeginEsmdb(data: ReadableData, length: number): boolean {
function parse_BrtBeginEsmdb(data: ReadableData/*, length: number*/): boolean {
data.l += 4;
return data.read_shift(4) != 0;
}
@ -66,14 +66,13 @@ function parse_xlmeta_bin(data, name: string, _opts?: ParseXLMetaOptions): XLMet
var opts = _opts || {};
var state: number[] = [];
var pass = false;
var esmdb: 0 | 1 = 0;
var metatype: 0 | 1 | 2 = 2;
recordhopper(data, (val, R, RT) => {
switch(RT) {
// case 0x014C: /* BrtBeginMetadata */
// case 0x014D: /* BrtEn