@loaders.gl/excel 4.0.0-alpha.5 → 4.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/dist.min.js +1444 -287
  3. package/dist/es5/bundle.js +6 -0
  4. package/dist/es5/bundle.js.map +1 -0
  5. package/dist/es5/excel-loader.js +29 -0
  6. package/dist/es5/excel-loader.js.map +1 -0
  7. package/dist/es5/index.js +42 -0
  8. package/dist/es5/index.js.map +1 -0
  9. package/dist/es5/lib/encode-excel.js +2 -0
  10. package/dist/es5/lib/encode-excel.js.map +1 -0
  11. package/dist/es5/lib/parse-excel.js +31 -0
  12. package/dist/es5/lib/parse-excel.js.map +1 -0
  13. package/dist/es5/workers/excel-worker.js +6 -0
  14. package/dist/es5/workers/excel-worker.js.map +1 -0
  15. package/dist/esm/bundle.js +4 -0
  16. package/dist/esm/bundle.js.map +1 -0
  17. package/dist/esm/excel-loader.js +21 -0
  18. package/dist/esm/excel-loader.js.map +1 -0
  19. package/dist/esm/index.js +14 -0
  20. package/dist/esm/index.js.map +1 -0
  21. package/dist/esm/lib/encode-excel.js +2 -0
  22. package/dist/esm/lib/encode-excel.js.map +1 -0
  23. package/dist/esm/lib/parse-excel.js +25 -0
  24. package/dist/esm/lib/parse-excel.js.map +1 -0
  25. package/dist/esm/workers/excel-worker.js +4 -0
  26. package/dist/esm/workers/excel-worker.js.map +1 -0
  27. package/dist/excel-loader.d.ts +3 -13
  28. package/dist/excel-loader.d.ts.map +1 -1
  29. package/dist/excel-loader.js +29 -18
  30. package/dist/excel-worker.js +1502 -311
  31. package/dist/index.d.ts +4 -15
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +16 -7
  34. package/dist/lib/encode-excel.js +80 -1
  35. package/dist/lib/parse-excel.d.ts +3 -1
  36. package/dist/lib/parse-excel.d.ts.map +1 -1
  37. package/dist/lib/parse-excel.js +44 -29
  38. package/dist/workers/excel-worker.js +5 -4
  39. package/package.json +6 -6
  40. package/src/excel-loader.ts +4 -1
  41. package/src/index.ts +10 -6
  42. package/src/lib/parse-excel.ts +5 -2
  43. package/dist/bundle.js.map +0 -1
  44. package/dist/excel-loader.js.map +0 -1
  45. package/dist/index.js.map +0 -1
  46. package/dist/lib/encode-excel.js.map +0 -1
  47. package/dist/lib/parse-excel.js.map +0 -1
  48. package/dist/workers/excel-worker.js.map +0 -1
package/dist/dist.min.js CHANGED
@@ -68,7 +68,7 @@
68
68
  // ../../node_modules/xlsx/dist/cpexcel.js
69
69
  var require_cpexcel = __commonJS({
70
70
  "../../node_modules/xlsx/dist/cpexcel.js"(exports, module) {
71
- var cptable2 = { version: "1.14.0" };
71
+ var cptable2 = { version: "1.15.0" };
72
72
  cptable2[437] = function() {
73
73
  var d = "\0\x07\b \n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0", D = [], e = {};
74
74
  for (var i = 0; i != d.length; ++i) {
@@ -3131,6 +3131,15 @@
3131
3131
  }
3132
3132
  return { "enc": e, "dec": D };
3133
3133
  }();
3134
+ cptable2[28591] = function() {
3135
+ var d = "\0\x07\b \n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF", D = [], e = {};
3136
+ for (var i = 0; i != d.length; ++i) {
3137
+ if (d.charCodeAt(i) !== 65533)
3138
+ e[d.charAt(i)] = i;
3139
+ D[i] = d.charAt(i);
3140
+ }
3141
+ return { "enc": e, "dec": D };
3142
+ }();
3134
3143
  if (typeof module !== "undefined" && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === "undefined")
3135
3144
  module.exports = cptable2;
3136
3145
  (function(root, factory) {
@@ -3894,7 +3903,7 @@
3894
3903
  module.exports = e();
3895
3904
  else if (typeof define == "function" && define.amd && typeof DO_NOT_EXPORT_JSZIP == "undefined") {
3896
3905
  JSZipSync = e();
3897
- define([], e);
3906
+ define("j", [], e);
3898
3907
  } else {
3899
3908
  var f;
3900
3909
  typeof globalThis != "undefined" ? f = globalThis : typeof window != "undefined" ? f = window : typeof global != "undefined" ? f = global : typeof $ != "undefined" && $.global ? f = $.global : typeof self != "undefined" && (f = self), f.JSZipSync = e();
@@ -9544,7 +9553,7 @@
9544
9553
  "../../node_modules/xlsx/xlsx.js"(exports, module) {
9545
9554
  var XLSX = {};
9546
9555
  function make_xlsx_lib(XLSX2) {
9547
- XLSX2.version = "0.17.0";
9556
+ XLSX2.version = "0.17.5";
9548
9557
  var current_codepage = 1200, current_ansi = 1252;
9549
9558
  if (typeof module !== "undefined" && typeof __require !== "undefined") {
9550
9559
  if (typeof cptable === "undefined") {
@@ -11705,7 +11714,8 @@
11705
11714
  break;
11706
11715
  fat_addrs.push(q2);
11707
11716
  }
11708
- sleuth_fat(__readInt32LE(sector, ssz - 4), cnt - 1, sectors, ssz, fat_addrs);
11717
+ if (cnt >= 1)
11718
+ sleuth_fat(__readInt32LE(sector, ssz - 4), cnt - 1, sectors, ssz, fat_addrs);
11709
11719
  }
11710
11720
  }
11711
11721
  function get_sector_list(sectors, start, fat_addrs, ssz, chkd) {
@@ -13059,8 +13069,10 @@
13059
13069
  }
13060
13070
  function fuzzynum(s) {
13061
13071
  var v = Number(s);
13062
- if (!isNaN(v))
13072
+ if (isFinite(v))
13063
13073
  return v;
13074
+ if (!isNaN(v))
13075
+ return NaN;
13064
13076
  if (!/\d/.test(s))
13065
13077
  return v;
13066
13078
  var wt = 1;
@@ -13141,11 +13153,11 @@
13141
13153
  }
13142
13154
  function safegetzipfile(zip, file) {
13143
13155
  var k = zip.FullPaths || keys(zip.files);
13144
- var f = file.toLowerCase(), g = f.replace(/\//g, "\\");
13156
+ var f = file.toLowerCase().replace(/[\/]/g, "\\"), g = f.replace(/\\/g, "/");
13145
13157
  for (var i2 = 0; i2 < k.length; ++i2) {
13146
- var n = k[i2].toLowerCase();
13158
+ var n = k[i2].replace(/^Root Entry[\/]/, "").toLowerCase();
13147
13159
  if (f == n || g == n)
13148
- return zip.files[k[i2]];
13160
+ return zip.files ? zip.files[k[i2]] : zip.FileIndex[i2];
13149
13161
  }
13150
13162
  return null;
13151
13163
  }
@@ -14070,7 +14082,7 @@
14070
14082
  for (cntbyte = 1; cntbyte < 4 && tmpbyte & 128; ++cntbyte)
14071
14083
  length += ((tmpbyte = data.read_shift(1)) & 127) << 7 * cntbyte;
14072
14084
  tgt = data.l + length;
14073
- var d = (R.f || parsenoop)(data, length, opts);
14085
+ var d = R.f && R.f(data, length, opts);
14074
14086
  data.l = tgt;
14075
14087
  if (cb(d, R.n, RT))
14076
14088
  return;
@@ -14331,11 +14343,12 @@
14331
14343
  idx = 10 * idx + cc;
14332
14344
  }
14333
14345
  o.s.r = --idx;
14334
- if (i2 === len || range.charCodeAt(++i2) === 58) {
14346
+ if (i2 === len || cc != 10) {
14335
14347
  o.e.c = o.s.c;
14336
14348
  o.e.r = o.s.r;
14337
14349
  return o;
14338
14350
  }
14351
+ ++i2;
14339
14352
  for (idx = 0; i2 != len; ++i2) {
14340
14353
  if ((cc = range.charCodeAt(i2) - 64) < 1 || cc > 26)
14341
14354
  break;
@@ -14370,6 +14383,8 @@
14370
14383
  return cell.w;
14371
14384
  if (cell.t == "d" && !cell.z && o && o.dateNF)
14372
14385
  cell.z = o.dateNF;
14386
+ if (cell.t == "e")
14387
+ return BErr[cell.v] || cell.v;
14373
14388
  if (v == void 0)
14374
14389
  return safe_format_cell(cell, cell.v);
14375
14390
  return safe_format_cell(cell, v);
@@ -14436,7 +14451,10 @@
14436
14451
  if (cell.v === null) {
14437
14452
  if (cell.f)
14438
14453
  cell.t = "n";
14439
- else if (!o.sheetStubs)
14454
+ else if (o.nullError) {
14455
+ cell.t = "e";
14456
+ cell.v = 0;
14457
+ } else if (!o.sheetStubs)
14440
14458
  continue;
14441
14459
  else
14442
14460
  cell.t = "z";
@@ -14563,6 +14581,19 @@
14563
14581
  o.write_shift(1, 0);
14564
14582
  return o;
14565
14583
  }
14584
+ function parse_XLSBShortCell(data) {
14585
+ var iStyleRef = data.read_shift(2);
14586
+ iStyleRef += data.read_shift(1) << 16;
14587
+ data.l++;
14588
+ return { c: -1, iStyleRef };
14589
+ }
14590
+ function write_XLSBShortCell(cell, o) {
14591
+ if (o == null)
14592
+ o = new_buf(4);
14593
+ o.write_shift(3, cell.iStyleRef || cell.s);
14594
+ o.write_shift(1, 0);
14595
+ return o;
14596
+ }
14566
14597
  var parse_XLSBCodeName = parse_XLWideString;
14567
14598
  var write_XLSBCodeName = write_XLWideString;
14568
14599
  function parse_XLNullableWideString(data) {
@@ -14786,7 +14817,10 @@
14786
14817
  27: { n: "ContentStatus", t: VT_STRING },
14787
14818
  28: { n: "Language", t: VT_STRING },
14788
14819
  29: { n: "Version", t: VT_STRING },
14789
- 255: {}
14820
+ 255: {},
14821
+ 2147483648: { n: "Locale", t: VT_UI4 },
14822
+ 2147483651: { n: "Behavior", t: VT_UI4 },
14823
+ 1919054434: {}
14790
14824
  };
14791
14825
  var SummaryPIDSI = {
14792
14826
  1: { n: "CodePage", t: VT_I2 },
@@ -14808,18 +14842,11 @@
14808
14842
  17: { n: "Thumbnail", t: VT_CF },
14809
14843
  18: { n: "Application", t: VT_STRING },
14810
14844
  19: { n: "DocSecurity", t: VT_I4 },
14811
- 255: {}
14812
- };
14813
- var SpecialProperties = {
14845
+ 255: {},
14814
14846
  2147483648: { n: "Locale", t: VT_UI4 },
14815
14847
  2147483651: { n: "Behavior", t: VT_UI4 },
14816
14848
  1919054434: {}
14817
14849
  };
14818
- (function() {
14819
- for (var y in SpecialProperties)
14820
- if (Object.prototype.hasOwnProperty.call(SpecialProperties, y))
14821
- DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];
14822
- })();
14823
14850
  var DocSummaryRE = evert_key(DocSummaryPIDDSI, "n");
14824
14851
  var SummaryRE = evert_key(SummaryPIDSI, "n");
14825
14852
  var CountryEnum = {
@@ -15276,7 +15303,8 @@
15276
15303
  rel.Type = y.Type;
15277
15304
  rel.Target = y.Target;
15278
15305
  rel.Id = y.Id;
15279
- rel.TargetMode = y.TargetMode;
15306
+ if (y.TargetMode)
15307
+ rel.TargetMode = y.TargetMode;
15280
15308
  var canonictarget = y.TargetMode === "External" ? y.Target : resolve_path(y.Target, currentFilePath);
15281
15309
  rels[canonictarget] = rel;
15282
15310
  hash[y.Id] = rel;
@@ -15381,7 +15409,7 @@
15381
15409
  return o.join("");
15382
15410
  }
15383
15411
  var write_meta_ods = function() {
15384
- var payload = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>SheetJS ' + XLSX2.version + "</meta:generator></office:meta></office:document-meta>";
15412
+ var payload = '<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>SheetJS ' + XLSX2.version + "</meta:generator></office:meta></office:document-meta>";
15385
15413
  return function wmo() {
15386
15414
  return payload;
15387
15415
  };
@@ -15849,6 +15877,17 @@
15849
15877
  throw new Error("VtUnalignedString must have positive length");
15850
15878
  return parse_VtStringBase(blob, t, 0);
15851
15879
  }
15880
+ function parse_VtVecLpwstrValue(blob) {
15881
+ var length = blob.read_shift(4);
15882
+ var ret = [];
15883
+ for (var i2 = 0; i2 != length; ++i2) {
15884
+ var start = blob.l;
15885
+ ret[i2] = blob.read_shift(0, "lpwstr").replace(chr0, "");
15886
+ if (blob.l - start & 2)
15887
+ blob.l += 2;
15888
+ }
15889
+ return ret;
15890
+ }
15852
15891
  function parse_VtVecUnalignedLpstrValue(blob) {
15853
15892
  var length = blob.read_shift(4);
15854
15893
  var ret = [];
@@ -15856,24 +15895,21 @@
15856
15895
  ret[i2] = blob.read_shift(0, "lpstr-cp").replace(chr0, "");
15857
15896
  return ret;
15858
15897
  }
15859
- function parse_VtVecUnalignedLpstr(blob) {
15860
- return parse_VtVecUnalignedLpstrValue(blob);
15861
- }
15862
15898
  function parse_VtHeadingPair(blob) {
15899
+ var start = blob.l;
15863
15900
  var headingString = parse_TypedPropertyValue(blob, VT_USTR);
15901
+ if (blob[blob.l] == 0 && blob[blob.l + 1] == 0 && blob.l - start & 2)
15902
+ blob.l += 2;
15864
15903
  var headerParts = parse_TypedPropertyValue(blob, VT_I4);
15865
15904
  return [headingString, headerParts];
15866
15905
  }
15867
15906
  function parse_VtVecHeadingPairValue(blob) {
15868
15907
  var cElements = blob.read_shift(4);
15869
15908
  var out = [];
15870
- for (var i2 = 0; i2 != cElements / 2; ++i2)
15909
+ for (var i2 = 0; i2 < cElements / 2; ++i2)
15871
15910
  out.push(parse_VtHeadingPair(blob));
15872
15911
  return out;
15873
15912
  }
15874
- function parse_VtVecHeadingPair(blob) {
15875
- return parse_VtVecHeadingPairValue(blob);
15876
- }
15877
15913
  function parse_dictionary(blob, CodePage) {
15878
15914
  var cnt = blob.read_shift(4);
15879
15915
  var dict = {};
@@ -15906,7 +15942,7 @@
15906
15942
  var t = blob.read_shift(2), ret, opts = _opts || {};
15907
15943
  blob.l += 2;
15908
15944
  if (type !== VT_VARIANT) {
15909
- if (t !== type && VT_CUSTOM.indexOf(type) === -1)
15945
+ if (t !== type && VT_CUSTOM.indexOf(type) === -1 && !((type & 65534) == 4126 && (t & 65534) == 4126))
15910
15946
  throw new Error("Expected type " + type + " saw " + t);
15911
15947
  }
15912
15948
  switch (type === VT_VARIANT ? t : type) {
@@ -15938,9 +15974,10 @@
15938
15974
  case 81:
15939
15975
  return parse_VtUnalignedString(blob, t).replace(chr0, "");
15940
15976
  case 4108:
15941
- return parse_VtVecHeadingPair(blob);
15977
+ return parse_VtVecHeadingPairValue(blob);
15942
15978
  case 4126:
15943
- return parse_VtVecUnalignedLpstr(blob);
15979
+ case 4127:
15980
+ return t == 4127 ? parse_VtVecLpwstrValue(blob) : parse_VtVecUnalignedLpstrValue(blob);
15944
15981
  default:
15945
15982
  throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
15946
15983
  }
@@ -16316,7 +16353,7 @@
16316
16353
  function write_Bes(v, t, o) {
16317
16354
  if (!o)
16318
16355
  o = new_buf(2);
16319
- o.write_shift(1, +v);
16356
+ o.write_shift(1, t == "e" ? +v : +!!v);
16320
16357
  o.write_shift(1, t == "e" ? 1 : 0);
16321
16358
  return o;
16322
16359
  }
@@ -16442,19 +16479,22 @@
16442
16479
  return url;
16443
16480
  }
16444
16481
  function parse_FileMoniker(blob) {
16445
- blob.l += 2;
16482
+ var cAnti = blob.read_shift(2);
16483
+ var preamble = "";
16484
+ while (cAnti-- > 0)
16485
+ preamble += "../";
16446
16486
  var ansiPath = blob.read_shift(0, "lpstr-ansi");
16447
16487
  blob.l += 2;
16448
16488
  if (blob.read_shift(2) != 57005)
16449
16489
  throw new Error("Bad FileMoniker");
16450
16490
  var sz = blob.read_shift(4);
16451
16491
  if (sz === 0)
16452
- return ansiPath.replace(/\\/g, "/");
16492
+ return preamble + ansiPath.replace(/\\/g, "/");
16453
16493
  var bytes = blob.read_shift(4);
16454
16494
  if (blob.read_shift(2) != 3)
16455
16495
  throw new Error("Bad FileMoniker");
16456
16496
  var unicodePath = blob.read_shift(bytes >> 1, "utf16le").replace(chr0, "");
16457
- return unicodePath;
16497
+ return preamble + unicodePath;
16458
16498
  }
16459
16499
  function parse_HyperlinkMoniker(blob, length) {
16460
16500
  var clsid = blob.read_shift(16);
@@ -16473,6 +16513,15 @@
16473
16513
  var o = len > 0 ? blob.read_shift(len, "utf16le").replace(chr0, "") : "";
16474
16514
  return o;
16475
16515
  }
16516
+ function write_HyperlinkString(str, o) {
16517
+ if (!o)
16518
+ o = new_buf(6 + str.length * 2);
16519
+ o.write_shift(4, 1 + str.length);
16520
+ for (var i2 = 0; i2 < str.length; ++i2)
16521
+ o.write_shift(2, str.charCodeAt(i2));
16522
+ o.write_shift(2, 0);
16523
+ return o;
16524
+ }
16476
16525
  function parse_Hyperlink(blob, length) {
16477
16526
  var end = blob.l + length;
16478
16527
  var sVer = blob.read_shift(4);
@@ -16501,6 +16550,8 @@
16501
16550
  target += "#" + Loc;
16502
16551
  if (!target)
16503
16552
  target = "#" + Loc;
16553
+ if (flags & 2 && target.charAt(0) == "/" && target.charAt(1) != "/")
16554
+ target = "file://" + target;
16504
16555
  var out = { Target: target };
16505
16556
  if (guid)
16506
16557
  out.guid = guid;
@@ -16513,7 +16564,10 @@
16513
16564
  function write_Hyperlink(hl) {
16514
16565
  var out = new_buf(512), i2 = 0;
16515
16566
  var Target = hl.Target;
16516
- var F = Target.indexOf("#") > -1 ? 31 : 23;
16567
+ if (Target.slice(0, 7) == "file://")
16568
+ Target = Target.slice(7);
16569
+ var hashidx = Target.indexOf("#");
16570
+ var F = hashidx > -1 ? 31 : 23;
16517
16571
  switch (Target.charAt(0)) {
16518
16572
  case "#":
16519
16573
  F = 28;
@@ -16529,18 +16583,18 @@
16529
16583
  out.write_shift(4, data[i2]);
16530
16584
  if (F == 28) {
16531
16585
  Target = Target.slice(1);
16532
- out.write_shift(4, Target.length + 1);
16533
- for (i2 = 0; i2 < Target.length; ++i2)
16534
- out.write_shift(2, Target.charCodeAt(i2));
16535
- out.write_shift(2, 0);
16586
+ write_HyperlinkString(Target, out);
16536
16587
  } else if (F & 2) {
16537
16588
  data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
16538
16589
  for (i2 = 0; i2 < data.length; ++i2)
16539
16590
  out.write_shift(1, parseInt(data[i2], 16));
16540
- out.write_shift(4, 2 * (Target.length + 1));
16541
- for (i2 = 0; i2 < Target.length; ++i2)
16542
- out.write_shift(2, Target.charCodeAt(i2));
16591
+ var Pretarget = hashidx > -1 ? Target.slice(0, hashidx) : Target;
16592
+ out.write_shift(4, 2 * (Pretarget.length + 1));
16593
+ for (i2 = 0; i2 < Pretarget.length; ++i2)
16594
+ out.write_shift(2, Pretarget.charCodeAt(i2));
16543
16595
  out.write_shift(2, 0);
16596
+ if (F & 8)
16597
+ write_HyperlinkString(hashidx > -1 ? Target.slice(hashidx + 1) : "", out);
16544
16598
  } else {
16545
16599
  data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" ");
16546
16600
  for (i2 = 0; i2 < data.length; ++i2)
@@ -16549,9 +16603,9 @@
16549
16603
  while (Target.slice(P * 3, P * 3 + 3) == "../" || Target.slice(P * 3, P * 3 + 3) == "..\\")
16550
16604
  ++P;
16551
16605
  out.write_shift(2, P);
16552
- out.write_shift(4, Target.length + 1);
16553
- for (i2 = 0; i2 < Target.length; ++i2)
16554
- out.write_shift(1, Target.charCodeAt(i2) & 255);
16606
+ out.write_shift(4, Target.length - 3 * P + 1);
16607
+ for (i2 = 0; i2 < Target.length - 3 * P; ++i2)
16608
+ out.write_shift(1, Target.charCodeAt(i2 + 3 * P) & 255);
16555
16609
  out.write_shift(1, 0);
16556
16610
  out.write_shift(2, 65535);
16557
16611
  out.write_shift(2, 57005);
@@ -16798,7 +16852,7 @@
16798
16852
  }
16799
16853
  function parse_WsBool(blob, length, opts) {
16800
16854
  var flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);
16801
- return { fDialog: flags & 16 };
16855
+ return { fDialog: flags & 16, fBelow: flags & 64, fRight: flags & 128 };
16802
16856
  }
16803
16857
  function parse_BoundSheet8(blob, length, opts) {
16804
16858
  var pos = blob.read_shift(4);
@@ -17001,6 +17055,8 @@
17001
17055
  return o;
17002
17056
  }
17003
17057
  function parse_Label(blob, length, opts) {
17058
+ if (opts.biffguess && opts.biff == 2)
17059
+ opts.biff = 5;
17004
17060
  var target = blob.l + length;
17005
17061
  var cell = parse_XLSCell(blob, 6);
17006
17062
  if (opts.biff == 2)
@@ -17147,7 +17203,10 @@
17147
17203
  o.write_shift(2, data.numFmtId || 0);
17148
17204
  o.write_shift(2, ixfeP << 4);
17149
17205
  }
17150
- o.write_shift(4, 0);
17206
+ var f = 0;
17207
+ if (data.numFmtId > 0 && b5)
17208
+ f |= 1024;
17209
+ o.write_shift(4, f);
17151
17210
  o.write_shift(4, 0);
17152
17211
  if (!b5)
17153
17212
  o.write_shift(4, 0);
@@ -17174,7 +17233,7 @@
17174
17233
  }
17175
17234
  function parse_BoolErr(blob, length, opts) {
17176
17235
  var cell = parse_XLSCell(blob, 6);
17177
- if (opts.biff == 2)
17236
+ if (opts.biff == 2 || length == 9)
17178
17237
  ++blob.l;
17179
17238
  var val = parse_Bes(blob, 2);
17180
17239
  cell.val = val;
@@ -17187,7 +17246,9 @@
17187
17246
  write_Bes(v, t, o);
17188
17247
  return o;
17189
17248
  }
17190
- function parse_Number(blob) {
17249
+ function parse_Number(blob, length, opts) {
17250
+ if (opts.biffguess && opts.biff == 2)
17251
+ opts.biff = 5;
17191
17252
  var cell = parse_XLSCell(blob, 6);
17192
17253
  var xnum = parse_Xnum(blob, 8);
17193
17254
  cell.val = xnum;
@@ -17532,6 +17593,21 @@
17532
17593
  o.level = flags >> 8 & 7;
17533
17594
  return o;
17534
17595
  }
17596
+ function write_ColInfo(col, idx) {
17597
+ var o = new_buf(12);
17598
+ o.write_shift(2, idx);
17599
+ o.write_shift(2, idx);
17600
+ o.write_shift(2, col.width * 256);
17601
+ o.write_shift(2, 0);
17602
+ var f = 0;
17603
+ if (col.hidden)
17604
+ f |= 1;
17605
+ o.write_shift(1, f);
17606
+ f = col.level || 0;
17607
+ o.write_shift(1, f);
17608
+ o.write_shift(2, 0);
17609
+ return o;
17610
+ }
17535
17611
  function parse_Setup(blob, length) {
17536
17612
  var o = {};
17537
17613
  if (length < 32)
@@ -17572,6 +17648,8 @@
17572
17648
  return o;
17573
17649
  }
17574
17650
  function parse_BIFF2STR(blob, length, opts) {
17651
+ if (opts.biffguess && opts.biff == 5)
17652
+ opts.biff = 2;
17575
17653
  var cell = parse_XLSCell(blob, 6);
17576
17654
  ++blob.l;
17577
17655
  var str = parse_XLUnicodeString2(blob, length - 7, opts);
@@ -17698,6 +17776,11 @@
17698
17776
  87: 1252,
17699
17777
  88: 1252,
17700
17778
  89: 1252,
17779
+ 108: 863,
17780
+ 134: 737,
17781
+ 135: 852,
17782
+ 136: 857,
17783
+ 204: 1257,
17701
17784
  255: 16969
17702
17785
  };
17703
17786
  var dbf_reverse_map = evert({
@@ -17747,10 +17830,11 @@
17747
17830
  }
17748
17831
  prep_blob(d, 0);
17749
17832
  var ft = d.read_shift(1);
17750
- var memo = false;
17833
+ var memo = !!(ft & 136);
17751
17834
  var vfp = false, l7 = false;
17752
17835
  switch (ft) {
17753
17836
  case 2:
17837
+ break;
17754
17838
  case 3:
17755
17839
  break;
17756
17840
  case 48:
@@ -17759,24 +17843,21 @@
17759
17843
  break;
17760
17844
  case 49:
17761
17845
  vfp = true;
17846
+ memo = true;
17762
17847
  break;
17763
17848
  case 131:
17764
- memo = true;
17765
17849
  break;
17766
17850
  case 139:
17767
- memo = true;
17768
17851
  break;
17769
17852
  case 140:
17770
- memo = true;
17771
17853
  l7 = true;
17772
17854
  break;
17773
17855
  case 245:
17774
- memo = true;
17775
17856
  break;
17776
17857
  default:
17777
17858
  throw new Error("DBF Unsupported Version: " + ft.toString(16));
17778
17859
  }
17779
- var nrow = 0, fpos = 0;
17860
+ var nrow = 0, fpos = 521;
17780
17861
  if (ft == 2)
17781
17862
  nrow = d.read_shift(2);
17782
17863
  d.l += 3;
@@ -17787,7 +17868,7 @@
17787
17868
  if (ft != 2)
17788
17869
  fpos = d.read_shift(2);
17789
17870
  var rlen = d.read_shift(2);
17790
- var current_cp = 1252;
17871
+ var current_cp = opts.codepage || 1252;
17791
17872
  if (ft != 2) {
17792
17873
  d.l += 16;
17793
17874
  d.read_shift(1);
@@ -17799,8 +17880,9 @@
17799
17880
  if (l7)
17800
17881
  d.l += 36;
17801
17882
  var fields = [], field = {};
17802
- var hend = fpos - 10 - (vfp ? 264 : 0), ww = l7 ? 32 : 11;
17803
- while (ft == 2 ? d.l < d.length && d[d.l] != 13 : d.l < hend) {
17883
+ var hend = Math.min(d.length, ft == 2 ? 521 : fpos - 10 - (vfp ? 264 : 0));
17884
+ var ww = l7 ? 32 : 11;
17885
+ while (d.l < hend && d[d.l] != 13) {
17804
17886
  field = {};
17805
17887
  field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l + ww)).replace(/[\u0000\r\n].*$/g, "");
17806
17888
  d.l += ww;
@@ -17825,6 +17907,9 @@
17825
17907
  if (opts.WTF)
17826
17908
  console.log("Skipping " + field.name + ":" + field.type);
17827
17909
  break;
17910
+ case "+":
17911
+ case "0":
17912
+ case "@":
17828
17913
  case "C":
17829
17914
  case "D":
17830
17915
  case "F":
@@ -17835,9 +17920,6 @@
17835
17920
  case "O":
17836
17921
  case "T":
17837
17922
  case "Y":
17838
- case "0":
17839
- case "@":
17840
- case "+":
17841
17923
  break;
17842
17924
  default:
17843
17925
  throw new Error("Unknown Field Type: " + field.type);
@@ -17845,13 +17927,9 @@
17845
17927
  }
17846
17928
  if (d[d.l] !== 13)
17847
17929
  d.l = fpos - 1;
17848
- else if (ft == 2)
17849
- d.l = 521;
17850
- if (ft != 2) {
17851
- if (d.read_shift(1) !== 13)
17852
- throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
17853
- d.l = fpos;
17854
- }
17930
+ if (d.read_shift(1) !== 13)
17931
+ throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
17932
+ d.l = fpos;
17855
17933
  var R = 0, C = 0;
17856
17934
  out[0] = [];
17857
17935
  for (C = 0; C != fields.length; ++C)
@@ -17871,8 +17949,8 @@
17871
17949
  var s = cptable.utils.decode(current_cp, dd);
17872
17950
  switch (fields[C].type) {
17873
17951
  case "C":
17874
- out[R][C] = cptable.utils.decode(current_cp, dd);
17875
- out[R][C] = out[R][C].trim();
17952
+ if (s.trim().length)
17953
+ out[R][C] = s.replace(/\s+$/, "");
17876
17954
  break;
17877
17955
  case "D":
17878
17956
  if (s.length === 8)
@@ -17888,7 +17966,7 @@
17888
17966
  out[R][C] = l7 ? dd.read_shift(-4, "i") ^ 2147483648 : dd.read_shift(4, "i");
17889
17967
  break;
17890
17968
  case "L":
17891
- switch (s.toUpperCase()) {
17969
+ switch (s.trim().toUpperCase()) {
17892
17970
  case "Y":
17893
17971
  case "T":
17894
17972
  out[R][C] = true;
@@ -17897,9 +17975,8 @@
17897
17975
  case "F":
17898
17976
  out[R][C] = false;
17899
17977
  break;
17900
- case " ":
17978
+ case "":
17901
17979
  case "?":
17902
- out[R][C] = false;
17903
17980
  break;
17904
17981
  default:
17905
17982
  throw new Error("DBF Unrecognized L:|" + s + "|");
@@ -17911,7 +17988,9 @@
17911
17988
  out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10) : dd.read_shift(4));
17912
17989
  break;
17913
17990
  case "N":
17914
- out[R][C] = +s.replace(/\u0000/g, "").trim();
17991
+ s = s.replace(/\u0000/g, "").trim();
17992
+ if (s && s != ".")
17993
+ out[R][C] = +s || 0;
17915
17994
  break;
17916
17995
  case "@":
17917
17996
  out[R][C] = new Date(dd.read_shift(-8, "f") - 621356832e5);
@@ -18159,7 +18238,7 @@
18159
18238
  S: 169,
18160
18239
  c: 170,
18161
18240
  R: 174,
18162
- B: 180,
18241
+ "B ": 180,
18163
18242
  0: 176,
18164
18243
  1: 177,
18165
18244
  2: 178,
@@ -18206,7 +18285,7 @@
18206
18285
  case "binary":
18207
18286
  return sylk_to_aoa_str(d, opts);
18208
18287
  case "buffer":
18209
- return sylk_to_aoa_str(d.toString("binary"), opts);
18288
+ return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString("binary") : a2s(d), opts);
18210
18289
  case "array":
18211
18290
  return sylk_to_aoa_str(cc2str(d), opts);
18212
18291
  }
@@ -18237,14 +18316,18 @@
18237
18316
  break;
18238
18317
  case "O":
18239
18318
  break;
18319
+ case "W":
18320
+ break;
18240
18321
  case "P":
18241
18322
  if (record[1].charAt(0) == "P")
18242
18323
  formats.push(rstr.slice(3).replace(/;;/g, ";"));
18243
18324
  break;
18244
18325
  case "C":
18245
- var C_seen_K = false, C_seen_X = false;
18326
+ var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
18246
18327
  for (rj = 1; rj < record.length; ++rj)
18247
18328
  switch (record[rj].charAt(0)) {
18329
+ case "A":
18330
+ break;
18248
18331
  case "X":
18249
18332
  C = parseInt(record[rj].slice(1)) - 1;
18250
18333
  C_seen_X = true;
@@ -18276,17 +18359,41 @@
18276
18359
  C_seen_K = true;
18277
18360
  break;
18278
18361
  case "E":
18362
+ C_seen_E = true;
18279
18363
  var formula = rc_to_a1(record[rj].slice(1), { r: R, c: C });
18280
18364
  arr[R][C] = [arr[R][C], formula];
18281
18365
  break;
18366
+ case "S":
18367
+ C_seen_S = true;
18368
+ arr[R][C] = [arr[R][C], "S5S"];
18369
+ break;
18370
+ case "G":
18371
+ break;
18372
+ case "R":
18373
+ _R = parseInt(record[rj].slice(1)) - 1;
18374
+ break;
18375
+ case "C":
18376
+ _C = parseInt(record[rj].slice(1)) - 1;
18377
+ break;
18282
18378
  default:
18283
18379
  if (opts && opts.WTF)
18284
18380
  throw new Error("SYLK bad record " + rstr);
18285
18381
  }
18286
18382
  if (C_seen_K) {
18287
- arr[R][C] = val;
18383
+ if (arr[R][C] && arr[R][C].length == 2)
18384
+ arr[R][C][0] = val;
18385
+ else
18386
+ arr[R][C] = val;
18288
18387
  next_cell_format = null;
18289
18388
  }
18389
+ if (C_seen_S) {
18390
+ if (C_seen_E)
18391
+ throw new Error("SYLK shared formula cannot have own formula");
18392
+ var shrbase = _R > -1 && arr[_R][_C];
18393
+ if (!shrbase || !shrbase[1])
18394
+ throw new Error("SYLK shared formula cannot find base");
18395
+ arr[R][C][1] = shift_formula_str(shrbase[1], { r: R - _R, c: C - _C });
18396
+ }
18290
18397
  break;
18291
18398
  case "F":
18292
18399
  var F_seen = 0;
@@ -18401,9 +18508,9 @@
18401
18508
  if (col.hidden)
18402
18509
  rec += "0";
18403
18510
  else {
18404
- if (typeof col.width == "number")
18511
+ if (typeof col.width == "number" && !col.wpx)
18405
18512
  col.wpx = width2px(col.width);
18406
- if (typeof col.wpx == "number")
18513
+ if (typeof col.wpx == "number" && !col.wch)
18407
18514
  col.wch = px2char(col.wpx);
18408
18515
  if (typeof col.wch == "number")
18409
18516
  rec += Math.round(col.wch);
@@ -18462,7 +18569,7 @@
18462
18569
  case "binary":
18463
18570
  return dif_to_aoa_str(d, opts);
18464
18571
  case "buffer":
18465
- return dif_to_aoa_str(d.toString("binary"), opts);
18572
+ return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString("binary") : a2s(d), opts);
18466
18573
  case "array":
18467
18574
  return dif_to_aoa_str(cc2str(d), opts);
18468
18575
  }
@@ -18481,7 +18588,10 @@
18481
18588
  var metadata = records[ri].trim().split(",");
18482
18589
  var type = metadata[0], value = metadata[1];
18483
18590
  ++ri;
18484
- var data = records[ri].trim();
18591
+ var data = records[ri] || "";
18592
+ while ((data.match(/["]/g) || []).length & 1 && ri < records.length - 1)
18593
+ data += "\n" + records[++ri];
18594
+ data = data.trim();
18485
18595
  switch (+type) {
18486
18596
  case -1:
18487
18597
  if (data === "BOT") {
@@ -18506,6 +18616,9 @@
18506
18616
  break;
18507
18617
  case 1:
18508
18618
  data = data.slice(1, data.length - 1);
18619
+ data = data.replace(/""/g, '"');
18620
+ if (DIF_XL && data && data.match(/^=".*"$/))
18621
+ data = data.slice(2, -1);
18509
18622
  arr[R][C++] = data !== "" ? data : null;
18510
18623
  break;
18511
18624
  }
@@ -18725,12 +18838,12 @@
18725
18838
  function set_text_arr(data, arr, R, C, o) {
18726
18839
  if (o.raw)
18727
18840
  arr[R][C] = data;
18728
- else if (data === "TRUE")
18841
+ else if (data === "") {
18842
+ } else if (data === "TRUE")
18729
18843
  arr[R][C] = true;
18730
18844
  else if (data === "FALSE")
18731
18845
  arr[R][C] = false;
18732
- else if (data === "") {
18733
- } else if (!isNaN(fuzzynum(data)))
18846
+ else if (!isNaN(fuzzynum(data)))
18734
18847
  arr[R][C] = fuzzynum(data);
18735
18848
  else if (!isNaN(fuzzydate(data).getDate()))
18736
18849
  arr[R][C] = parseDate(data);
@@ -18770,12 +18883,14 @@
18770
18883
  var guess_seps = {
18771
18884
  44: ",",
18772
18885
  9: " ",
18773
- 59: ";"
18886
+ 59: ";",
18887
+ 124: "|"
18774
18888
  };
18775
18889
  var guess_sep_weights = {
18776
18890
  44: 3,
18777
18891
  9: 2,
18778
- 59: 1
18892
+ 59: 1,
18893
+ 124: 0
18779
18894
  };
18780
18895
  function guess_sep(str) {
18781
18896
  var cnt = {}, instr = false, end = 0, cc = 0;
@@ -18800,7 +18915,7 @@
18800
18915
  cc.sort(function(a, b) {
18801
18916
  return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]];
18802
18917
  });
18803
- return guess_seps[cc.pop()[1]];
18918
+ return guess_seps[cc.pop()[1]] || 44;
18804
18919
  }
18805
18920
  function dsv_to_sheet_str(str, opts) {
18806
18921
  var o = opts || {};
@@ -18816,11 +18931,14 @@
18816
18931
  } else if (str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10) {
18817
18932
  sep = str.charAt(4);
18818
18933
  str = str.slice(6);
18819
- }
18820
- } else
18934
+ } else
18935
+ sep = guess_sep(str.slice(0, 1024));
18936
+ } else if (o && o.FS)
18937
+ sep = o.FS;
18938
+ else
18821
18939
  sep = guess_sep(str.slice(0, 1024));
18822
18940
  var R = 0, C = 0, v = 0;
18823
- var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc = 0;
18941
+ var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc = 0, startcc = str.charCodeAt(0);
18824
18942
  str = str.replace(/\r\n/mg, "\n");
18825
18943
  var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
18826
18944
  function finish_cell() {
@@ -18888,6 +19006,7 @@
18888
19006
  } else
18889
19007
  ws[encode_cell({ c: C, r: R })] = cell;
18890
19008
  start = end + 1;
19009
+ startcc = str.charCodeAt(start);
18891
19010
  if (range.e.c < C)
18892
19011
  range.e.c = C;
18893
19012
  if (range.e.r < R)
@@ -18905,7 +19024,8 @@
18905
19024
  for (; end < str.length; ++end)
18906
19025
  switch (cc = str.charCodeAt(end)) {
18907
19026
  case 34:
18908
- instr = !instr;
19027
+ if (startcc === 34)
19028
+ instr = !instr;
18909
19029
  break;
18910
19030
  case sepcc:
18911
19031
  case 10:
@@ -18924,6 +19044,8 @@
18924
19044
  function prn_to_sheet_str(str, opts) {
18925
19045
  if (!(opts && opts.PRN))
18926
19046
  return dsv_to_sheet_str(str, opts);
19047
+ if (opts.FS)
19048
+ return dsv_to_sheet_str(str, opts);
18927
19049
  if (str.slice(0, 4) == "sep=")
18928
19050
  return dsv_to_sheet_str(str, opts);
18929
19051
  if (str.indexOf(" ") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0)
@@ -18945,7 +19067,7 @@
18945
19067
  else if (opts.codepage && typeof cptable !== "undefined")
18946
19068
  str = cptable.utils.decode(opts.codepage, d);
18947
19069
  else
18948
- str = d.toString("binary");
19070
+ str = has_buf && Buffer.isBuffer(d) ? d.toString("binary") : a2s(d);
18949
19071
  break;
18950
19072
  case "array":
18951
19073
  str = cc2str(d);
@@ -18958,8 +19080,10 @@
18958
19080
  }
18959
19081
  if (bytes[0] == 239 && bytes[1] == 187 && bytes[2] == 191)
18960
19082
  str = utf8read(str.slice(3));
19083
+ else if (opts.type != "string" && opts.codepage == 65001)
19084
+ str = utf8read(str);
18961
19085
  else if (opts.type == "binary" && typeof cptable !== "undefined" && opts.codepage)
18962
- str = cptable.utils.decode(opts.codepage, cptable.utils.encode(1252, str));
19086
+ str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591, str));
18963
19087
  if (str.slice(0, 19) == "socialcalc:version:")
18964
19088
  return ETH.to_sheet(opts.type == "string" ? str : utf8read(str), opts);
18965
19089
  return prn_to_sheet_str(str, opts);
@@ -19017,12 +19141,12 @@
19017
19141
  var Enum = opts.Enum || WK1Enum;
19018
19142
  while (data.l < data.length) {
19019
19143
  var RT = data.read_shift(2);
19020
- var R = Enum[RT] || Enum[255];
19144
+ var R = Enum[RT] || Enum[65535];
19021
19145
  var length = data.read_shift(2);
19022
19146
  var tgt = data.l + length;
19023
- var d = (R.f || parsenoop)(data, length, opts);
19147
+ var d = R.f && R.f(data, length, opts);
19024
19148
  data.l = tgt;
19025
- if (cb(d, R.n, RT))
19149
+ if (cb(d, R, RT))
19026
19150
  return;
19027
19151
  }
19028
19152
  }
@@ -19044,22 +19168,19 @@
19044
19168
  var o = opts || {};
19045
19169
  if (DENSE != null && o.dense == null)
19046
19170
  o.dense = DENSE;
19047
- var s = o.dense ? [] : {}, n = "Sheet1", sidx = 0;
19048
- var sheets = {}, snames = [n];
19171
+ var s = o.dense ? [] : {}, n = "Sheet1", next_n = "", sidx = 0;
19172
+ var sheets = {}, snames = [], realnames = [];
19049
19173
  var refguess = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
19050
19174
  var sheetRows = o.sheetRows || 0;
19051
- if (d[2] == 2)
19175
+ if (d[2] == 0) {
19176
+ if (d[3] == 8 || d[3] == 9) {
19177
+ if (d.length >= 16 && d[14] == 5 && d[15] === 108)
19178
+ throw new Error("Unsupported Works 3 for Mac file");
19179
+ }
19180
+ }
19181
+ if (d[2] == 2) {
19052
19182
  o.Enum = WK1Enum;
19053
- else if (d[2] == 26)
19054
- o.Enum = WK3Enum;
19055
- else if (d[2] == 14) {
19056
- o.Enum = WK3Enum;
19057
- o.qpro = true;
19058
- d.l = 0;
19059
- } else
19060
- throw new Error("Unrecognized LOTUS BOF " + d[2]);
19061
- lotushopper(d, function(val, Rn, RT) {
19062
- if (d[2] == 2)
19183
+ lotushopper(d, function(val, R, RT) {
19063
19184
  switch (RT) {
19064
19185
  case 0:
19065
19186
  o.vers = val;
@@ -19069,13 +19190,20 @@
19069
19190
  case 6:
19070
19191
  refguess = val;
19071
19192
  break;
19193
+ case 204:
19194
+ if (val)
19195
+ next_n = val;
19196
+ break;
19197
+ case 222:
19198
+ next_n = val;
19199
+ break;
19072
19200
  case 15:
19201
+ case 51:
19073
19202
  if (!o.qpro)
19074
19203
  val[1].v = val[1].v.slice(1);
19075
19204
  case 13:
19076
19205
  case 14:
19077
19206
  case 16:
19078
- case 51:
19079
19207
  if (RT == 14 && (val[2] & 112) == 112 && (val[2] & 15) > 1 && (val[2] & 15) < 15) {
19080
19208
  val[1].z = o.dateNF || SSF._table[14];
19081
19209
  if (o.cellDates) {
@@ -19083,6 +19211,28 @@
19083
19211
  val[1].v = numdate(val[1].v);
19084
19212
  }
19085
19213
  }
19214
+ if (o.qpro) {
19215
+ if (val[3] > sidx) {
19216
+ s["!ref"] = encode_range(refguess);
19217
+ sheets[n] = s;
19218
+ snames.push(n);
19219
+ s = o.dense ? [] : {};
19220
+ refguess = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
19221
+ sidx = val[3];
19222
+ n = next_n || "Sheet" + (sidx + 1);
19223
+ next_n = "";
19224
+ }
19225
+ }
19226
+ var tmpcell = o.dense ? (s[val[0].r] || [])[val[0].c] : s[encode_cell(val[0])];
19227
+ if (tmpcell) {
19228
+ tmpcell.t = val[1].t;
19229
+ tmpcell.v = val[1].v;
19230
+ if (val[1].z != null)
19231
+ tmpcell.z = val[1].z;
19232
+ if (val[1].f != null)
19233
+ tmpcell.f = val[1].f;
19234
+ break;
19235
+ }
19086
19236
  if (o.dense) {
19087
19237
  if (!s[val[0].r])
19088
19238
  s[val[0].r] = [];
@@ -19090,9 +19240,20 @@
19090
19240
  } else
19091
19241
  s[encode_cell(val[0])] = val[1];
19092
19242
  break;
19243
+ default:
19093
19244
  }
19094
- else
19245
+ }, o);
19246
+ } else if (d[2] == 26 || d[2] == 14) {
19247
+ o.Enum = WK3Enum;
19248
+ if (d[2] == 14) {
19249
+ o.qpro = true;
19250
+ d.l = 0;
19251
+ }
19252
+ lotushopper(d, function(val, R, RT) {
19095
19253
  switch (RT) {
19254
+ case 204:
19255
+ n = val;
19256
+ break;
19096
19257
  case 22:
19097
19258
  val[1].v = val[1].v.slice(1);
19098
19259
  case 23:
@@ -19104,11 +19265,11 @@
19104
19265
  if (val[3] > sidx) {
19105
19266
  s["!ref"] = encode_range(refguess);
19106
19267
  sheets[n] = s;
19268
+ snames.push(n);
19107
19269
  s = o.dense ? [] : {};
19108
19270
  refguess = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
19109
19271
  sidx = val[3];
19110
19272
  n = "Sheet" + (sidx + 1);
19111
- snames.push(n);
19112
19273
  }
19113
19274
  if (sheetRows > 0 && val[0].r >= sheetRows)
19114
19275
  break;
@@ -19123,29 +19284,187 @@
19123
19284
  if (refguess.e.r < val[0].r)
19124
19285
  refguess.e.r = val[0].r;
19125
19286
  break;
19287
+ case 27:
19288
+ if (val[14e3])
19289
+ realnames[val[14e3][0]] = val[14e3][1];
19290
+ break;
19291
+ case 1537:
19292
+ realnames[val[0]] = val[1];
19293
+ if (val[0] == sidx)
19294
+ n = val[1];
19295
+ break;
19126
19296
  default:
19127
19297
  break;
19128
19298
  }
19129
- }, o);
19299
+ }, o);
19300
+ } else
19301
+ throw new Error("Unrecognized LOTUS BOF " + d[2]);
19130
19302
  s["!ref"] = encode_range(refguess);
19131
- sheets[n] = s;
19132
- return { SheetNames: snames, Sheets: sheets };
19303
+ sheets[next_n || n] = s;
19304
+ snames.push(next_n || n);
19305
+ if (!realnames.length)
19306
+ return { SheetNames: snames, Sheets: sheets };
19307
+ var osheets = {}, rnames = [];
19308
+ for (var i2 = 0; i2 < realnames.length; ++i2)
19309
+ if (sheets[snames[i2]]) {
19310
+ rnames.push(realnames[i2] || snames[i2]);
19311
+ osheets[realnames[i2]] = sheets[realnames[i2]] || sheets[snames[i2]];
19312
+ } else {
19313
+ rnames.push(realnames[i2]);
19314
+ osheets[realnames[i2]] = { "!ref": "A1" };
19315
+ }
19316
+ return { SheetNames: rnames, Sheets: osheets };
19133
19317
  }
19134
- function parse_RANGE(blob) {
19318
+ function sheet_to_wk1(ws, opts) {
19319
+ var o = opts || {};
19320
+ if (+o.codepage >= 0)
19321
+ set_cp(+o.codepage);
19322
+ if (o.type == "string")
19323
+ throw new Error("Cannot write WK1 to JS string");
19324
+ var ba = buf_array();
19325
+ var range = safe_decode_range(ws["!ref"]);
19326
+ var dense = Array.isArray(ws);
19327
+ var cols = [];
19328
+ write_biff_rec(ba, 0, write_BOF_WK1(1030));
19329
+ write_biff_rec(ba, 6, write_RANGE(range));
19330
+ var max_R = Math.min(range.e.r, 8191);
19331
+ for (var R = range.s.r; R <= max_R; ++R) {
19332
+ var rr = encode_row(R);
19333
+ for (var C = range.s.c; C <= range.e.c; ++C) {
19334
+ if (R === range.s.r)
19335
+ cols[C] = encode_col(C);
19336
+ var ref = cols[C] + rr;
19337
+ var cell = dense ? (ws[R] || [])[C] : ws[ref];
19338
+ if (!cell || cell.t == "z")
19339
+ continue;
19340
+ if (cell.t == "n") {
19341
+ if ((cell.v | 0) == cell.v && cell.v >= -32768 && cell.v <= 32767)
19342
+ write_biff_rec(ba, 13, write_INTEGER(R, C, cell.v));
19343
+ else
19344
+ write_biff_rec(ba, 14, write_NUMBER(R, C, cell.v));
19345
+ } else {
19346
+ var str = format_cell(cell);
19347
+ write_biff_rec(ba, 15, write_LABEL(R, C, str.slice(0, 239)));
19348
+ }
19349
+ }
19350
+ }
19351
+ write_biff_rec(ba, 1);
19352
+ return ba.end();
19353
+ }
19354
+ function book_to_wk3(wb, opts) {
19355
+ var o = opts || {};
19356
+ if (+o.codepage >= 0)
19357
+ set_cp(+o.codepage);
19358
+ if (o.type == "string")
19359
+ throw new Error("Cannot write WK3 to JS string");
19360
+ var ba = buf_array();
19361
+ write_biff_rec(ba, 0, write_BOF_WK3(wb));
19362
+ for (var i2 = 0, cnt = 0; i2 < wb.SheetNames.length; ++i2)
19363
+ if ((wb.Sheets[wb.SheetNames[i2]] || {})["!ref"])
19364
+ write_biff_rec(ba, 27, write_XFORMAT_SHEETNAME(wb.SheetNames[i2], cnt++));
19365
+ var wsidx = 0;
19366
+ for (i2 = 0; i2 < wb.SheetNames.length; ++i2) {
19367
+ var ws = wb.Sheets[wb.SheetNames[i2]];
19368
+ if (!ws || !ws["!ref"])
19369
+ continue;
19370
+ var range = safe_decode_range(ws["!ref"]);
19371
+ var dense = Array.isArray(ws);
19372
+ var cols = [];
19373
+ var max_R = Math.min(range.e.r, 8191);
19374
+ for (var R = range.s.r; R <= max_R; ++R) {
19375
+ var rr = encode_row(R);
19376
+ for (var C = range.s.c; C <= range.e.c; ++C) {
19377
+ if (R === range.s.r)
19378
+ cols[C] = encode_col(C);
19379
+ var ref = cols[C] + rr;
19380
+ var cell = dense ? (ws[R] || [])[C] : ws[ref];
19381
+ if (!cell || cell.t == "z")
19382
+ continue;
19383
+ if (cell.t == "n") {
19384
+ write_biff_rec(ba, 23, write_NUMBER_17(R, C, wsidx, cell.v));
19385
+ } else {
19386
+ var str = format_cell(cell);
19387
+ write_biff_rec(ba, 22, write_LABEL_16(R, C, wsidx, str.slice(0, 239)));
19388
+ }
19389
+ }
19390
+ }
19391
+ ++wsidx;
19392
+ }
19393
+ write_biff_rec(ba, 1);
19394
+ return ba.end();
19395
+ }
19396
+ function write_BOF_WK1(v) {
19397
+ var out = new_buf(2);
19398
+ out.write_shift(2, v);
19399
+ return out;
19400
+ }
19401
+ function write_BOF_WK3(wb) {
19402
+ var out = new_buf(26);
19403
+ out.write_shift(2, 4096);
19404
+ out.write_shift(2, 4);
19405
+ out.write_shift(4, 0);
19406
+ var rows = 0, cols = 0, wscnt = 0;
19407
+ for (var i2 = 0; i2 < wb.SheetNames.length; ++i2) {
19408
+ var name = wb.SheetNames[i2];
19409
+ var ws = wb.Sheets[name];
19410
+ if (!ws || !ws["!ref"])
19411
+ continue;
19412
+ ++wscnt;
19413
+ var range = decode_range(ws["!ref"]);
19414
+ if (rows < range.e.r)
19415
+ rows = range.e.r;
19416
+ if (cols < range.e.c)
19417
+ cols = range.e.c;
19418
+ }
19419
+ if (rows > 8191)
19420
+ rows = 8191;
19421
+ out.write_shift(2, rows);
19422
+ out.write_shift(1, wscnt);
19423
+ out.write_shift(1, cols);
19424
+ out.write_shift(2, 0);
19425
+ out.write_shift(2, 0);
19426
+ out.write_shift(1, 1);
19427
+ out.write_shift(1, 2);
19428
+ out.write_shift(4, 0);
19429
+ out.write_shift(4, 0);
19430
+ return out;
19431
+ }
19432
+ function parse_RANGE(blob, length, opts) {
19135
19433
  var o = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
19434
+ if (length == 8 && opts.qpro) {
19435
+ o.s.c = blob.read_shift(1);
19436
+ blob.l++;
19437
+ o.s.r = blob.read_shift(2);
19438
+ o.e.c = blob.read_shift(1);
19439
+ blob.l++;
19440
+ o.e.r = blob.read_shift(2);
19441
+ return o;
19442
+ }
19136
19443
  o.s.c = blob.read_shift(2);
19137
19444
  o.s.r = blob.read_shift(2);
19445
+ if (length == 12 && opts.qpro)
19446
+ blob.l += 2;
19138
19447
  o.e.c = blob.read_shift(2);
19139
19448
  o.e.r = blob.read_shift(2);
19449
+ if (length == 12 && opts.qpro)
19450
+ blob.l += 2;
19140
19451
  if (o.s.c == 65535)
19141
19452
  o.s.c = o.e.c = o.s.r = o.e.r = 0;
19142
19453
  return o;
19143
19454
  }
19455
+ function write_RANGE(range) {
19456
+ var out = new_buf(8);
19457
+ out.write_shift(2, range.s.c);
19458
+ out.write_shift(2, range.s.r);
19459
+ out.write_shift(2, range.e.c);
19460
+ out.write_shift(2, range.e.r);
19461
+ return out;
19462
+ }
19144
19463
  function parse_cell(blob, length, opts) {
19145
- var o = [{ c: 0, r: 0 }, { t: "n", v: 0 }, 0];
19464
+ var o = [{ c: 0, r: 0 }, { t: "n", v: 0 }, 0, 0];
19146
19465
  if (opts.qpro && opts.vers != 20768) {
19147
19466
  o[0].c = blob.read_shift(1);
19148
- blob.l++;
19467
+ o[3] = blob.read_shift(1);
19149
19468
  o[0].r = blob.read_shift(2);
19150
19469
  blob.l += 2;
19151
19470
  } else {
@@ -19170,16 +19489,45 @@
19170
19489
  o[1].v = blob.read_shift(tgt - blob.l, "cstr");
19171
19490
  return o;
19172
19491
  }
19492
+ function write_LABEL(R, C, s) {
19493
+ var o = new_buf(7 + s.length);
19494
+ o.write_shift(1, 255);
19495
+ o.write_shift(2, C);
19496
+ o.write_shift(2, R);
19497
+ o.write_shift(1, 39);
19498
+ for (var i2 = 0; i2 < o.length; ++i2) {
19499
+ var cc = s.charCodeAt(i2);
19500
+ o.write_shift(1, cc >= 128 ? 95 : cc);
19501
+ }
19502
+ o.write_shift(1, 0);
19503
+ return o;
19504
+ }
19173
19505
  function parse_INTEGER(blob, length, opts) {
19174
19506
  var o = parse_cell(blob, length, opts);
19175
19507
  o[1].v = blob.read_shift(2, "i");
19176
19508
  return o;
19177
19509
  }
19510
+ function write_INTEGER(R, C, v) {
19511
+ var o = new_buf(7);
19512
+ o.write_shift(1, 255);
19513
+ o.write_shift(2, C);
19514
+ o.write_shift(2, R);
19515
+ o.write_shift(2, v, "i");
19516
+ return o;
19517
+ }
19178
19518
  function parse_NUMBER(blob, length, opts) {
19179
19519
  var o = parse_cell(blob, length, opts);
19180
19520
  o[1].v = blob.read_shift(8, "f");
19181
19521
  return o;
19182
19522
  }
19523
+ function write_NUMBER(R, C, v) {
19524
+ var o = new_buf(13);
19525
+ o.write_shift(1, 255);
19526
+ o.write_shift(2, C);
19527
+ o.write_shift(2, R);
19528
+ o.write_shift(8, v, "f");
19529
+ return o;
19530
+ }
19183
19531
  function parse_FORMULA(blob, length, opts) {
19184
19532
  var tgt = blob.l + length;
19185
19533
  var o = parse_cell(blob, length, opts);
@@ -19188,10 +19536,192 @@
19188
19536
  blob.l = tgt;
19189
19537
  else {
19190
19538
  var flen = blob.read_shift(2);
19539
+ wk1_fmla_to_csf(blob.slice(blob.l, blob.l + flen), o);
19191
19540
  blob.l += flen;
19192
19541
  }
19193
19542
  return o;
19194
19543
  }
19544
+ function wk1_parse_rc(B, V, col) {
19545
+ var rel = V & 32768;
19546
+ V &= ~32768;
19547
+ V = (rel ? B : 0) + (V >= 8192 ? V - 16384 : V);
19548
+ return (rel ? "" : "$") + (col ? encode_col(V) : encode_row(V));
19549
+ }
19550
+ var oprec = [
19551
+ 8,
19552
+ 8,
19553
+ 8,
19554
+ 8,
19555
+ 8,
19556
+ 8,
19557
+ 8,
19558
+ 8,
19559
+ 6,
19560
+ 4,
19561
+ 4,
19562
+ 5,
19563
+ 5,
19564
+ 7,
19565
+ 3,
19566
+ 3,
19567
+ 3,
19568
+ 3,
19569
+ 3,
19570
+ 3,
19571
+ 1,
19572
+ 1,
19573
+ 2,
19574
+ 6,
19575
+ 8,
19576
+ 8,
19577
+ 8,
19578
+ 8,
19579
+ 8,
19580
+ 8,
19581
+ 8,
19582
+ 8
19583
+ ];
19584
+ var FuncTab = {
19585
+ 51: ["FALSE", 0],
19586
+ 52: ["TRUE", 0],
19587
+ 70: ["LEN", 1],
19588
+ 80: ["SUM", 69],
19589
+ 81: ["AVERAGEA", 69],
19590
+ 82: ["COUNTA", 69],
19591
+ 83: ["MINA", 69],
19592
+ 84: ["MAXA", 69],
19593
+ 111: ["T", 1]
19594
+ };
19595
+ var BinOpTab = [
19596
+ "",
19597
+ "",
19598
+ "",
19599
+ "",
19600
+ "",
19601
+ "",
19602
+ "",
19603
+ "",
19604
+ "",
19605
+ "+",
19606
+ "-",
19607
+ "*",
19608
+ "/",
19609
+ "^",
19610
+ "=",
19611
+ "<>",
19612
+ "<=",
19613
+ ">=",
19614
+ "<",
19615
+ ">",
19616
+ "",
19617
+ "",
19618
+ "",
19619
+ "",
19620
+ "&",
19621
+ "",
19622
+ "",
19623
+ "",
19624
+ "",
19625
+ "",
19626
+ "",
19627
+ ""
19628
+ ];
19629
+ function wk1_fmla_to_csf(blob, o) {
19630
+ prep_blob(blob, 0);
19631
+ var out = [], argc = 0, R = "", C = "", argL = "", argR = "";
19632
+ while (blob.l < blob.length) {
19633
+ var cc = blob[blob.l++];
19634
+ switch (cc) {
19635
+ case 0:
19636
+ out.push(blob.read_shift(8, "f"));
19637
+ break;
19638
+ case 1:
19639
+ {
19640
+ C = wk1_parse_rc(o[0].c, blob.read_shift(2), true);
19641
+ R = wk1_parse_rc(o[0].r, blob.read_shift(2), false);
19642
+ out.push(C + R);
19643
+ }
19644
+ break;
19645
+ case 2:
19646
+ {
19647
+ var c = wk1_parse_rc(o[0].c, blob.read_shift(2), true);
19648
+ var r = wk1_parse_rc(o[0].r, blob.read_shift(2), false);
19649
+ C = wk1_parse_rc(o[0].c, blob.read_shift(2), true);
19650
+ R = wk1_parse_rc(o[0].r, blob.read_shift(2), false);
19651
+ out.push(c + r + ":" + C + R);
19652
+ }
19653
+ break;
19654
+ case 3:
19655
+ if (blob.l < blob.length) {
19656
+ console.error("WK1 premature formula end");
19657
+ return;
19658
+ }
19659
+ break;
19660
+ case 4:
19661
+ out.push("(" + out.pop() + ")");
19662
+ break;
19663
+ case 5:
19664
+ out.push(blob.read_shift(2));
19665
+ break;
19666
+ case 6:
19667
+ {
19668
+ var Z = "";
19669
+ while (cc = blob[blob.l++])
19670
+ Z += String.fromCharCode(cc);
19671
+ out.push('"' + Z.replace(/"/g, '""') + '"');
19672
+ break;
19673
+ }
19674
+ break;
19675
+ case 8:
19676
+ out.push("-" + out.pop());
19677
+ break;
19678
+ case 23:
19679
+ out.push("+" + out.pop());
19680
+ break;
19681
+ case 22:
19682
+ out.push("NOT(" + out.pop() + ")");
19683
+ break;
19684
+ case 20:
19685
+ case 21:
19686
+ {
19687
+ argR = out.pop();
19688
+ argL = out.pop();
19689
+ out.push(["AND", "OR"][cc - 20] + "(" + argL + "," + argR + ")");
19690
+ }
19691
+ break;
19692
+ default:
19693
+ if (cc < 32 && BinOpTab[cc]) {
19694
+ argR = out.pop();
19695
+ argL = out.pop();
19696
+ out.push(argL + BinOpTab[cc] + argR);
19697
+ } else if (FuncTab[cc]) {
19698
+ argc = FuncTab[cc][1];
19699
+ if (argc == 69)
19700
+ argc = blob[blob.l++];
19701
+ if (argc > out.length) {
19702
+ console.error("WK1 bad formula parse 0x" + cc.toString(16) + ":|" + out.join("|") + "|");
19703
+ return;
19704
+ }
19705
+ var args = out.slice(-argc);
19706
+ out.length -= argc;
19707
+ out.push(FuncTab[cc][0] + "(" + args.join(",") + ")");
19708
+ } else if (cc <= 7)
19709
+ return console.error("WK1 invalid opcode " + cc.toString(16));
19710
+ else if (cc <= 24)
19711
+ return console.error("WK1 unsupported op " + cc.toString(16));
19712
+ else if (cc <= 30)
19713
+ return console.error("WK1 invalid opcode " + cc.toString(16));
19714
+ else if (cc <= 115)
19715
+ return console.error("WK1 unsupported function opcode " + cc.toString(16));
19716
+ else
19717
+ return console.error("WK1 unrecognized opcode " + cc.toString(16));
19718
+ }
19719
+ }
19720
+ if (out.length == 1)
19721
+ o[1].f = "" + out[0];
19722
+ else
19723
+ console.error("WK1 bad formula parse |" + out.join("|") + "|");
19724
+ }
19195
19725
  function parse_cell_3(blob) {
19196
19726
  var o = [{ c: 0, r: 0 }, { t: "n", v: 0 }, 0];
19197
19727
  o[0].r = blob.read_shift(2);
@@ -19205,29 +19735,49 @@
19205
19735
  o[1].v = blob.read_shift(length - 4, "cstr");
19206
19736
  return o;
19207
19737
  }
19738
+ function write_LABEL_16(R, C, wsidx, s) {
19739
+ var o = new_buf(6 + s.length);
19740
+ o.write_shift(2, R);
19741
+ o.write_shift(1, wsidx);
19742
+ o.write_shift(1, C);
19743
+ o.write_shift(1, 39);
19744
+ for (var i2 = 0; i2 < s.length; ++i2) {
19745
+ var cc = s.charCodeAt(i2);
19746
+ o.write_shift(1, cc >= 128 ? 95 : cc);
19747
+ }
19748
+ o.write_shift(1, 0);
19749
+ return o;
19750
+ }
19208
19751
  function parse_NUMBER_18(blob, length) {
19209
19752
  var o = parse_cell_3(blob, length);
19210
19753
  o[1].v = blob.read_shift(2);
19211
19754
  var v = o[1].v >> 1;
19212
19755
  if (o[1].v & 1) {
19213
19756
  switch (v & 7) {
19757
+ case 0:
19758
+ v = (v >> 3) * 5e3;
19759
+ break;
19214
19760
  case 1:
19215
19761
  v = (v >> 3) * 500;
19216
19762
  break;
19217
19763
  case 2:
19218
19764
  v = (v >> 3) / 20;
19219
19765
  break;
19766
+ case 3:
19767
+ v = (v >> 3) / 200;
19768
+ break;
19220
19769
  case 4:
19221
19770
  v = (v >> 3) / 2e3;
19222
19771
  break;
19772
+ case 5:
19773
+ v = (v >> 3) / 2e4;
19774
+ break;
19223
19775
  case 6:
19224
19776
  v = (v >> 3) / 16;
19225
19777
  break;
19226
19778
  case 7:
19227
19779
  v = (v >> 3) / 64;
19228
19780
  break;
19229
- default:
19230
- throw "unknown NUMBER_18 encoding " + (v & 7);
19231
19781
  }
19232
19782
  }
19233
19783
  o[1].v = v;
@@ -19239,12 +19789,54 @@
19239
19789
  var v2 = blob.read_shift(4);
19240
19790
  var e = blob.read_shift(2);
19241
19791
  if (e == 65535) {
19242
- o[1].v = 0;
19792
+ if (v1 === 0 && v2 === 3221225472) {
19793
+ o[1].t = "e";
19794
+ o[1].v = 15;
19795
+ } else if (v1 === 0 && v2 === 3489660928) {
19796
+ o[1].t = "e";
19797
+ o[1].v = 42;
19798
+ } else
19799
+ o[1].v = 0;
19243
19800
  return o;
19244
19801
  }
19245
19802
  var s = e & 32768;
19246
19803
  e = (e & 32767) - 16446;
19247
- o[1].v = (s * 2 - 1) * ((e > 0 ? v2 << e : v2 >>> -e) + (e > -32 ? v1 << e + 32 : v1 >>> -(e + 32)));
19804
+ o[1].v = (1 - s * 2) * (v2 * Math.pow(2, e + 32) + v1 * Math.pow(2, e));
19805
+ return o;
19806
+ }
19807
+ function write_NUMBER_17(R, C, wsidx, v) {
19808
+ var o = new_buf(14);
19809
+ o.write_shift(2, R);
19810
+ o.write_shift(1, wsidx);
19811
+ o.write_shift(1, C);
19812
+ if (v == 0) {
19813
+ o.write_shift(4, 0);
19814
+ o.write_shift(4, 0);
19815
+ o.write_shift(2, 65535);
19816
+ return o;
19817
+ }
19818
+ var s = 0, e = 0, v1 = 0, v2 = 0;
19819
+ if (v < 0) {
19820
+ s = 1;
19821
+ v = -v;
19822
+ }
19823
+ e = Math.log2(v) | 0;
19824
+ v /= Math.pow(2, e - 31);
19825
+ v2 = v >>> 0;
19826
+ if ((v2 & 2147483648) == 0) {
19827
+ v /= 2;
19828
+ ++e;
19829
+ v2 = v >>> 0;
19830
+ }
19831
+ v -= v2;
19832
+ v2 |= 2147483648;
19833
+ v2 >>>= 0;
19834
+ v *= Math.pow(2, 32);
19835
+ v1 = v >>> 0;
19836
+ o.write_shift(4, v1);
19837
+ o.write_shift(4, v2);
19838
+ e += 16383 + (s ? 32768 : 0);
19839
+ o.write_shift(2, e);
19248
19840
  return o;
19249
19841
  }
19250
19842
  function parse_FORMULA_19(blob, length) {
@@ -19269,6 +19861,55 @@
19269
19861
  blob.l += length - 10;
19270
19862
  return o;
19271
19863
  }
19864
+ function parse_SHEETNAMECS(blob, length) {
19865
+ return blob[blob.l + length - 1] == 0 ? blob.read_shift(length, "cstr") : "";
19866
+ }
19867
+ function parse_SHEETNAMELP(blob, length) {
19868
+ var len = blob[blob.l++];
19869
+ if (len > length - 1)
19870
+ len = length - 1;
19871
+ var o = "";
19872
+ while (o.length < len)
19873
+ o += String.fromCharCode(blob[blob.l++]);
19874
+ return o;
19875
+ }
19876
+ function parse_SHEETINFOQP(blob, length, opts) {
19877
+ if (!opts.qpro || length < 21)
19878
+ return;
19879
+ var id = blob.read_shift(1);
19880
+ blob.l += 17;
19881
+ var len = blob.read_shift(1);
19882
+ blob.l += 2;
19883
+ var nm = blob.read_shift(length - 21, "cstr");
19884
+ return [id, nm];
19885
+ }
19886
+ function parse_XFORMAT(blob, length) {
19887
+ var o = {}, tgt = blob.l + length;
19888
+ while (blob.l < tgt) {
19889
+ var dt = blob.read_shift(2);
19890
+ if (dt == 14e3) {
19891
+ o[dt] = [0, ""];
19892
+ o[dt][0] = blob.read_shift(2);
19893
+ while (blob[blob.l]) {
19894
+ o[dt][1] += String.fromCharCode(blob[blob.l]);
19895
+ blob.l++;
19896
+ }
19897
+ blob.l++;
19898
+ }
19899
+ }
19900
+ return o;
19901
+ }
19902
+ function write_XFORMAT_SHEETNAME(name, wsidx) {
19903
+ var out = new_buf(5 + name.length);
19904
+ out.write_shift(2, 14e3);
19905
+ out.write_shift(2, wsidx);
19906
+ for (var i2 = 0; i2 < name.length; ++i2) {
19907
+ var cc = name.charCodeAt(i2);
19908
+ out[out.l++] = cc > 127 ? 95 : cc;
19909
+ }
19910
+ out[out.l++] = 0;
19911
+ return out;
19912
+ }
19272
19913
  var WK1Enum = {
19273
19914
  0: { n: "BOF", f: parseuint16 },
19274
19915
  1: { n: "EOF" },
@@ -19327,44 +19968,142 @@
19327
19968
  72: { n: "ACOMM" },
19328
19969
  73: { n: "AMACRO" },
19329
19970
  74: { n: "PARSE" },
19330
- 255: { n: "", f: parsenoop }
19971
+ 102: { n: "PRANGES??" },
19972
+ 103: { n: "RRANGES??" },
19973
+ 104: { n: "FNAME??" },
19974
+ 105: { n: "MRANGES??" },
19975
+ 204: { n: "SHEETNAMECS", f: parse_SHEETNAMECS },
19976
+ 222: { n: "SHEETNAMELP", f: parse_SHEETNAMELP },
19977
+ 65535: { n: "" }
19331
19978
  };
19332
19979
  var WK3Enum = {
19333
19980
  0: { n: "BOF" },
19334
19981
  1: { n: "EOF" },
19335
- 3: { n: "??" },
19336
- 4: { n: "??" },
19337
- 5: { n: "??" },
19338
- 6: { n: "??" },
19339
- 7: { n: "??" },
19340
- 9: { n: "??" },
19341
- 10: { n: "??" },
19342
- 11: { n: "??" },
19343
- 12: { n: "??" },
19344
- 14: { n: "??" },
19345
- 15: { n: "??" },
19346
- 16: { n: "??" },
19347
- 17: { n: "??" },
19348
- 18: { n: "??" },
19982
+ 2: { n: "PASSWORD" },
19983
+ 3: { n: "CALCSET" },
19984
+ 4: { n: "WINDOWSET" },
19985
+ 5: { n: "SHEETCELLPTR" },
19986
+ 6: { n: "SHEETLAYOUT" },
19987
+ 7: { n: "COLUMNWIDTH" },
19988
+ 8: { n: "HIDDENCOLUMN" },
19989
+ 9: { n: "USERRANGE" },
19990
+ 10: { n: "SYSTEMRANGE" },
19991
+ 11: { n: "ZEROFORCE" },
19992
+ 12: { n: "SORTKEYDIR" },
19993
+ 13: { n: "FILESEAL" },
19994
+ 14: { n: "DATAFILLNUMS" },
19995
+ 15: { n: "PRINTMAIN" },
19996
+ 16: { n: "PRINTSTRING" },
19997
+ 17: { n: "GRAPHMAIN" },
19998
+ 18: { n: "GRAPHSTRING" },
19349
19999
  19: { n: "??" },
19350
- 21: { n: "??" },
20000
+ 20: { n: "ERRCELL" },
20001
+ 21: { n: "NACELL" },
19351
20002
  22: { n: "LABEL16", f: parse_LABEL_16 },
19352
20003
  23: { n: "NUMBER17", f: parse_NUMBER_17 },
19353
20004
  24: { n: "NUMBER18", f: parse_NUMBER_18 },
19354
20005
  25: { n: "FORMULA19", f: parse_FORMULA_19 },
19355
- 26: { n: "??" },
19356
- 27: { n: "??" },
19357
- 28: { n: "??" },
19358
- 29: { n: "??" },
19359
- 30: { n: "??" },
19360
- 31: { n: "??" },
19361
- 33: { n: "??" },
20006
+ 26: { n: "FORMULA1A" },
20007
+ 27: { n: "XFORMAT", f: parse_XFORMAT },
20008
+ 28: { n: "DTLABELMISC" },
20009
+ 29: { n: "DTLABELCELL" },
20010
+ 30: { n: "GRAPHWINDOW" },
20011
+ 31: { n: "CPA" },
20012
+ 32: { n: "LPLAUTO" },
20013
+ 33: { n: "QUERY" },
20014
+ 34: { n: "HIDDENSHEET" },
20015
+ 35: { n: "??" },
19362
20016
  37: { n: "NUMBER25", f: parse_NUMBER_25 },
20017
+ 38: { n: "??" },
19363
20018
  39: { n: "NUMBER27", f: parse_NUMBER_27 },
19364
20019
  40: { n: "FORMULA28", f: parse_FORMULA_28 },
19365
- 255: { n: "", f: parsenoop }
20020
+ 142: { n: "??" },
20021
+ 147: { n: "??" },
20022
+ 150: { n: "??" },
20023
+ 151: { n: "??" },
20024
+ 152: { n: "??" },
20025
+ 153: { n: "??" },
20026
+ 154: { n: "??" },
20027
+ 155: { n: "??" },
20028
+ 156: { n: "??" },
20029
+ 163: { n: "??" },
20030
+ 174: { n: "??" },
20031
+ 175: { n: "??" },
20032
+ 176: { n: "??" },
20033
+ 177: { n: "??" },
20034
+ 184: { n: "??" },
20035
+ 185: { n: "??" },
20036
+ 186: { n: "??" },
20037
+ 187: { n: "??" },
20038
+ 188: { n: "??" },
20039
+ 195: { n: "??" },
20040
+ 201: { n: "??" },
20041
+ 204: { n: "SHEETNAMECS", f: parse_SHEETNAMECS },
20042
+ 205: { n: "??" },
20043
+ 206: { n: "??" },
20044
+ 207: { n: "??" },
20045
+ 208: { n: "??" },
20046
+ 256: { n: "??" },
20047
+ 259: { n: "??" },
20048
+ 260: { n: "??" },
20049
+ 261: { n: "??" },
20050
+ 262: { n: "??" },
20051
+ 263: { n: "??" },
20052
+ 265: { n: "??" },
20053
+ 266: { n: "??" },
20054
+ 267: { n: "??" },
20055
+ 268: { n: "??" },
20056
+ 270: { n: "??" },
20057
+ 271: { n: "??" },
20058
+ 384: { n: "??" },
20059
+ 389: { n: "??" },
20060
+ 390: { n: "??" },
20061
+ 393: { n: "??" },
20062
+ 396: { n: "??" },
20063
+ 512: { n: "??" },
20064
+ 514: { n: "??" },
20065
+ 513: { n: "??" },
20066
+ 516: { n: "??" },
20067
+ 517: { n: "??" },
20068
+ 640: { n: "??" },
20069
+ 641: { n: "??" },
20070
+ 642: { n: "??" },
20071
+ 643: { n: "??" },
20072
+ 644: { n: "??" },
20073
+ 645: { n: "??" },
20074
+ 646: { n: "??" },
20075
+ 647: { n: "??" },
20076
+ 648: { n: "??" },
20077
+ 658: { n: "??" },
20078
+ 659: { n: "??" },
20079
+ 660: { n: "??" },
20080
+ 661: { n: "??" },
20081
+ 662: { n: "??" },
20082
+ 665: { n: "??" },
20083
+ 666: { n: "??" },
20084
+ 768: { n: "??" },
20085
+ 772: { n: "??" },
20086
+ 1537: { n: "SHEETINFOQP", f: parse_SHEETINFOQP },
20087
+ 1600: { n: "??" },
20088
+ 1602: { n: "??" },
20089
+ 1793: { n: "??" },
20090
+ 1794: { n: "??" },
20091
+ 1795: { n: "??" },
20092
+ 1796: { n: "??" },
20093
+ 1920: { n: "??" },
20094
+ 2048: { n: "??" },
20095
+ 2049: { n: "??" },
20096
+ 2052: { n: "??" },
20097
+ 2688: { n: "??" },
20098
+ 10998: { n: "??" },
20099
+ 12849: { n: "??" },
20100
+ 28233: { n: "??" },
20101
+ 28484: { n: "??" },
20102
+ 65535: { n: "" }
19366
20103
  };
19367
20104
  return {
20105
+ sheet_to_wk1,
20106
+ book_to_wk3,
19368
20107
  to_workbook: lotus_to_workbook
19369
20108
  };
19370
20109
  }();
@@ -20029,7 +20768,7 @@
20029
20768
  case "binary":
20030
20769
  return rtf_to_sheet_str(d, opts);
20031
20770
  case "buffer":
20032
- return rtf_to_sheet_str(d.toString("binary"), opts);
20771
+ return rtf_to_sheet_str(has_buf && Buffer.isBuffer(d) ? d.toString("binary") : a2s(d), opts);
20033
20772
  case "array":
20034
20773
  return rtf_to_sheet_str(cc2str(d), opts);
20035
20774
  }
@@ -20038,9 +20777,38 @@
20038
20777
  function rtf_to_sheet_str(str, opts) {
20039
20778
  var o = opts || {};
20040
20779
  var ws = o.dense ? [] : {};
20041
- var range = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
20042
- if (!str.match(/\\trowd/))
20780
+ var rows = str.match(/\\trowd.*?\\row\b/g);
20781
+ if (!rows.length)
20043
20782
  throw new Error("RTF missing table");
20783
+ var range = { s: { c: 0, r: 0 }, e: { c: 0, r: rows.length - 1 } };
20784
+ rows.forEach(function(rowtf, R) {
20785
+ if (Array.isArray(ws))
20786
+ ws[R] = [];
20787
+ var rtfre = /\\\w+\b/g;
20788
+ var last_index = 0;
20789
+ var res;
20790
+ var C = -1;
20791
+ while (res = rtfre.exec(rowtf)) {
20792
+ switch (res[0]) {
20793
+ case "\\cell":
20794
+ var data = rowtf.slice(last_index, rtfre.lastIndex - res[0].length);
20795
+ if (data[0] == " ")
20796
+ data = data.slice(1);
20797
+ ++C;
20798
+ if (data.length) {
20799
+ var cell = { v: data, t: "s" };
20800
+ if (Array.isArray(ws))
20801
+ ws[R][C] = cell;
20802
+ else
20803
+ ws[encode_cell({ r: R, c: C })] = cell;
20804
+ }
20805
+ break;
20806
+ }
20807
+ last_index = rtfre.lastIndex;
20808
+ }
20809
+ if (C > range.e.c)
20810
+ range.e.c = C;
20811
+ });
20044
20812
  ws["!ref"] = encode_range(range);
20045
20813
  return ws;
20046
20814
  }
@@ -20552,7 +21320,7 @@
20552
21320
  if (font.color.index == 81)
20553
21321
  icv = XLSIcv[1];
20554
21322
  if (!icv)
20555
- throw new Error(x);
21323
+ icv = XLSIcv[1];
20556
21324
  font.color.rgb = icv[0].toString(16) + icv[1].toString(16) + icv[2].toString(16);
20557
21325
  } else if (y.theme) {
20558
21326
  font.color.theme = parseInt(y.theme, 10);
@@ -20666,7 +21434,7 @@
20666
21434
  for (i2 = 0; i2 < cellXF_bool.length; ++i2)
20667
21435
  if (xf[cellXF_bool[i2]])
20668
21436
  xf[cellXF_bool[i2]] = parsexmlbool(xf[cellXF_bool[i2]]);
20669
- if (xf.numFmtId > 392) {
21437
+ if (styles.NumberFmt && xf.numFmtId > 392) {
20670
21438
  for (i2 = 392; i2 > 60; --i2)
20671
21439
  if (styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i2]) {
20672
21440
  xf.numFmtId = i2;
@@ -21429,7 +22197,7 @@
21429
22197
  var dwThemeVersion = blob.read_shift(4);
21430
22198
  if (dwThemeVersion === 124226)
21431
22199
  return;
21432
- if (!opts.cellStyles || !jszip) {
22200
+ if (!opts.cellStyles) {
21433
22201
  blob.l = end;
21434
22202
  return;
21435
22203
  }
@@ -21437,7 +22205,7 @@
21437
22205
  blob.l = end;
21438
22206
  var zip;
21439
22207
  try {
21440
- zip = new jszip(data);
22208
+ zip = zip_read(data, { type: "array" });
21441
22209
  } catch (e) {
21442
22210
  return;
21443
22211
  }
@@ -21778,7 +22546,7 @@
21778
22546
  comment.r = rt.r;
21779
22547
  if (rt.r == "<t></t>")
21780
22548
  rt.t = rt.h = "";
21781
- comment.t = rt.t.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
22549
+ comment.t = (rt.t || "").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
21782
22550
  if (opts.cellHTML)
21783
22551
  comment.h = rt.h;
21784
22552
  commentList.push(comment);
@@ -22755,7 +23523,8 @@
22755
23523
  }
22756
23524
  }
22757
23525
  function get_ixti(supbooks, ixti, opts) {
22758
- return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts);
23526
+ var ixtiraw = get_ixti_raw(supbooks, ixti, opts);
23527
+ return ixtiraw == "#REF" ? ixtiraw : formula_quote_sheet_name(ixtiraw, opts);
22759
23528
  }
22760
23529
  function stringify_formula(formula, range, cell, supbooks, opts) {
22761
23530
  var biff = opts && opts.biff || 8;
@@ -22924,7 +23693,7 @@
22924
23693
  else if (supbooks[0] && supbooks[0][nameidx])
22925
23694
  o += supbooks[0][nameidx].Name;
22926
23695
  else {
22927
- var ixtidata = get_ixti_raw(supbooks, bookidx, opts).split(";;");
23696
+ var ixtidata = (get_ixti_raw(supbooks, bookidx, opts) || "").split(";;");
22928
23697
  if (ixtidata[nameidx - 1])
22929
23698
  o = ixtidata[nameidx - 1];
22930
23699
  else
@@ -24537,6 +25306,9 @@
24537
25306
  p.width = col.width;
24538
25307
  if (col.hidden)
24539
25308
  p.hidden = true;
25309
+ if (col.level != null) {
25310
+ p.outlineLevel = p.level = col.level;
25311
+ }
24540
25312
  return p;
24541
25313
  }
24542
25314
  function default_margins(margins, mode) {
@@ -24591,11 +25363,11 @@
24591
25363
  if (opts.WTF)
24592
25364
  throw e;
24593
25365
  }
24594
- if (p.t === "z")
25366
+ if (p.t === "z" && !opts.cellStyles)
24595
25367
  return;
24596
25368
  if (p.t === "d" && typeof p.v === "string")
24597
25369
  p.v = parseDate(p.v);
24598
- if (!opts || opts.cellText !== false)
25370
+ if ((!opts || opts.cellText !== false) && p.t !== "z")
24599
25371
  try {
24600
25372
  if (SSF._table[fmtid] == null)
24601
25373
  SSF.load(SSFImplicit[fmtid] || "General", fmtid);
@@ -24665,6 +25437,7 @@
24665
25437
  var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
24666
25438
  var marginregex = /<(?:\w:)?pageMargins[^>]*\/>/g;
24667
25439
  var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/;
25440
+ var sheetprregex2 = /<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/;
24668
25441
  var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;
24669
25442
  function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
24670
25443
  if (!data)
@@ -24685,6 +25458,8 @@
24685
25458
  var sheetPr = data1.match(sheetprregex);
24686
25459
  if (sheetPr)
24687
25460
  parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
25461
+ else if (sheetPr = data1.match(sheetprregex2))
25462
+ parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1] || "", s, wb, idx, styles, themes);
24688
25463
  var ridx = (data1.match(/<(?:\w*:)?dimension/) || { index: -1 }).index;
24689
25464
  if (ridx > 0) {
24690
25465
  var ref = data1.slice(ridx, ridx + 50).match(dimregex);
@@ -24755,6 +25530,9 @@
24755
25530
  if (data.codeName)
24756
25531
  wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));
24757
25532
  }
25533
+ function parse_ws_xml_sheetpr2(sheetPr, body, s, wb, idx, styles, themes) {
25534
+ parse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(">")), s, wb, idx);
25535
+ }
24758
25536
  function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {
24759
25537
  var needed = false;
24760
25538
  var props = {}, payload = null;
@@ -24818,9 +25596,9 @@
24818
25596
  if (rel) {
24819
25597
  val.Target = rel.Target;
24820
25598
  if (val.location)
24821
- val.Target += "#" + val.location;
25599
+ val.Target += "#" + unescapexml(val.location);
24822
25600
  } else {
24823
- val.Target = "#" + val.location;
25601
+ val.Target = "#" + unescapexml(val.location);
24824
25602
  rel = { Target: val.Target, TargetMode: "Internal" };
24825
25603
  }
24826
25604
  val.Rel = rel;
@@ -24865,6 +25643,8 @@
24865
25643
  if (coll.hidden)
24866
25644
  coll.hidden = parsexmlbool(coll.hidden);
24867
25645
  var colm = parseInt(coll.min, 10) - 1, colM = parseInt(coll.max, 10) - 1;
25646
+ if (coll.outlineLevel)
25647
+ coll.level = +coll.outlineLevel || 0;
24868
25648
  delete coll.min;
24869
25649
  delete coll.max;
24870
25650
  coll.width = +coll.width;
@@ -24990,6 +25770,8 @@
24990
25770
  delete cell.t;
24991
25771
  break;
24992
25772
  }
25773
+ if (cell.v.length > 32767)
25774
+ throw new Error("Text length must not exceed 32767 characters");
24993
25775
  if (opts && opts.bookSST) {
24994
25776
  v = writetag("v", "" + get_sst_id(opts.Strings, cell.v, opts.revStrings));
24995
25777
  o.t = "s";
@@ -25033,11 +25815,47 @@
25033
25815
  var xlen = x.length;
25034
25816
  if (xlen === 0)
25035
25817
  continue;
25036
- for (ri = 0; ri < xlen; ++ri)
25037
- if (x.charCodeAt(ri) === 62)
25038
- break;
25039
- ++ri;
25040
- tag = parsexmltag(x.slice(0, ri), true);
25818
+ var rstarti = 0;
25819
+ outa:
25820
+ for (ri = 0; ri < xlen; ++ri)
25821
+ switch (x[ri]) {
25822
+ case ">":
25823
+ if (x[ri - 1] != "/") {
25824
+ ++ri;
25825
+ break outa;
25826
+ }
25827
+ if (opts && opts.cellStyles) {
25828
+ tag = parsexmltag(x.slice(rstarti, ri), true);
25829
+ tagr = tag.r != null ? parseInt(tag.r, 10) : tagr + 1;
25830
+ tagc = -1;
25831
+ if (opts.sheetRows && opts.sheetRows < tagr)
25832
+ continue;
25833
+ rowobj = {};
25834
+ rowrite = false;
25835
+ if (tag.ht) {
25836
+ rowrite = true;
25837
+ rowobj.hpt = parseFloat(tag.ht);
25838
+ rowobj.hpx = pt2px(rowobj.hpt);
25839
+ }
25840
+ if (tag.hidden == "1") {
25841
+ rowrite = true;
25842
+ rowobj.hidden = true;
25843
+ }
25844
+ if (tag.outlineLevel != null) {
25845
+ rowrite = true;
25846
+ rowobj.level = +tag.outlineLevel;
25847
+ }
25848
+ if (rowrite)
25849
+ rows[tagr - 1] = rowobj;
25850
+ }
25851
+ break;
25852
+ case "<":
25853
+ rstarti = ri;
25854
+ break;
25855
+ }
25856
+ if (rstarti >= ri)
25857
+ break;
25858
+ tag = parsexmltag(x.slice(rstarti, ri), true);
25041
25859
  tagr = tag.r != null ? parseInt(tag.r, 10) : tagr + 1;
25042
25860
  tagc = -1;
25043
25861
  if (opts.sheetRows && opts.sheetRows < tagr)
@@ -25338,7 +26156,7 @@
25338
26156
  o[o.length] = "</sheetData>";
25339
26157
  o[sidx] = o[sidx].replace("/>", ">");
25340
26158
  }
25341
- if (ws["!protect"] != null)
26159
+ if (ws["!protect"])
25342
26160
  o[o.length] = write_ws_xml_protection(ws["!protect"]);
25343
26161
  if (ws["!autofilter"] != null)
25344
26162
  o[o.length] = write_ws_xml_autofilter(ws["!autofilter"], ws, wb, idx);
@@ -25461,14 +26279,26 @@
25461
26279
  }
25462
26280
  function parse_BrtWsProp(data, length) {
25463
26281
  var z = {};
25464
- data.l += 19;
26282
+ var f = data[data.l];
26283
+ ++data.l;
26284
+ z.above = !(f & 64);
26285
+ z.left = !(f & 128);
26286
+ data.l += 18;
25465
26287
  z.name = parse_XLSBCodeName(data, length - 19);
25466
26288
  return z;
25467
26289
  }
25468
- function write_BrtWsProp(str, o) {
26290
+ function write_BrtWsProp(str, outl, o) {
25469
26291
  if (o == null)
25470
26292
  o = new_buf(84 + 4 * str.length);
25471
- for (var i2 = 0; i2 < 3; ++i2)
26293
+ var f = 192;
26294
+ if (outl) {
26295
+ if (outl.above)
26296
+ f &= ~64;
26297
+ if (outl.left)
26298
+ f &= ~128;
26299
+ }
26300
+ o.write_shift(1, f);
26301
+ for (var i2 = 1; i2 < 3; ++i2)
25472
26302
  o.write_shift(1, 0);
25473
26303
  write_BrtColor({ auto: 1 }, o);
25474
26304
  o.write_shift(-4, -1);
@@ -25485,6 +26315,15 @@
25485
26315
  o = new_buf(8);
25486
26316
  return write_XLSBCell(ncell, o);
25487
26317
  }
26318
+ function parse_BrtShortBlank(data) {
26319
+ var cell = parse_XLSBShortCell(data);
26320
+ return [cell];
26321
+ }
26322
+ function write_BrtShortBlank(cell, ncell, o) {
26323
+ if (o == null)
26324
+ o = new_buf(4);
26325
+ return write_XLSBShortCell(ncell, o);
26326
+ }
25488
26327
  function parse_BrtCellBool(data) {
25489
26328
  var cell = parse_XLSBCell(data);
25490
26329
  var fBool = data.read_shift(1);
@@ -25497,11 +26336,44 @@
25497
26336
  o.write_shift(1, cell.v ? 1 : 0);
25498
26337
  return o;
25499
26338
  }
26339
+ function parse_BrtShortBool(data) {
26340
+ var cell = parse_XLSBShortCell(data);
26341
+ var fBool = data.read_shift(1);
26342
+ return [cell, fBool, "b"];
26343
+ }
26344
+ function write_BrtShortBool(cell, ncell, o) {
26345
+ if (o == null)
26346
+ o = new_buf(5);
26347
+ write_XLSBShortCell(ncell, o);
26348
+ o.write_shift(1, cell.v ? 1 : 0);
26349
+ return o;
26350
+ }
25500
26351
  function parse_BrtCellError(data) {
25501
26352
  var cell = parse_XLSBCell(data);
25502
26353
  var bError = data.read_shift(1);
25503
26354
  return [cell, bError, "e"];
25504
26355
  }
26356
+ function write_BrtCellError(cell, ncell, o) {
26357
+ if (o == null)
26358
+ o = new_buf(9);
26359
+ write_XLSBCell(ncell, o);
26360
+ o.write_shift(1, cell.v);
26361
+ return o;
26362
+ }
26363
+ function parse_BrtShortError(data) {
26364
+ var cell = parse_XLSBShortCell(data);
26365
+ var bError = data.read_shift(1);
26366
+ return [cell, bError, "e"];
26367
+ }
26368
+ function write_BrtShortError(cell, ncell, o) {
26369
+ if (o == null)
26370
+ o = new_buf(8);
26371
+ write_XLSBShortCell(ncell, o);
26372
+ o.write_shift(1, cell.v);
26373
+ o.write_shift(2, 0);
26374
+ o.write_shift(1, 0);
26375
+ return o;
26376
+ }
25505
26377
  function parse_BrtCellIsst(data) {
25506
26378
  var cell = parse_XLSBCell(data);
25507
26379
  var isst = data.read_shift(4);
@@ -25514,6 +26386,18 @@
25514
26386
  o.write_shift(4, ncell.v);
25515
26387
  return o;
25516
26388
  }
26389
+ function parse_BrtShortIsst(data) {
26390
+ var cell = parse_XLSBShortCell(data);
26391
+ var isst = data.read_shift(4);
26392
+ return [cell, isst, "s"];
26393
+ }
26394
+ function write_BrtShortIsst(cell, ncell, o) {
26395
+ if (o == null)
26396
+ o = new_buf(8);
26397
+ write_XLSBShortCell(ncell, o);
26398
+ o.write_shift(4, ncell.v);
26399
+ return o;
26400
+ }
25517
26401
  function parse_BrtCellReal(data) {
25518
26402
  var cell = parse_XLSBCell(data);
25519
26403
  var value = parse_Xnum(data);
@@ -25526,6 +26410,18 @@
25526
26410
  write_Xnum(cell.v, o);
25527
26411
  return o;
25528
26412
  }
26413
+ function parse_BrtShortReal(data) {
26414
+ var cell = parse_XLSBShortCell(data);
26415
+ var value = parse_Xnum(data);
26416
+ return [cell, value, "n"];
26417
+ }
26418
+ function write_BrtShortReal(cell, ncell, o) {
26419
+ if (o == null)
26420
+ o = new_buf(12);
26421
+ write_XLSBShortCell(ncell, o);
26422
+ write_Xnum(cell.v, o);
26423
+ return o;
26424
+ }
25529
26425
  function parse_BrtCellRk(data) {
25530
26426
  var cell = parse_XLSBCell(data);
25531
26427
  var value = parse_RkNumber(data);
@@ -25538,6 +26434,18 @@
25538
26434
  write_RkNumber(cell.v, o);
25539
26435
  return o;
25540
26436
  }
26437
+ function parse_BrtShortRk(data) {
26438
+ var cell = parse_XLSBShortCell(data);
26439
+ var value = parse_RkNumber(data);
26440
+ return [cell, value, "n"];
26441
+ }
26442
+ function write_BrtShortRk(cell, ncell, o) {
26443
+ if (o == null)
26444
+ o = new_buf(8);
26445
+ write_XLSBShortCell(ncell, o);
26446
+ write_RkNumber(cell.v, o);
26447
+ return o;
26448
+ }
25541
26449
  function parse_BrtCellSt(data) {
25542
26450
  var cell = parse_XLSBCell(data);
25543
26451
  var value = parse_XLWideString(data);
@@ -25550,6 +26458,18 @@
25550
26458
  write_XLWideString(cell.v, o);
25551
26459
  return o.length > o.l ? o.slice(0, o.l) : o;
25552
26460
  }
26461
+ function parse_BrtShortSt(data) {
26462
+ var cell = parse_XLSBShortCell(data);
26463
+ var value = parse_XLWideString(data);
26464
+ return [cell, value, "str"];
26465
+ }
26466
+ function write_BrtShortSt(cell, ncell, o) {
26467
+ if (o == null)
26468
+ o = new_buf(8 + 4 * cell.v.length);
26469
+ write_XLSBShortCell(ncell, o);
26470
+ write_XLWideString(cell.v, o);
26471
+ return o.length > o.l ? o.slice(0, o.l) : o;
26472
+ }
25553
26473
  function parse_BrtFmlaBool(data, length, opts) {
25554
26474
  var end = data.l + length;
25555
26475
  var cell = parse_XLSBCell(data);
@@ -25799,6 +26719,7 @@
25799
26719
  }
25800
26720
  var colinfo = [], rowinfo = [];
25801
26721
  var seencol = false;
26722
+ XLSBRecordEnum[16] = { n: "BrtShortReal", f: parse_BrtShortReal };
25802
26723
  recordhopper(data, function ws_parse(val, R_n, RT) {
25803
26724
  if (end)
25804
26725
  return;
@@ -25828,6 +26749,12 @@
25828
26749
  case 9:
25829
26750
  case 10:
25830
26751
  case 11:
26752
+ case 13:
26753
+ case 14:
26754
+ case 15:
26755
+ case 16:
26756
+ case 17:
26757
+ case 18:
25831
26758
  p = { t: val[2] };
25832
26759
  switch (val[2]) {
25833
26760
  case "n":
@@ -25853,7 +26780,7 @@
25853
26780
  }
25854
26781
  if (cf = styles.CellXf[val[0].iStyleRef])
25855
26782
  safe_format(p, cf.numFmtId, null, opts, themes, styles);
25856
- C = val[0].c;
26783
+ C = val[0].c == -1 ? C + 1 : val[0].c;
25857
26784
  if (opts.dense) {
25858
26785
  if (!s[R])
25859
26786
  s[R] = [];
@@ -25891,10 +26818,11 @@
25891
26818
  }
25892
26819
  break;
25893
26820
  case 1:
26821
+ case 12:
25894
26822
  if (!opts.sheetStubs || pass)
25895
26823
  break;
25896
26824
  p = { t: "z", v: void 0 };
25897
- C = val[0].c;
26825
+ C = val[0].c == -1 ? C + 1 : val[0].c;
25898
26826
  if (opts.dense) {
25899
26827
  if (!s[R])
25900
26828
  s[R] = [];
@@ -25977,6 +26905,8 @@
25977
26905
  wb.Sheets[idx] = {};
25978
26906
  if (val.name)
25979
26907
  wb.Sheets[idx].CodeName = val.name;
26908
+ if (val.above || val.left)
26909
+ s["!outline"] = { above: val.above, left: val.left };
25980
26910
  break;
25981
26911
  case 137:
25982
26912
  if (!wb.Views)
@@ -25993,6 +26923,7 @@
25993
26923
  break;
25994
26924
  case 151:
25995
26925
  break;
26926
+ case 152:
25996
26927
  case 175:
25997
26928
  case 644:
25998
26929
  case 625:
@@ -26032,7 +26963,6 @@
26032
26963
  case 680:
26033
26964
  case 1104:
26034
26965
  case 1024:
26035
- case 152:
26036
26966
  case 663:
26037
26967
  case 535:
26038
26968
  case 678:
@@ -26094,9 +27024,9 @@
26094
27024
  s["!rows"] = rowinfo;
26095
27025
  return s;
26096
27026
  }
26097
- function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
27027
+ function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
26098
27028
  if (cell.v === void 0)
26099
- return;
27029
+ return false;
26100
27030
  var vv = "";
26101
27031
  switch (cell.t) {
26102
27032
  case "b":
@@ -26129,27 +27059,51 @@
26129
27059
  vv = get_sst_id(opts.Strings, cell.v, opts.revStrings);
26130
27060
  o.t = "s";
26131
27061
  o.v = vv;
26132
- write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
27062
+ if (last_seen)
27063
+ write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
27064
+ else
27065
+ write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
26133
27066
  } else {
26134
27067
  o.t = "str";
26135
- write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
27068
+ if (last_seen)
27069
+ write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
27070
+ else
27071
+ write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
26136
27072
  }
26137
- return;
27073
+ return true;
26138
27074
  case "n":
26139
- if (cell.v == (cell.v | 0) && cell.v > -1e3 && cell.v < 1e3)
26140
- write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
26141
- else
26142
- write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
26143
- return;
27075
+ if (cell.v == (cell.v | 0) && cell.v > -1e3 && cell.v < 1e3) {
27076
+ if (last_seen)
27077
+ write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
27078
+ else
27079
+ write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
27080
+ } else {
27081
+ if (last_seen)
27082
+ write_record(ba, "BrtShortReal", write_BrtShortReal(cell, o));
27083
+ else
27084
+ write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
27085
+ }
27086
+ return true;
26144
27087
  case "b":
26145
27088
  o.t = "b";
26146
- write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
26147
- return;
27089
+ if (last_seen)
27090
+ write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
27091
+ else
27092
+ write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
27093
+ return true;
26148
27094
  case "e":
26149
27095
  o.t = "e";
26150
- break;
27096
+ if (last_seen)
27097
+ write_record(ba, "BrtShortError", write_BrtShortError(cell, o));
27098
+ else
27099
+ write_record(ba, "BrtCellError", write_BrtCellError(cell, o));
27100
+ return true;
26151
27101
  }
26152
- write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
27102
+ if (last_seen)
27103
+ write_record(ba, "BrtShortBlank", write_BrtShortBlank(cell, o));
27104
+ else
27105
+ write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
27106
+ return true;
26153
27107
  }
26154
27108
  function write_CELLTABLE(ba, ws, idx, opts) {
26155
27109
  var range = safe_decode_range(ws["!ref"] || "A1"), ref, rr = "", cols = [];
@@ -26161,15 +27115,18 @@
26161
27115
  for (var R = range.s.r; R <= cap; ++R) {
26162
27116
  rr = encode_row(R);
26163
27117
  write_row_header(ba, ws, range, R);
27118
+ var last_seen = false;
26164
27119
  if (R <= range.e.r)
26165
27120
  for (var C = range.s.c; C <= range.e.c; ++C) {
26166
27121
  if (R === range.s.r)
26167
27122
  cols[C] = encode_col(C);
26168
27123
  ref = cols[C] + rr;
26169
27124
  var cell = dense ? (ws[R] || [])[C] : ws[ref];
26170
- if (!cell)
27125
+ if (!cell) {
27126
+ last_seen = false;
26171
27127
  continue;
26172
- write_ws_bin_cell(ba, cell, R, C, opts, ws);
27128
+ }
27129
+ last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
26173
27130
  }
26174
27131
  }
26175
27132
  write_record(ba, "BrtEndSheetData");
@@ -26279,8 +27236,8 @@
26279
27236
  ws["!links"] = [];
26280
27237
  ws["!comments"] = [];
26281
27238
  write_record(ba, "BrtBeginSheet");
26282
- if (wb.vbaraw)
26283
- write_record(ba, "BrtWsProp", write_BrtWsProp(c));
27239
+ if (wb.vbaraw || ws["!outline"])
27240
+ write_record(ba, "BrtWsProp", write_BrtWsProp(c, ws["!outline"]));
26284
27241
  write_record(ba, "BrtWsDim", write_BrtWsDim(r));
26285
27242
  write_WSVIEWS2(ba, ws, wb.Workbook);
26286
27243
  write_WSFMTINFO(ba, ws);
@@ -26945,6 +27902,7 @@
26945
27902
  var supbooks = [[]];
26946
27903
  supbooks.SheetNames = [];
26947
27904
  supbooks.XTI = [];
27905
+ XLSBRecordEnum[16] = { n: "BrtFRTArchID$", f: parse_BrtFRTArchID$ };
26948
27906
  recordhopper(data, function hopper_wb(val, R_n, RT) {
26949
27907
  switch (RT) {
26950
27908
  case 156:
@@ -26984,12 +27942,16 @@
26984
27942
  break;
26985
27943
  case 361:
26986
27944
  break;
27945
+ case 2071:
27946
+ case 158:
27947
+ case 143:
27948
+ case 664:
27949
+ case 353:
27950
+ break;
26987
27951
  case 3072:
26988
27952
  case 3073:
26989
- case 2071:
26990
27953
  case 534:
26991
27954
  case 677:
26992
- case 158:
26993
27955
  case 157:
26994
27956
  case 610:
26995
27957
  case 2050:
@@ -27060,7 +28022,6 @@
27060
28022
  write_XLWideString(XLSX2.version, o);
27061
28023
  write_XLWideString(XLSX2.version, o);
27062
28024
  write_XLWideString("7262", o);
27063
- o.length = o.l;
27064
28025
  return o.length > o.l ? o.slice(0, o.l) : o;
27065
28026
  }
27066
28027
  function write_BrtBookView(idx, o) {
@@ -27420,6 +28381,12 @@
27420
28381
  str = utf8read(str);
27421
28382
  }
27422
28383
  var opening = str.slice(0, 1024).toLowerCase(), ishtml = false;
28384
+ opening = opening.replace(/".*?"/g, "");
28385
+ if ((opening.indexOf(">") & 1023) > Math.min(opening.indexOf(",") & 1023, opening.indexOf(";") & 1023)) {
28386
+ var _o = dup(opts);
28387
+ _o.type = "string";
28388
+ return PRN.to_workbook(str, _o);
28389
+ }
27423
28390
  if (opening.indexOf("<?xml") == -1)
27424
28391
  ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) {
27425
28392
  if (opening.indexOf("<" + tag) >= 0)
@@ -27482,7 +28449,7 @@
27482
28449
  cursheet[encode_col(c) + encode_row(r)] = cell;
27483
28450
  }
27484
28451
  if (cell.HRef) {
27485
- cell.l = { Target: cell.HRef };
28452
+ cell.l = { Target: unescapexml(cell.HRef) };
27486
28453
  if (cell.HRefScreenTip)
27487
28454
  cell.l.Tooltip = cell.HRefScreenTip;
27488
28455
  delete cell.HRef;
@@ -27800,6 +28767,8 @@
27800
28767
  } else if (Rn[0].charAt(Rn[0].length - 2) !== "/")
27801
28768
  state.push([Rn[3], true]);
27802
28769
  break;
28770
+ case "null":
28771
+ break;
27803
28772
  default:
27804
28773
  if (state.length == 0 && Rn[3] == "document")
27805
28774
  return parse_fods(str, opts);
@@ -28033,6 +29002,8 @@
28033
29002
  break;
28034
29003
  case "print":
28035
29004
  break;
29005
+ case "printerrors":
29006
+ break;
28036
29007
  case "panes":
28037
29008
  break;
28038
29009
  case "scale":
@@ -28112,6 +29083,9 @@
28112
29083
  case "allowsizerows":
28113
29084
  break;
28114
29085
  case "nosummaryrowsbelowdetail":
29086
+ if (!cursheet["!outline"])
29087
+ cursheet["!outline"] = {};
29088
+ cursheet["!outline"].above = true;
28115
29089
  break;
28116
29090
  case "tabcolorindex":
28117
29091
  break;
@@ -28120,6 +29094,9 @@
28120
29094
  case "showpagelayoutzoom":
28121
29095
  break;
28122
29096
  case "nosummarycolumnsrightdetail":
29097
+ if (!cursheet["!outline"])
29098
+ cursheet["!outline"] = {};
29099
+ cursheet["!outline"].left = true;
28123
29100
  break;
28124
29101
  case "blackandwhite":
28125
29102
  break;
@@ -28933,7 +29910,7 @@
28933
29910
  } else
28934
29911
  p.w = SSF._general(p.v);
28935
29912
  } else
28936
- p.w = SSF.format(fmtid, p.v, { date1904: !!date1904 });
29913
+ p.w = SSF.format(fmtid, p.v, { date1904: !!date1904, dateNF: opts && opts.dateNF });
28937
29914
  } catch (e) {
28938
29915
  if (opts.WTF)
28939
29916
  throw e;
@@ -28966,7 +29943,6 @@
28966
29943
  var arrayf = [];
28967
29944
  var temp_val;
28968
29945
  var country;
28969
- var cell_valid = true;
28970
29946
  var XFs = [];
28971
29947
  var palette = [];
28972
29948
  var Workbook = { Sheets: [], WBProps: { date1904: false }, Views: [{}] }, wsprops = {};
@@ -28995,8 +29971,6 @@
28995
29971
  if (file_depth > 1)
28996
29972
  return;
28997
29973
  if (options2.sheetRows && cell.r >= options2.sheetRows)
28998
- cell_valid = false;
28999
- if (!cell_valid)
29000
29974
  return;
29001
29975
  if (options2.cellStyles && line.XF && line.XF.data)
29002
29976
  process_cell_style(cell, line, options2);
@@ -29177,6 +30151,10 @@
29177
30151
  case "WsBool":
29178
30152
  if (val.fDialog)
29179
30153
  out["!type"] = "dialog";
30154
+ if (!val.fBelow)
30155
+ (out["!outline"] || (out["!outline"] = {})).above = true;
30156
+ if (!val.fRight)
30157
+ (out["!outline"] || (out["!outline"] = {})).left = true;
29180
30158
  break;
29181
30159
  case "XF":
29182
30160
  XFs.push(val);
@@ -29301,17 +30279,22 @@
29301
30279
  2: 2,
29302
30280
  7: 2
29303
30281
  }[val.BIFFVer] || 8;
30282
+ opts.biffguess = val.BIFFVer == 0;
30283
+ if (val.BIFFVer == 0 && val.dt == 4096) {
30284
+ opts.biff = 5;
30285
+ seen_codepage = true;
30286
+ set_cp(opts.codepage = 28591);
30287
+ }
29304
30288
  if (opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16)
29305
30289
  opts.biff = 2;
29306
30290
  if (file_depth++)
29307
30291
  break;
29308
- cell_valid = true;
29309
30292
  out = options.dense ? [] : {};
29310
30293
  if (opts.biff < 8 && !seen_codepage) {
29311
30294
  seen_codepage = true;
29312
30295
  set_cp(opts.codepage = options.codepage || 1252);
29313
30296
  }
29314
- if (opts.biff < 5) {
30297
+ if (opts.biff < 5 || val.BIFFVer == 0 && val.dt == 4096) {
29315
30298
  if (cur_sheet === "")
29316
30299
  cur_sheet = "Sheet1";
29317
30300
  range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
@@ -29344,7 +30327,7 @@
29344
30327
  }
29345
30328
  temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe] || {}, v: val.val, t: "n" };
29346
30329
  if (BIFF2Fmt > 0)
29347
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30330
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29348
30331
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29349
30332
  addcell({ c: val.c, r: val.r }, temp_val, options);
29350
30333
  }
@@ -29353,7 +30336,7 @@
29353
30336
  {
29354
30337
  temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.val, t: val.t };
29355
30338
  if (BIFF2Fmt > 0)
29356
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30339
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29357
30340
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29358
30341
  addcell({ c: val.c, r: val.r }, temp_val, options);
29359
30342
  }
@@ -29362,7 +30345,7 @@
29362
30345
  {
29363
30346
  temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.rknum, t: "n" };
29364
30347
  if (BIFF2Fmt > 0)
29365
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30348
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29366
30349
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29367
30350
  addcell({ c: val.c, r: val.r }, temp_val, options);
29368
30351
  }
@@ -29373,7 +30356,7 @@
29373
30356
  var ixfe = val.rkrec[j - val.c][0];
29374
30357
  temp_val = { ixfe, XF: XFs[ixfe], v: val.rkrec[j - val.c][1], t: "n" };
29375
30358
  if (BIFF2Fmt > 0)
29376
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30359
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29377
30360
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29378
30361
  addcell({ c: j, r: val.r }, temp_val, options);
29379
30362
  }
@@ -29400,7 +30383,7 @@
29400
30383
  temp_val.f = "" + stringify_formula(val.formula, range, val.cell, supbooks, opts);
29401
30384
  }
29402
30385
  if (BIFF2Fmt > 0)
29403
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30386
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29404
30387
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29405
30388
  addcell(val.cell, temp_val, options);
29406
30389
  last_formula = val;
@@ -29416,7 +30399,7 @@
29416
30399
  temp_val.f = "" + stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);
29417
30400
  }
29418
30401
  if (BIFF2Fmt > 0)
29419
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30402
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29420
30403
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29421
30404
  addcell(last_formula.cell, temp_val, options);
29422
30405
  last_formula = null;
@@ -29441,8 +30424,6 @@
29441
30424
  break;
29442
30425
  case "ShrFmla":
29443
30426
  {
29444
- if (!cell_valid)
29445
- break;
29446
30427
  if (!options.cellFormula)
29447
30428
  break;
29448
30429
  if (last_cell) {
@@ -29460,7 +30441,7 @@
29460
30441
  temp_val.h = sst[val.isst].h;
29461
30442
  temp_val.XF = XFs[temp_val.ixfe];
29462
30443
  if (BIFF2Fmt > 0)
29463
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30444
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29464
30445
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29465
30446
  addcell({ c: val.c, r: val.r }, temp_val, options);
29466
30447
  break;
@@ -29468,7 +30449,7 @@
29468
30449
  if (options.sheetStubs) {
29469
30450
  temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], t: "z" };
29470
30451
  if (BIFF2Fmt > 0)
29471
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30452
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29472
30453
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29473
30454
  addcell({ c: val.c, r: val.r }, temp_val, options);
29474
30455
  }
@@ -29479,7 +30460,7 @@
29479
30460
  var _ixfe = val.ixfe[_j - val.c];
29480
30461
  temp_val = { ixfe: _ixfe, XF: XFs[_ixfe], t: "z" };
29481
30462
  if (BIFF2Fmt > 0)
29482
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30463
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29483
30464
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29484
30465
  addcell({ c: _j, r: val.r }, temp_val, options);
29485
30466
  }
@@ -29491,7 +30472,7 @@
29491
30472
  temp_val = make_cell(val.val, val.ixfe, "s");
29492
30473
  temp_val.XF = XFs[temp_val.ixfe];
29493
30474
  if (BIFF2Fmt > 0)
29494
- temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
30475
+ temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 63];
29495
30476
  safe_format_xf(temp_val, options, wb.opts.Date1904);
29496
30477
  addcell({ c: val.c, r: val.r }, temp_val, options);
29497
30478
  break;
@@ -29604,7 +30585,7 @@
29604
30585
  if (!opts.cellStyles)
29605
30586
  break;
29606
30587
  while (val.e >= val.s) {
29607
- colinfo[val.e--] = { width: val.w / 256 };
30588
+ colinfo[val.e--] = { width: val.w / 256, level: val.level || 0, hidden: !!(val.flags & 1) };
29608
30589
  if (!seencol) {
29609
30590
  seencol = true;
29610
30591
  find_mdw_colw(val.w / 256);
@@ -29639,6 +30620,8 @@
29639
30620
  default_margins(out["!margins"] = {});
29640
30621
  out["!margins"][Rn.slice(0, -6).toLowerCase()] = val;
29641
30622
  break;
30623
+ case "Selection":
30624
+ break;
29642
30625
  case "Setup":
29643
30626
  if (!out["!margins"])
29644
30627
  default_margins(out["!margins"] = {});
@@ -29691,8 +30674,6 @@
29691
30674
  break;
29692
30675
  case "QsiSXTag":
29693
30676
  break;
29694
- case "Selection":
29695
- break;
29696
30677
  case "Feat":
29697
30678
  break;
29698
30679
  case "FeatHdr":
@@ -30034,6 +31015,8 @@
30034
31015
  case "BIFF3XF":
30035
31016
  case "BIFF4XF":
30036
31017
  break;
31018
+ case "BIFF2XFINDEX":
31019
+ break;
30037
31020
  case "BIFF4FMTCNT":
30038
31021
  case "BIFF2ROW":
30039
31022
  case "BIFF2WINDOW2":
@@ -30084,11 +31067,16 @@
30084
31067
  });
30085
31068
  if (!options.bookSheets)
30086
31069
  wb.Sheets = Sheets;
31070
+ if (!wb.SheetNames.length && Preamble["!ref"]) {
31071
+ wb.SheetNames.push("Sheet1");
31072
+ if (wb.Sheets)
31073
+ wb.Sheets["Sheet1"] = Preamble;
31074
+ } else
31075
+ wb.Preamble = Preamble;
30087
31076
  if (wb.Sheets)
30088
31077
  FilterDatabases.forEach(function(r, i2) {
30089
31078
  wb.Sheets[wb.SheetNames[i2]]["!autofilter"] = r;
30090
31079
  });
30091
- wb.Preamble = Preamble;
30092
31080
  wb.Strings = sst;
30093
31081
  wb.SSF = SSF.get_table();
30094
31082
  if (opts.enc)
@@ -30208,6 +31196,8 @@
30208
31196
  WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
30209
31197
  else if ((_data = CFB.find(cfb, "NativeContent_MAIN")) && _data.content)
30210
31198
  WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
31199
+ else if ((_data = CFB.find(cfb, "MN0")) && _data.content)
31200
+ throw new Error("Unsupported Works 4 for Mac file");
30211
31201
  else
30212
31202
  throw new Error("Cannot find Workbook stream");
30213
31203
  if (options.bookVBA && cfb.FullPaths && CFB.find(cfb, "/_VBA_PROJECT_CUR/VBA/dir"))
@@ -30262,7 +31252,13 @@
30262
31252
  9: { n: "BrtFmlaNum", f: parse_BrtFmlaNum },
30263
31253
  10: { n: "BrtFmlaBool", f: parse_BrtFmlaBool },
30264
31254
  11: { n: "BrtFmlaError", f: parse_BrtFmlaError },
30265
- 16: { n: "BrtFRTArchID$", f: parse_BrtFRTArchID$ },
31255
+ 12: { n: "BrtShortBlank", f: parse_BrtShortBlank },
31256
+ 13: { n: "BrtShortRk", f: parse_BrtShortRk },
31257
+ 14: { n: "BrtShortError", f: parse_BrtShortError },
31258
+ 15: { n: "BrtShortBool", f: parse_BrtShortBool },
31259
+ 16: { n: "BrtShortReal", f: parse_BrtShortReal },
31260
+ 17: { n: "BrtShortSt", f: parse_BrtShortSt },
31261
+ 18: { n: "BrtShortIsst", f: parse_BrtShortIsst },
30266
31262
  19: { n: "BrtSSTItem", f: parse_RichStr },
30267
31263
  20: { n: "BrtPCDIMissing" },
30268
31264
  21: { n: "BrtPCDINumber" },
@@ -31085,11 +32081,9 @@
31085
32081
  65535: { n: "" }
31086
32082
  };
31087
32083
  var XLSBRE = evert_key(XLSBRecordEnum, "n");
32084
+ XLSBRE["BrtFRTArchID$"] = 16;
31088
32085
  var XLSRecordEnum = {
31089
- 3: { n: "BIFF2NUM", f: parse_BIFF2NUM },
31090
- 4: { n: "BIFF2STR", f: parse_BIFF2STR },
31091
32086
  6: { n: "Formula", f: parse_Formula },
31092
- 9: { n: "BOF", f: parse_BOF },
31093
32087
  10: { n: "EOF", f: parsenoop2 },
31094
32088
  12: { n: "CalcCount", f: parseuint16 },
31095
32089
  13: { n: "CalcMode", f: parseuint16 },
@@ -31110,7 +32104,6 @@
31110
32104
  29: { n: "Selection" },
31111
32105
  34: { n: "Date1904", f: parsebool },
31112
32106
  35: { n: "ExternName", f: parse_ExternName },
31113
- 36: { n: "COLWIDTH" },
31114
32107
  38: { n: "LeftMargin", f: parse_Xnum },
31115
32108
  39: { n: "RightMargin", f: parse_Xnum },
31116
32109
  40: { n: "TopMargin", f: parse_Xnum },
@@ -31280,7 +32273,6 @@
31280
32273
  515: { n: "Number", f: parse_Number },
31281
32274
  516: { n: "Label", f: parse_Label },
31282
32275
  517: { n: "BoolErr", f: parse_BoolErr },
31283
- 518: { n: "Formula", f: parse_Formula },
31284
32276
  519: { n: "String", f: parse_String },
31285
32277
  520: { n: "Row", f: parse_Row },
31286
32278
  523: { n: "Index" },
@@ -31290,7 +32282,6 @@
31290
32282
  574: { n: "Window2", f: parse_Window2 },
31291
32283
  638: { n: "RK", f: parse_RK },
31292
32284
  659: { n: "Style" },
31293
- 1030: { n: "Formula", f: parse_Formula },
31294
32285
  1048: { n: "BigName" },
31295
32286
  1054: { n: "Format", f: parse_Format },
31296
32287
  1084: { n: "ContinueBigName" },
@@ -31446,21 +32437,27 @@
31446
32437
  4199: { n: "BopPopCustom" },
31447
32438
  4200: { n: "Fbi2" },
31448
32439
  0: { n: "Dimensions", f: parse_Dimensions },
32440
+ 1: { n: "BIFF2BLANK" },
31449
32441
  2: { n: "BIFF2INT", f: parse_BIFF2INT },
32442
+ 3: { n: "BIFF2NUM", f: parse_BIFF2NUM },
32443
+ 4: { n: "BIFF2STR", f: parse_BIFF2STR },
31450
32444
  5: { n: "BoolErr", f: parse_BoolErr },
31451
32445
  7: { n: "String", f: parse_BIFF2STRING },
31452
32446
  8: { n: "BIFF2ROW" },
32447
+ 9: { n: "BOF", f: parse_BOF },
31453
32448
  11: { n: "Index" },
31454
32449
  22: { n: "ExternCount", f: parseuint16 },
31455
32450
  30: { n: "BIFF2FORMAT", f: parse_BIFF2Format },
31456
32451
  31: { n: "BIFF2FMTCNT" },
31457
32452
  32: { n: "BIFF2COLINFO" },
31458
32453
  33: { n: "Array", f: parse_Array },
32454
+ 36: { n: "COLWIDTH" },
31459
32455
  37: { n: "DefaultRowHeight", f: parse_DefaultRowHeight },
31460
32456
  50: { n: "BIFF2FONTXTRA", f: parse_BIFF2FONTXTRA },
31461
- 52: { n: "DDEObjName" },
31462
32457
  62: { n: "BIFF2WINDOW2" },
32458
+ 52: { n: "DDEObjName" },
31463
32459
  67: { n: "BIFF2XF" },
32460
+ 68: { n: "BIFF2XFINDEX", f: parseuint16 },
31464
32461
  69: { n: "BIFF2FONTCLR" },
31465
32462
  86: { n: "BIFF4FMTCNT" },
31466
32463
  126: { n: "RK" },
@@ -31484,11 +32481,13 @@
31484
32481
  234: { n: "TabIdConf" },
31485
32482
  354: { n: "XL5Modify" },
31486
32483
  421: { n: "FileSharing2" },
32484
+ 518: { n: "Formula", f: parse_Formula },
31487
32485
  521: { n: "BOF", f: parse_BOF },
31488
32486
  536: { n: "Lbl", f: parse_Lbl },
31489
32487
  547: { n: "ExternName", f: parse_ExternName },
31490
32488
  561: { n: "Font" },
31491
32489
  579: { n: "BIFF3XF" },
32490
+ 1030: { n: "Formula", f: parse_Formula },
31492
32491
  1033: { n: "BOF", f: parse_BOF },
31493
32492
  1091: { n: "BIFF4XF" },
31494
32493
  2157: { n: "FeatInfo" },
@@ -31511,7 +32510,7 @@
31511
32510
  };
31512
32511
  var XLSRE = evert_key(XLSRecordEnum, "n");
31513
32512
  function write_biff_rec(ba, type, payload, length) {
31514
- var t = +type || +XLSRE[type];
32513
+ var t = typeof type == "number" ? type : +type || +XLSRE[type];
31515
32514
  if (isNaN(t))
31516
32515
  return;
31517
32516
  var len = length || (payload || []).length || 0;
@@ -31564,13 +32563,7 @@
31564
32563
  function write_BIFF2BERR(r, c, val, t) {
31565
32564
  var out = new_buf(9);
31566
32565
  write_BIFF2Cell(out, r, c);
31567
- if (t == "e") {
31568
- out.write_shift(1, val);
31569
- out.write_shift(1, 1);
31570
- } else {
31571
- out.write_shift(1, val ? 1 : 0);
31572
- out.write_shift(1, 0);
31573
- }
32566
+ write_Bes(val, t || "b", out);
31574
32567
  return out;
31575
32568
  }
31576
32569
  function write_BIFF2LABEL(r, c, val) {
@@ -31597,7 +32590,7 @@
31597
32590
  return;
31598
32591
  case "s":
31599
32592
  case "str":
31600
- write_biff_rec(ba, 4, write_BIFF2LABEL(R, C, cell.v));
32593
+ write_biff_rec(ba, 4, write_BIFF2LABEL(R, C, (cell.v || "").slice(0, 255)));
31601
32594
  return;
31602
32595
  }
31603
32596
  write_biff_rec(ba, 1, write_BIFF2Cell(null, R, C));
@@ -31636,7 +32629,7 @@
31636
32629
  idx = i2;
31637
32630
  if (idx == 0 && !!o.sheet && wb.SheetNames[0] != o.sheet)
31638
32631
  throw new Error("Sheet not found: " + o.sheet);
31639
- write_biff_rec(ba, 9, write_BOF(wb, 16, o));
32632
+ write_biff_rec(ba, o.biff == 4 ? 1033 : o.biff == 3 ? 521 : 9, write_BOF(wb, 16, o));
31640
32633
  write_ws_biff2(ba, wb.Sheets[wb.SheetNames[idx]], idx, o, wb);
31641
32634
  write_biff_rec(ba, 10);
31642
32635
  return ba.end();
@@ -31698,6 +32691,16 @@
31698
32691
  }
31699
32692
  delete ws["!links"];
31700
32693
  }
32694
+ function write_ws_cols_biff8(ba, cols, ws) {
32695
+ if (!cols)
32696
+ return;
32697
+ var cnt = 0;
32698
+ cols.forEach(function(col, idx) {
32699
+ if (++cnt <= 256 && col) {
32700
+ write_biff_rec(ba, "ColInfo", write_ColInfo(col_obj_w(idx, col), idx));
32701
+ }
32702
+ });
32703
+ }
31701
32704
  function write_ws_biff8_cell(ba, cell, R, C, opts) {
31702
32705
  var os = 16 + get_cell_style(opts.cellXfs, cell, opts);
31703
32706
  if (cell.v == null && !cell.bf) {
@@ -31723,7 +32726,7 @@
31723
32726
  var isst = get_sst_id(opts.Strings, cell.v, opts.revStrings);
31724
32727
  write_biff_rec(ba, "LabelSst", write_LabelSst(R, C, isst, os, opts));
31725
32728
  } else
31726
- write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts));
32729
+ write_biff_rec(ba, "Label", write_Label(R, C, (cell.v || "").slice(0, 255), os, opts));
31727
32730
  break;
31728
32731
  default:
31729
32732
  write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
@@ -31758,6 +32761,8 @@
31758
32761
  write_biff_rec(ba, "Guts", write_Guts([0, 0]));
31759
32762
  write_biff_rec(ba, "HCenter", writebool(false));
31760
32763
  write_biff_rec(ba, "VCenter", writebool(false));
32764
+ if (b8)
32765
+ write_ws_cols_biff8(ba, ws["!cols"], ws);
31761
32766
  write_biff_rec(ba, 512, write_Dimensions(range, opts));
31762
32767
  if (b8)
31763
32768
  ws["!links"] = [];
@@ -31895,6 +32900,15 @@
31895
32900
  return __toBuffer([bufs]);
31896
32901
  }
31897
32902
  function write_biff_buf(wb, opts) {
32903
+ for (var i2 = 0; i2 <= wb.SheetNames.length; ++i2) {
32904
+ var ws = wb.Sheets[wb.SheetNames[i2]];
32905
+ if (!ws || !ws["!ref"])
32906
+ continue;
32907
+ var range = decode_range(ws["!ref"]);
32908
+ if (range.e.c > 255) {
32909
+ console.error("Worksheet '" + wb.SheetNames[i2] + "' extends beyond column IV (255). Data may be lost.");
32910
+ }
32911
+ }
31898
32912
  var o = opts || {};
31899
32913
  switch (o.biff || 2) {
31900
32914
  case 8:
@@ -31956,7 +32970,7 @@
31956
32970
  CS = tag.colspan ? +tag.colspan : 1;
31957
32971
  if ((RS = +tag.rowspan) > 1 || CS > 1)
31958
32972
  merges.push({ s: { r: R, c: C }, e: { r: R + (RS || 1) - 1, c: C + CS - 1 } });
31959
- var _t = tag.t || "";
32973
+ var _t = tag.t || tag["data-t"] || "";
31960
32974
  if (!m.length) {
31961
32975
  C += CS;
31962
32976
  continue;
@@ -32001,7 +33015,16 @@
32001
33015
  return ws;
32002
33016
  }
32003
33017
  function html_to_book(str, opts) {
32004
- return sheet_to_workbook(html_to_sheet(str, opts), opts);
33018
+ var mtch = str.match(/<table.*?>[\s\S]*?<\/table>/gi);
33019
+ if (!mtch || mtch.length == 0)
33020
+ throw new Error("Invalid HTML: could not find <table>");
33021
+ if (mtch.length == 1)
33022
+ return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
33023
+ var wb = utils2.book_new();
33024
+ mtch.forEach(function(s, idx) {
33025
+ utils2.book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx + 1));
33026
+ });
33027
+ return wb;
32005
33028
  }
32006
33029
  function make_html_row(ws, r, R, o) {
32007
33030
  var M = ws["!merges"] || [];
@@ -32031,15 +33054,18 @@
32031
33054
  sp.rowspan = RS;
32032
33055
  if (CS > 1)
32033
33056
  sp.colspan = CS;
32034
- sp.t = cell && cell.t || "z";
32035
33057
  if (o.editable)
32036
33058
  w = '<span contenteditable="true">' + w + "</span>";
32037
- sp.id = (o.id || "sjs") + "-" + coord;
32038
- if (sp.t != "z") {
32039
- sp.v = cell.v;
33059
+ else if (cell) {
33060
+ sp["data-t"] = cell && cell.t || "z";
33061
+ if (cell.v != null)
33062
+ sp["data-v"] = cell.v;
32040
33063
  if (cell.z != null)
32041
- sp.z = cell.z;
33064
+ sp["data-z"] = cell.z;
33065
+ if (cell.l && (cell.l.Target || "#").charAt(0) != "#")
33066
+ w = '<a href="' + cell.l.Target + '">' + w + "</a>";
32042
33067
  }
33068
+ sp.id = (o.id || "sjs") + "-" + coord;
32043
33069
  oo.push(writextag("td", w, sp));
32044
33070
  }
32045
33071
  var preamble = "<tr>";
@@ -32117,8 +33143,8 @@
32117
33143
  var elt = elts[_C];
32118
33144
  if (opts.display && is_dom_element_hidden(elt))
32119
33145
  continue;
32120
- var v = elt.hasAttribute("v") ? elt.getAttribute("v") : htmldecode(elt.innerHTML);
32121
- var z = elt.getAttribute("z");
33146
+ var v = elt.hasAttribute("data-v") ? elt.getAttribute("data-v") : elt.hasAttribute("v") ? elt.getAttribute("v") : htmldecode(elt.innerHTML);
33147
+ var z = elt.getAttribute("data-z") || elt.getAttribute("z");
32122
33148
  for (midx = 0; midx < merges.length; ++midx) {
32123
33149
  var m = merges[midx];
32124
33150
  if (m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) {
@@ -32130,7 +33156,7 @@
32130
33156
  if ((RS = +elt.getAttribute("rowspan") || 1) > 1 || CS > 1)
32131
33157
  merges.push({ s: { r: R + or_R, c: C + or_C }, e: { r: R + or_R + (RS || 1) - 1, c: C + or_C + (CS || 1) - 1 } });
32132
33158
  var o = { t: "s", v };
32133
- var _t = elt.getAttribute("t") || "";
33159
+ var _t = elt.getAttribute("data-t") || elt.getAttribute("t") || "";
32134
33160
  if (v != null) {
32135
33161
  if (v.length == 0)
32136
33162
  o.t = _t || "z";
@@ -32150,6 +33176,17 @@
32150
33176
  }
32151
33177
  if (o.z === void 0 && z != null)
32152
33178
  o.z = z;
33179
+ var l = "", Aelts = elt.getElementsByTagName("A");
33180
+ if (Aelts && Aelts.length) {
33181
+ for (var Aelti = 0; Aelti < Aelts.length; ++Aelti)
33182
+ if (Aelts[Aelti].hasAttribute("href")) {
33183
+ l = Aelts[Aelti].getAttribute("href");
33184
+ if (l.charAt(0) != "#")
33185
+ break;
33186
+ }
33187
+ }
33188
+ if (l && l.charAt(0) != "#")
33189
+ o.l = { Target: l };
32153
33190
  if (opts.dense) {
32154
33191
  if (!ws[R + or_R])
32155
33192
  ws[R + or_R] = [];
@@ -32343,6 +33380,9 @@
32343
33380
  C += colpeat - 1;
32344
33381
  } else if (Rn[1] !== "/") {
32345
33382
  ++C;
33383
+ textp = "";
33384
+ textpidx = 0;
33385
+ textR = [];
32346
33386
  colpeat = 1;
32347
33387
  var rptR = rowpeat ? R + rowpeat - 1 : R;
32348
33388
  if (C > range.e.c)
@@ -32413,6 +33453,11 @@
32413
33453
  case "time":
32414
33454
  q.t = "n";
32415
33455
  q.v = parse_isodur(ctag["time-value"]) / 86400;
33456
+ if (opts.cellDates) {
33457
+ q.t = "d";
33458
+ q.v = numdate(q.v);
33459
+ }
33460
+ q.z = "HH:MM:SS";
32416
33461
  break;
32417
33462
  case "number":
32418
33463
  q.t = "n";
@@ -32840,12 +33885,13 @@
32840
33885
  atag = parsexmltag(Rn[0], false);
32841
33886
  if (!atag.href)
32842
33887
  break;
32843
- atag.Target = atag.href;
33888
+ atag.Target = unescapexml(atag.href);
32844
33889
  delete atag.href;
32845
33890
  if (atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) {
32846
33891
  _Ref = ods_to_csf_3D(atag.Target.slice(1));
32847
33892
  atag.Target = "#" + _Ref[0] + "!" + _Ref[1];
32848
- }
33893
+ } else if (atag.Target.match(/^\.\.[\\\/]/))
33894
+ atag.Target = atag.Target.slice(3);
32849
33895
  }
32850
33896
  break;
32851
33897
  case "table-protection":
@@ -32886,13 +33932,12 @@
32886
33932
  }();
32887
33933
  function parse_ods(zip, opts) {
32888
33934
  opts = opts || {};
32889
- var ods = !!safegetzipfile(zip, "objectdata");
32890
- if (ods)
33935
+ if (safegetzipfile(zip, "META-INF/manifest.xml"))
32891
33936
  parse_manifest(getzipdata(zip, "META-INF/manifest.xml"), opts);
32892
33937
  var content = getzipstr(zip, "content.xml");
32893
33938
  if (!content)
32894
- throw new Error("Missing content.xml in " + (ods ? "ODS" : "UOF") + " file");
32895
- var wb = parse_content_xml(ods ? content : utf8read(content), opts);
33939
+ throw new Error("Missing content.xml in ODS / UOF file");
33940
+ var wb = parse_content_xml(utf8read(content), opts);
32896
33941
  if (safegetzipfile(zip, "meta.xml"))
32897
33942
  wb.Props = parse_core_props(getzipdata(zip, "meta.xml"));
32898
33943
  return wb;
@@ -32901,6 +33946,16 @@
32901
33946
  return parse_content_xml(data, opts);
32902
33947
  }
32903
33948
  var write_styles_ods = function() {
33949
+ var master_styles = [
33950
+ "<office:master-styles>",
33951
+ '<style:master-page style:name="mp1" style:page-layout-name="mp1">',
33952
+ "<style:header/>",
33953
+ '<style:header-left style:display="false"/>',
33954
+ "<style:footer/>",
33955
+ '<style:footer-left style:display="false"/>',
33956
+ "</style:master-page>",
33957
+ "</office:master-styles>"
33958
+ ].join("");
32904
33959
  var payload = "<office:document-styles " + wxt_helper({
32905
33960
  "xmlns:office": "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
32906
33961
  "xmlns:table": "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
@@ -32914,7 +33969,7 @@
32914
33969
  "xmlns:svg": "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
32915
33970
  "xmlns:of": "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
32916
33971
  "office:version": "1.2"
32917
- }) + "></office:document-styles>";
33972
+ }) + ">" + master_styles + "</office:document-styles>";
32918
33973
  return function wso() {
32919
33974
  return XML_HEADER + payload;
32920
33975
  };
@@ -32923,20 +33978,28 @@
32923
33978
  var write_text_p = function(text) {
32924
33979
  return escapexml(text).replace(/ +/g, function($$) {
32925
33980
  return '<text:s text:c="' + $$.length + '"/>';
32926
- }).replace(/\t/g, "<text:tab/>").replace(/\n/g, "<text:line-break/>").replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
33981
+ }).replace(/\t/g, "<text:tab/>").replace(/\n/g, "</text:p><text:p>").replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
32927
33982
  };
32928
33983
  var null_cell_xml = " <table:table-cell />\n";
32929
33984
  var covered_cell_xml = " <table:covered-table-cell/>\n";
32930
33985
  var write_ws2 = function(ws, wb, i2) {
32931
33986
  var o = [];
32932
33987
  o.push(' <table:table table:name="' + escapexml(wb.SheetNames[i2]) + '" table:style-name="ta1">\n');
32933
- var R = 0, C = 0, range = decode_range(ws["!ref"]);
33988
+ var R = 0, C = 0, range = decode_range(ws["!ref"] || "A1");
32934
33989
  var marr = ws["!merges"] || [], mi = 0;
32935
33990
  var dense = Array.isArray(ws);
32936
- for (R = 0; R < range.s.r; ++R)
32937
- o.push(" <table:table-row></table:table-row>\n");
33991
+ if (ws["!cols"]) {
33992
+ for (C = 0; C <= range.e.c; ++C)
33993
+ o.push(" <table:table-column" + (ws["!cols"][C] ? ' table:style-name="co' + ws["!cols"][C].ods + '"' : "") + "></table:table-column>\n");
33994
+ }
33995
+ var H = "", ROWS = ws["!rows"] || [];
33996
+ for (R = 0; R < range.s.r; ++R) {
33997
+ H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : "";
33998
+ o.push(" <table:table-row" + H + "></table:table-row>\n");
33999
+ }
32938
34000
  for (; R <= range.e.r; ++R) {
32939
- o.push(" <table:table-row>\n");
34001
+ H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : "";
34002
+ o.push(" <table:table-row" + H + ">\n");
32940
34003
  for (C = 0; C < range.s.c; ++C)
32941
34004
  o.push(null_cell_xml);
32942
34005
  for (; C <= range.e.c; ++C) {
@@ -33005,7 +34068,9 @@
33005
34068
  if (cell.l && cell.l.Target) {
33006
34069
  var _tgt = cell.l.Target;
33007
34070
  _tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;
33008
- text_p = writextag("text:a", text_p, { "xlink:href": _tgt });
34071
+ if (_tgt.charAt(0) != "#" && !_tgt.match(/^\w+:/))
34072
+ _tgt = "../" + _tgt;
34073
+ text_p = writextag("text:a", text_p, { "xlink:href": _tgt.replace(/&/g, "&amp;") });
33009
34074
  }
33010
34075
  o.push(" " + writextag("table:table-cell", writextag("text:p", text_p, {}), ct) + "\n");
33011
34076
  }
@@ -33014,7 +34079,7 @@
33014
34079
  o.push(" </table:table>\n");
33015
34080
  return o.join("");
33016
34081
  };
33017
- var write_automatic_styles_ods = function(o) {
34082
+ var write_automatic_styles_ods = function(o, wb) {
33018
34083
  o.push(" <office:automatic-styles>\n");
33019
34084
  o.push(' <number:date-style style:name="N37" number:automatic-order="true">\n');
33020
34085
  o.push(' <number:month number:style="long"/>\n');
@@ -33023,7 +34088,47 @@
33023
34088
  o.push(" <number:text>/</number:text>\n");
33024
34089
  o.push(" <number:year/>\n");
33025
34090
  o.push(" </number:date-style>\n");
33026
- o.push(' <style:style style:name="ta1" style:family="table">\n');
34091
+ var cidx = 0;
34092
+ wb.SheetNames.map(function(n) {
34093
+ return wb.Sheets[n];
34094
+ }).forEach(function(ws) {
34095
+ if (!ws)
34096
+ return;
34097
+ if (ws["!cols"]) {
34098
+ for (var C = 0; C < ws["!cols"].length; ++C)
34099
+ if (ws["!cols"][C]) {
34100
+ var colobj = ws["!cols"][C];
34101
+ if (colobj.width == null && colobj.wpx == null && colobj.wch == null)
34102
+ continue;
34103
+ process_col(colobj);
34104
+ colobj.ods = cidx;
34105
+ var w = ws["!cols"][C].wpx + "px";
34106
+ o.push(' <style:style style:name="co' + cidx + '" style:family="table-column">\n');
34107
+ o.push(' <style:table-column-properties fo:break-before="auto" style:column-width="' + w + '"/>\n');
34108
+ o.push(" </style:style>\n");
34109
+ ++cidx;
34110
+ }
34111
+ }
34112
+ });
34113
+ var ridx = 0;
34114
+ wb.SheetNames.map(function(n) {
34115
+ return wb.Sheets[n];
34116
+ }).forEach(function(ws) {
34117
+ if (!ws)
34118
+ return;
34119
+ if (ws["!rows"]) {
34120
+ for (var R = 0; R < ws["!rows"].length; ++R)
34121
+ if (ws["!rows"][R]) {
34122
+ ws["!rows"][R].ods = ridx;
34123
+ var h = ws["!rows"][R].hpx + "px";
34124
+ o.push(' <style:style style:name="ro' + ridx + '" style:family="table-row">\n');
34125
+ o.push(' <style:table-row-properties fo:break-before="auto" style:row-height="' + h + '"/>\n');
34126
+ o.push(" </style:style>\n");
34127
+ ++ridx;
34128
+ }
34129
+ }
34130
+ });
34131
+ o.push(' <style:style style:name="ta1" style:family="table" style:master-page-name="mp1">\n');
33027
34132
  o.push(' <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n');
33028
34133
  o.push(" </style:style>\n");
33029
34134
  o.push(' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n');
@@ -33074,11 +34179,12 @@
33074
34179
  "xmlns:config": "urn:oasis:names:tc:opendocument:xmlns:config:1.0",
33075
34180
  "office:mimetype": "application/vnd.oasis.opendocument.spreadsheet"
33076
34181
  });
33077
- if (opts.bookType == "fods")
34182
+ if (opts.bookType == "fods") {
33078
34183
  o.push("<office:document" + attr + fods + ">\n");
33079
- else
34184
+ o.push(write_meta_ods().replace(/office:document-meta/g, "office:meta"));
34185
+ } else
33080
34186
  o.push("<office:document-content" + attr + ">\n");
33081
- write_automatic_styles_ods(o);
34187
+ write_automatic_styles_ods(o, wb);
33082
34188
  o.push(" <office:body>\n");
33083
34189
  o.push(" <office:spreadsheet>\n");
33084
34190
  for (var i2 = 0; i2 != wb.SheetNames.length; ++i2)
@@ -33110,7 +34216,7 @@
33110
34216
  manifest.push([f, "text/xml"]);
33111
34217
  rdf.push([f, "StylesFile"]);
33112
34218
  f = "meta.xml";
33113
- zip_add_file(zip, f, write_meta_ods());
34219
+ zip_add_file(zip, f, XML_HEADER + write_meta_ods());
33114
34220
  manifest.push([f, "text/xml"]);
33115
34221
  rdf.push([f, "MetadataFile"]);
33116
34222
  f = "manifest.rdf";
@@ -33143,6 +34249,7 @@
33143
34249
  var write_txt_str = write_obj_str({ from_sheet: sheet_to_txt });
33144
34250
  var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
33145
34251
  var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
34252
+ var write_wk1_buf = write_obj_str(typeof WK_ !== "undefined" ? { from_sheet: WK_.sheet_to_wk1 } : {});
33146
34253
  function fix_opts_func(defaults) {
33147
34254
  return function fix_opts(opts) {
33148
34255
  for (var i2 = 0; i2 != defaults.length; ++i2) {
@@ -33264,6 +34371,13 @@
33264
34371
  return parse_ods(zip, opts);
33265
34372
  if (safegetzipfile(zip, "Index/Document.iwa"))
33266
34373
  throw new Error("Unsupported NUMBERS file");
34374
+ if (!safegetzipfile(zip, "[Content_Types].xml")) {
34375
+ if (safegetzipfile(zip, "index.xml.gz"))
34376
+ throw new Error("Unsupported NUMBERS 08 file");
34377
+ if (safegetzipfile(zip, "index.xml"))
34378
+ throw new Error("Unsupported NUMBERS 09 file");
34379
+ throw new Error("Unsupported ZIP file");
34380
+ }
33267
34381
  var entries = zipentries(zip);
33268
34382
  var dir = parse_ct(getzipstr(zip, "[Content_Types].xml"));
33269
34383
  var xlsb = false;
@@ -33420,8 +34534,18 @@
33420
34534
  SSF: SSF.get_table()
33421
34535
  };
33422
34536
  if (opts && opts.bookFiles) {
33423
- out.keys = entries;
33424
- out.files = zip.files;
34537
+ if (zip.files) {
34538
+ out.keys = entries;
34539
+ out.files = zip.files;
34540
+ } else {
34541
+ out.keys = [];
34542
+ out.files = {};
34543
+ zip.FullPaths.forEach(function(p, idx) {
34544
+ p = p.replace(/^Root Entry[\/]/, "");
34545
+ out.keys.push(p);
34546
+ out.files[p] = zip.FileIndex[idx];
34547
+ });
34548
+ }
33425
34549
  }
33426
34550
  if (opts && opts.bookVBA) {
33427
34551
  if (dir.vba.length > 0)
@@ -33690,10 +34814,10 @@
33690
34814
  }
33691
34815
  function readSync(data, opts) {
33692
34816
  reset_cp();
34817
+ var o = opts || {};
33693
34818
  if (typeof ArrayBuffer !== "undefined" && data instanceof ArrayBuffer)
33694
- return readSync(new Uint8Array(data), opts);
34819
+ return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o));
33695
34820
  var d = data, n = [0, 0, 0, 0], str = false;
33696
- var o = opts || {};
33697
34821
  if (o.cellStyles) {
33698
34822
  o.cellNF = true;
33699
34823
  o.sheetStubs = true;
@@ -33728,12 +34852,14 @@
33728
34852
  return read_cfb(CFB.read(d, o), o);
33729
34853
  break;
33730
34854
  case 9:
33731
- if (n[1] <= 4)
34855
+ if (n[1] <= 8)
33732
34856
  return parse_xlscfb(d, o);
33733
34857
  break;
33734
34858
  case 60:
33735
34859
  return parse_xlml(d, o);
33736
34860
  case 73:
34861
+ if (n[1] === 73 && n[2] === 42 && n[3] === 0)
34862
+ throw new Error("TIFF Image File is not a spreadsheet");
33737
34863
  if (n[1] === 68)
33738
34864
  return read_wb_ID(d, o);
33739
34865
  break;
@@ -33748,11 +34874,16 @@
33748
34874
  case 255:
33749
34875
  if (n[1] === 254) {
33750
34876
  return read_utf16(d, o);
33751
- }
34877
+ } else if (n[1] === 0 && n[2] === 2 && n[3] === 0)
34878
+ return WK_.to_workbook(d, o);
33752
34879
  break;
33753
34880
  case 0:
33754
- if (n[1] === 0 && n[2] >= 2 && n[3] === 0)
33755
- return WK_.to_workbook(d, o);
34881
+ if (n[1] === 0) {
34882
+ if (n[2] >= 2 && n[3] === 0)
34883
+ return WK_.to_workbook(d, o);
34884
+ if (n[2] === 0 && (n[3] === 8 || n[3] === 9))
34885
+ return WK_.to_workbook(d, o);
34886
+ }
33756
34887
  break;
33757
34888
  case 3:
33758
34889
  case 131:
@@ -33767,6 +34898,10 @@
33767
34898
  case 13:
33768
34899
  case 32:
33769
34900
  return read_plaintext_raw(d, o);
34901
+ case 137:
34902
+ if (n[1] === 80 && n[2] === 78 && n[3] === 71)
34903
+ throw new Error("PNG Image File is not a spreadsheet");
34904
+ break;
33770
34905
  }
33771
34906
  if (DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31)
33772
34907
  return DBF.to_workbook(d, o);
@@ -33796,7 +34931,7 @@
33796
34931
  return CFB.write(cfb, o);
33797
34932
  }
33798
34933
  function write_zip_type(wb, opts) {
33799
- var o = opts || {};
34934
+ var o = dup(opts || {});
33800
34935
  var z = write_zip(wb, o);
33801
34936
  var oopts = {};
33802
34937
  if (o.compression)
@@ -33897,7 +35032,7 @@
33897
35032
  function writeSync(wb, opts) {
33898
35033
  reset_cp();
33899
35034
  check_wb(wb);
33900
- var o = opts || {};
35035
+ var o = dup(opts || {});
33901
35036
  if (o.cellStyles) {
33902
35037
  o.cellNF = true;
33903
35038
  o.sheetStubs = true;
@@ -33934,6 +35069,10 @@
33934
35069
  return write_string_type(write_eth_str(wb, o), o);
33935
35070
  case "fods":
33936
35071
  return write_string_type(write_ods(wb, o), o);
35072
+ case "wk1":
35073
+ return write_binary_type(write_wk1_buf(wb, o), o);
35074
+ case "wk3":
35075
+ return write_binary_type(WK_.book_to_wk3(wb, o), o);
33937
35076
  case "biff2":
33938
35077
  if (!o.biff)
33939
35078
  o.biff = 2;
@@ -34029,7 +35168,7 @@
34029
35168
  break;
34030
35169
  continue;
34031
35170
  case "e":
34032
- v = void 0;
35171
+ v = v == 0 ? null : void 0;
34033
35172
  break;
34034
35173
  case "s":
34035
35174
  case "d":
@@ -34041,7 +35180,9 @@
34041
35180
  }
34042
35181
  if (hdr[C] != null) {
34043
35182
  if (v == null) {
34044
- if (defval !== void 0)
35183
+ if (val.t == "e" && v === null)
35184
+ row[hdr[C]] = null;
35185
+ else if (defval !== void 0)
34045
35186
  row[hdr[C]] = defval;
34046
35187
  else if (raw && v === null)
34047
35188
  row[hdr[C]] = null;
@@ -34300,6 +35441,9 @@
34300
35441
  v = datenum(v);
34301
35442
  }
34302
35443
  z = o.dateNF || SSF._table[14];
35444
+ } else if (v === null && o.nullError) {
35445
+ t = "e";
35446
+ v = 0;
34303
35447
  }
34304
35448
  if (!cell)
34305
35449
  ws[ref] = cell = { t, v };
@@ -34471,7 +35615,12 @@
34471
35615
  })(utils2);
34472
35616
  if (has_buf && typeof __require != "undefined")
34473
35617
  (function() {
34474
- var Readable = require_stream().Readable;
35618
+ var strmod = require_stream();
35619
+ if (!strmod)
35620
+ return;
35621
+ var Readable = strmod.Readable;
35622
+ if (!Readable)
35623
+ return;
34475
35624
  var write_csv_stream = function(sheet, opts) {
34476
35625
  var stream = Readable();
34477
35626
  var o = opts == null ? {} : opts;
@@ -34642,18 +35791,23 @@
34642
35791
  else if (typeof module !== "undefined" && module.exports)
34643
35792
  make_xlsx_lib(module.exports);
34644
35793
  else if (typeof define === "function" && define.amd)
34645
- define(function() {
35794
+ define("xlsx", function() {
34646
35795
  if (!XLSX.version)
34647
35796
  make_xlsx_lib(XLSX);
34648
35797
  return XLSX;
34649
35798
  });
34650
35799
  else
34651
35800
  make_xlsx_lib(XLSX);
35801
+ if (typeof window !== "undefined" && !window.XLSX)
35802
+ try {
35803
+ window.XLSX = XLSX;
35804
+ } catch (e) {
35805
+ }
34652
35806
  }
34653
35807
  });
34654
35808
 
34655
35809
  // src/lib/parse-excel.ts
34656
- async function parseExcel(arrayBuffer, options) {
35810
+ function parseExcel(arrayBuffer, options) {
34657
35811
  const dataUrl = "dummy";
34658
35812
  const workbook = (0, import_xlsx.read)(arrayBuffer, {
34659
35813
  type: "array"
@@ -34685,19 +35839,20 @@
34685
35839
  var src_exports = {};
34686
35840
  __export(src_exports, {
34687
35841
  ExcelLoader: () => ExcelLoader2,
34688
- ExcelWorkerLoader: () => ExcelLoader,
34689
- _typecheckLoader: () => _typecheckLoader
35842
+ ExcelWorkerLoader: () => ExcelLoader
34690
35843
  });
34691
- var ExcelLoader2, _typecheckLoader;
35844
+ var ExcelLoader2;
34692
35845
  var init_src = __esm({
34693
35846
  "src/index.ts"() {
34694
35847
  init_excel_loader();
34695
35848
  init_parse_excel();
34696
35849
  ExcelLoader2 = {
34697
35850
  ...ExcelLoader,
34698
- parse: (arrayBuffer, options) => parseExcel(arrayBuffer, options)
35851
+ async parse(arrayBuffer, options) {
35852
+ const data = parseExcel(arrayBuffer, options);
35853
+ return { shape: "object-row-table", data };
35854
+ }
34699
35855
  };
34700
- _typecheckLoader = ExcelLoader2;
34701
35856
  }
34702
35857
  });
34703
35858
 
@@ -34711,4 +35866,6 @@
34711
35866
  });
34712
35867
  require_bundle();
34713
35868
  })();
35869
+ /*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
35870
+ /*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */
34714
35871
  /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */