@nocobase/plugin-action-import 2.1.0-beta.8 → 2.2.0-alpha.1

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 (31) hide show
  1. package/client-v2.d.ts +2 -0
  2. package/client-v2.js +1 -0
  3. package/dist/client/ImportActionInitializer.d.ts +2 -6
  4. package/dist/client/buildImportFieldOptions.d.ts +9 -0
  5. package/dist/client/constants.d.ts +1 -1
  6. package/dist/client/index.d.ts +2 -0
  7. package/dist/client/index.js +1 -1
  8. package/dist/client/locale/index.d.ts +2 -1
  9. package/dist/client/useFields.d.ts +1 -1
  10. package/dist/{client/models → client-v2}/ImportActionModel.d.ts +2 -2
  11. package/dist/client-v2/buildImportFieldOptions.d.ts +9 -0
  12. package/dist/{client/models → client-v2}/getOptionFields.d.ts +1 -1
  13. package/dist/client-v2/importSupport.d.ts +15 -0
  14. package/dist/client-v2/index.d.ts +15 -0
  15. package/dist/client-v2/index.js +10 -0
  16. package/dist/client-v2/locale.d.ts +9 -0
  17. package/dist/externalVersion.js +11 -11
  18. package/dist/node_modules/exceljs/excel.js +15 -15
  19. package/dist/node_modules/exceljs/package.json +1 -1
  20. package/dist/node_modules/xlsx/dist/xlsx.core.min.js +17 -16
  21. package/dist/node_modules/xlsx/dist/xlsx.extendscript.js +378 -80
  22. package/dist/node_modules/xlsx/dist/xlsx.full.min.js +17 -17
  23. package/dist/node_modules/xlsx/dist/xlsx.mini.min.js +9 -9
  24. package/dist/node_modules/xlsx/package.json +1 -1
  25. package/dist/node_modules/xlsx/types/index.d.ts +40 -8
  26. package/dist/node_modules/xlsx/xlsx.js +4 -4
  27. package/dist/server/actions/import-xlsx.d.ts +3 -0
  28. package/dist/server/actions/import-xlsx.js +16 -8
  29. package/dist/server/services/xlsx-importer.d.ts +12 -4
  30. package/dist/server/services/xlsx-importer.js +82 -45
  31. package/package.json +4 -3
@@ -160,7 +160,7 @@ var DO_NOT_EXPORT_CODEPAGE = true;
160
160
  /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false, Set:false, Float32Array:false */
161
161
  var XLSX = {};
162
162
  function make_xlsx_lib(XLSX){
163
- XLSX.version = '0.20.2';
163
+ XLSX.version = '0.20.3';
164
164
  var current_codepage = 1200, current_ansi = 1252;
165
165
  /*global cptable:true, window */
166
166
  var $cptable;
@@ -695,6 +695,7 @@ function SSF_large_exp(v) {
695
695
  }
696
696
 
697
697
  function SSF_general_num(v) {
698
+ if(!isFinite(v)) return isNaN(v) ? "#NUM!" : "#DIV/0!";
698
699
  var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
699
700
 
700
701
  if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
@@ -1388,6 +1389,8 @@ function choose_fmt(f, v) {
1388
1389
  if(l<4 && lat>-1) --l;
1389
1390
  if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
1390
1391
  if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
1392
+ /* NOTE: most spreadsheet software do not support NaN or infinities */
1393
+ if(typeof v === "number" && !isFinite(v)) v = 0;
1391
1394
  switch(fmt.length) {
1392
1395
  case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
1393
1396
  case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
@@ -1424,6 +1427,8 @@ function SSF_format(fmt,v,o) {
1424
1427
  if(SSF_isgeneral(f[1])) return SSF_general(v, o);
1425
1428
  if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
1426
1429
  else if(v === "" || v == null) return "";
1430
+ else if(isNaN(v) && f[1].indexOf("0") > -1) return "#NUM!";
1431
+ else if(!isFinite(v) && f[1].indexOf("0") > -1) return "#DIV/0!";
1427
1432
  return eval_fmt(f[1], v, o, f[0]);
1428
1433
  }
1429
1434
  function SSF_load(fmt, idx) {
@@ -1547,7 +1552,6 @@ function SSF__load(fmt, idx) {
1547
1552
  var CRC32 = (function() {
1548
1553
  var CRC32 = {};
1549
1554
  CRC32.version = '1.2.0';
1550
- /* see perf/crc32table.js */
1551
1555
  /*global Int32Array */
1552
1556
  function signed_crc_table() {
1553
1557
  var c = 0, table = new Array(256);
@@ -2946,8 +2950,8 @@ function parse_local_file(blob, csz, usz, o, EF) {
2946
2950
  if((ef[0x0001]||{}).csz) _csz = ef[0x0001].csz;
2947
2951
  if(EF) {
2948
2952
  if((EF[0x5455]||{}).mt) date = EF[0x5455].mt;
2949
- if((EF[0x0001]||{}).usz) _usz = ef[0x0001].usz;
2950
- if((EF[0x0001]||{}).csz) _csz = ef[0x0001].csz;
2953
+ if((EF[0x0001]||{}).usz) _usz = EF[0x0001].usz;
2954
+ if((EF[0x0001]||{}).csz) _csz = EF[0x0001].csz;
2951
2955
  }
2952
2956
  }
2953
2957
  blob.l += efsz;
@@ -2958,7 +2962,7 @@ function parse_local_file(blob, csz, usz, o, EF) {
2958
2962
  var data = blob.slice(blob.l, blob.l + _csz);
2959
2963
  switch(meth) {
2960
2964
  case 8: data = _inflateRawSync(blob, _usz); break;
2961
- case 0: break; // TODO: scan for magic number
2965
+ case 0: blob.l += _csz; break; // TODO: scan for magic number
2962
2966
  default: throw new Error("Unsupported ZIP Compression method " + meth);
2963
2967
  }
2964
2968
 
@@ -2993,9 +2997,10 @@ function write_zip(cfb, options) {
2993
2997
 
2994
2998
  for(i = 1; i < cfb.FullPaths.length; ++i) {
2995
2999
  fp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];
2996
- if(!fi.size || !fi.content || fp == "\u0001Sh33tJ5") continue;
3000
+ if(!fi.size || !fi.content || (Array.isArray(fi.content) && fi.content.length == 0) || fp == "\u0001Sh33tJ5") continue;
2997
3001
  var start = start_cd;
2998
3002
 
3003
+
2999
3004
  /* TODO: CP437 filename */
3000
3005
  var namebuf = new_buf(fp.length);
3001
3006
  for(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);
@@ -3888,6 +3893,9 @@ function zipentries(zip) {
3888
3893
 
3889
3894
  function zip_add_file(zip, path, content) {
3890
3895
  if(zip.FullPaths) {
3896
+ if(Array.isArray(content) && typeof content[0] == "string") {
3897
+ content = content.join("");
3898
+ }
3891
3899
  if(typeof content == "string") {
3892
3900
  var res;
3893
3901
  if(has_buf) res = Buffer_from(content);
@@ -3958,6 +3966,26 @@ function parsexmltag(tag, skip_root, skip_LC) {
3958
3966
  }
3959
3967
  return z;
3960
3968
  }
3969
+ function parsexmltagraw(tag, skip_root, skip_LC) {
3970
+ var z = ({});
3971
+ var eq = 0, c = 0;
3972
+ for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;
3973
+ if(!skip_root) z[0] = tag.slice(0, eq);
3974
+ if(eq === tag.length) return z;
3975
+ var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1;
3976
+ if(m) for(i = 0; i != m.length; ++i) {
3977
+ cc = m[i].slice(1);
3978
+ for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;
3979
+ q = cc.slice(0,c).trim();
3980
+ while(cc.charCodeAt(c+1) == 32) ++c;
3981
+ quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;
3982
+ v = cc.slice(c+1+quot, cc.length-quot);
3983
+ if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
3984
+ z[q] = v;
3985
+ if(!skip_LC) z[q.toLowerCase()] = v;
3986
+ }
3987
+ return z;
3988
+ }
3961
3989
  function strip_ns(x) { return x.replace(nsregex2, "<$1"); }
3962
3990
 
3963
3991
  var encodings = {
@@ -4464,7 +4492,8 @@ function recordhopper(data, cb, opts) {
4464
4492
 
4465
4493
  /* control buffer usage for fixed-length buffers */
4466
4494
  function buf_array() {
4467
- var bufs = [], blksz = has_buf ? 256 : 2048;
4495
+ var bufs = [], blksz = has_buf ? 16384 : 2048;
4496
+ var has_buf_copy = has_buf && (typeof new_buf(blksz).copy == "function");
4468
4497
  var newblk = function ba_newblk(sz) {
4469
4498
  var o = (new_buf(sz));
4470
4499
  prep_blob(o, 0);
@@ -4493,10 +4522,15 @@ function buf_array() {
4493
4522
  endbuf();
4494
4523
  return bconcat(bufs);
4495
4524
  };
4525
+ var end2 = function() {
4526
+ endbuf(); return bufs;
4527
+ };
4496
4528
 
4497
- var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };
4529
+ var push = function ba_push(buf) {
4530
+ endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz);
4531
+ };
4498
4532
 
4499
- return ({ next:next, push:push, end:end, _bufs:bufs });
4533
+ return ({ next:next, push:push, end:end, _bufs:bufs, end2:end2 });
4500
4534
  }
4501
4535
 
4502
4536
  function write_record(ba, type, payload, length) {
@@ -4683,7 +4717,7 @@ function sheet_add_aoa(_ws, data, opts) {
4683
4717
  var o = opts || {};
4684
4718
  var dense = _ws ? (_ws["!data"] != null) : o.dense;
4685
4719
  if(DENSE != null && dense == null) dense = DENSE;
4686
- var ws = _ws || ({});
4720
+ var ws = _ws || (dense ? ({"!data": []}) : ({}));
4687
4721
  if(dense && !ws["!data"]) ws["!data"] = [];
4688
4722
  var _R = 0, _C = 0;
4689
4723
  if(ws && o.origin != null) {
@@ -4708,31 +4742,35 @@ function sheet_add_aoa(_ws, data, opts) {
4708
4742
  for(var R = 0; R != data.length; ++R) {
4709
4743
  if(!data[R]) continue;
4710
4744
  if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays");
4711
- var __R = _R + R, __Rstr = "" + (__R + 1);
4712
- //console.log("!!", R, _R, __R);
4745
+ var __R = _R + R;
4713
4746
  if(dense) {
4714
4747
  if(!ws["!data"][__R]) ws["!data"][__R] = [];
4715
4748
  row = ws["!data"][__R];
4716
4749
  }
4717
- for(var C = 0; C != data[R].length; ++C) {
4718
- if(typeof data[R][C] === 'undefined') continue;
4719
- var cell = ({v: data[R][C] });
4750
+ var data_R = data[R];
4751
+ for(var C = 0; C != data_R.length; ++C) {
4752
+ if(typeof data_R[C] === 'undefined') continue;
4753
+ var cell = ({v: data_R[C], t:"" });
4720
4754
  var __C = _C + C;
4721
4755
  if(range.s.r > __R) range.s.r = __R;
4722
4756
  if(range.s.c > __C) range.s.c = __C;
4723
4757
  if(range.e.r < __R) range.e.r = __R;
4724
4758
  if(range.e.c < __C) range.e.c = __C;
4725
4759
  seen = true;
4726
- if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
4760
+ if(data_R[C] && typeof data_R[C] === 'object' && !Array.isArray(data_R[C]) && !(data_R[C] instanceof Date)) cell = data_R[C];
4727
4761
  else {
4728
- if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
4762
+ if(Array.isArray(cell.v)) { cell.f = data_R[C][1]; cell.v = cell.v[0]; }
4729
4763
  if(cell.v === null) {
4730
4764
  if(cell.f) cell.t = 'n';
4731
4765
  else if(o.nullError) { cell.t = 'e'; cell.v = 0; }
4732
4766
  else if(!o.sheetStubs) continue;
4733
4767
  else cell.t = 'z';
4734
4768
  }
4735
- else if(typeof cell.v === 'number') cell.t = 'n';
4769
+ else if(typeof cell.v === 'number') {
4770
+ if(isFinite(cell.v)) cell.t = 'n';
4771
+ else if(isNaN(cell.v)) { cell.t = 'e'; cell.v = 0x0F; /* #VALUE! */ }
4772
+ else { cell.t = 'e'; cell.v = 0x07; }
4773
+ }
4736
4774
  else if(typeof cell.v === 'boolean') cell.t = 'b';
4737
4775
  else if(cell.v instanceof Date) {
4738
4776
  cell.z = o.dateNF || table_fmt[14];
@@ -4746,7 +4784,7 @@ function sheet_add_aoa(_ws, data, opts) {
4746
4784
  if(row[__C] && row[__C].z) cell.z = row[__C].z;
4747
4785
  row[__C] = cell;
4748
4786
  } else {
4749
- var cell_ref = encode_col(__C) + __Rstr;
4787
+ var cell_ref = encode_col(__C) + (__R + 1);
4750
4788
  if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;
4751
4789
  ws[cell_ref] = cell;
4752
4790
  }
@@ -4756,7 +4794,6 @@ function sheet_add_aoa(_ws, data, opts) {
4756
4794
  return ws;
4757
4795
  }
4758
4796
  function aoa_to_sheet(data, opts) { return sheet_add_aoa(null, data, opts); }
4759
-
4760
4797
  function parse_Int32LE(data) {
4761
4798
  return data.read_shift(4, 'i');
4762
4799
  }
@@ -6338,8 +6375,8 @@ function parse_TypedPropertyValue(blob, type, _opts) {
6338
6375
  case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;
6339
6376
  case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;
6340
6377
  case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;
6341
- case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');
6342
- case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);
6378
+ case 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/(^|[^\u0000])\u0000+$/,"$1"); break;
6379
+ case 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/(^|[^\u0000])\u0000+$/,"$1"); break;
6343
6380
  case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);
6344
6381
  case 0x41 /*VT_BLOB*/: return parse_BLOB(blob);
6345
6382
  case 0x47 /*VT_CF*/: return parse_ClipboardData(blob);
@@ -8631,7 +8668,7 @@ var SYLK = (function() {
8631
8668
  var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
8632
8669
  switch(cell.t) {
8633
8670
  case 'n':
8634
- o += (cell.v||0);
8671
+ o += isFinite(cell.v) ? (cell.v||0) : BErr[isNaN(cell.v) ? 0x24 : 0x07];
8635
8672
  if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break;
8636
8673
  case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
8637
8674
  case 'e': o += cell.w || BErr[cell.v] || cell.v; break;
@@ -8860,7 +8897,7 @@ var ETH = (function() {
8860
8897
  case 'vtc':
8861
8898
  switch(record[3]) {
8862
8899
  case 'nl': arr[R][C] = +record[4] ? true : false; break;
8863
- default: arr[R][C] = +record[4]; break;
8900
+ default: arr[R][C] = record[record.length-1].charAt(0) == "#" ? ({t: "e", v: RBErr[record[record.length-1]] }) : +record[4]; break;
8864
8901
  }
8865
8902
  if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
8866
8903
  }
@@ -8903,11 +8940,7 @@ var ETH = (function() {
8903
8940
  if(!cell || cell.v == null || cell.t === 'z') continue;
8904
8941
  oo = ["cell", coord, 't'];
8905
8942
  switch(cell.t) {
8906
- case 's': case 'str': oo.push(encode(cell.v)); break;
8907
- case 'n':
8908
- if(!cell.f) { oo[2]='v'; oo[3]=cell.v; }
8909
- else { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }
8910
- break;
8943
+ case 's': oo.push(encode(cell.v)); break;
8911
8944
  case 'b':
8912
8945
  oo[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?"1":"0";
8913
8946
  oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));
@@ -8917,6 +8950,19 @@ var ETH = (function() {
8917
8950
  oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
8918
8951
  oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);
8919
8952
  break;
8953
+ case 'n':
8954
+ if(isFinite(cell.v)) {
8955
+ if(!cell.f) { oo[2]='v'; oo[3]=cell.v; }
8956
+ else { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }
8957
+ } else {
8958
+ oo[2] = 'vt' + (cell.f ? 'f' : 'c');
8959
+ oo[3] = "e" + BErr[isNaN(cell.v) ? 0x24 : 0x07];
8960
+ oo[4] = "0";
8961
+ oo[5] = cell.f || oo[3].slice(1);
8962
+ oo[6] = "e";
8963
+ oo[7] = oo[3].slice(1);
8964
+ }
8965
+ break;
8920
8966
  case 'e': continue;
8921
8967
  }
8922
8968
  o.push(oo.join(":"));
@@ -8948,6 +8994,7 @@ var PRN = (function() {
8948
8994
  else if(data === 'FALSE') arr[R][C] = false;
8949
8995
  else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
8950
8996
  else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
8997
+ else if(data.charCodeAt(0) == 35 /* # */ && RBErr[data] != null) arr[R][C] = ({ t: 'e', v: RBErr[data], w: data });
8951
8998
  else arr[R][C] = data;
8952
8999
  }
8953
9000
 
@@ -9065,6 +9112,8 @@ var PRN = (function() {
9065
9112
  if(o.cellDates) { cell.t = 'd'; cell.v = v; }
9066
9113
  else { cell.t = 'n'; cell.v = datenum(v); }
9067
9114
  if(!o.cellNF) delete cell.z;
9115
+ } else if(s.charCodeAt(0) == 35 /* # */ && RBErr[s] != null) {
9116
+ cell.t = 'e'; cell.w = s; cell.v = RBErr[s];
9068
9117
  } else {
9069
9118
  cell.t = 's';
9070
9119
  cell.v = s;
@@ -9764,7 +9813,6 @@ var WK_ = (function() {
9764
9813
  else console.error("WK1 bad formula parse |" + out.join("|") + "|");
9765
9814
  }
9766
9815
 
9767
-
9768
9816
  function parse_cell_3(blob) {
9769
9817
  var o = [{c:0,r:0}, {t:'n',v:0}, 0];
9770
9818
  o[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];
@@ -10999,6 +11047,10 @@ function rtf_to_sheet_str(str, opts) {
10999
11047
  if (o.cellText !== false)
11000
11048
  cell.w = cell.v;
11001
11049
  cell.v = fuzzynum(cell.v);
11050
+ } else if (RBErr[cell.v] != null) {
11051
+ cell.t = "e";
11052
+ cell.w = cell.v;
11053
+ cell.v = RBErr[cell.v];
11002
11054
  }
11003
11055
  if (dense)
11004
11056
  row[C] = cell;
@@ -11334,10 +11386,12 @@ function parse_fonts(t, styles, themes, opts) {
11334
11386
  /* 18.8.2 b CT_BooleanProperty */
11335
11387
  case '<b': font.bold = y.val ? parsexmlbool(y.val) : 1; break;
11336
11388
  case '<b/>': font.bold = 1; break;
11389
+ case '</b>': case '</b': break;
11337
11390
 
11338
11391
  /* 18.8.26 i CT_BooleanProperty */
11339
11392
  case '<i': font.italic = y.val ? parsexmlbool(y.val) : 1; break;
11340
11393
  case '<i/>': font.italic = 1; break;
11394
+ case '</i>': case '</i': break;
11341
11395
 
11342
11396
  /* 18.4.13 u CT_UnderlineProperty */
11343
11397
  case '<u':
@@ -11349,48 +11403,55 @@ function parse_fonts(t, styles, themes, opts) {
11349
11403
  case "doubleAccounting": font.underline = 0x22; break;
11350
11404
  } break;
11351
11405
  case '<u/>': font.underline = 1; break;
11406
+ case '</u>': case '</u': break;
11352
11407
 
11353
11408
  /* 18.4.10 strike CT_BooleanProperty */
11354
11409
  case '<strike': font.strike = y.val ? parsexmlbool(y.val) : 1; break;
11355
11410
  case '<strike/>': font.strike = 1; break;
11411
+ case '</strike>': case '</strike': break;
11356
11412
 
11357
11413
  /* 18.4.2 outline CT_BooleanProperty */
11358
11414
  case '<outline': font.outline = y.val ? parsexmlbool(y.val) : 1; break;
11359
11415
  case '<outline/>': font.outline = 1; break;
11416
+ case '</outline>': case '</outline': break;
11360
11417
 
11361
11418
  /* 18.8.36 shadow CT_BooleanProperty */
11362
11419
  case '<shadow': font.shadow = y.val ? parsexmlbool(y.val) : 1; break;
11363
11420
  case '<shadow/>': font.shadow = 1; break;
11421
+ case '</shadow>': case '</shadow': break;
11364
11422
 
11365
11423
  /* 18.8.12 condense CT_BooleanProperty */
11366
11424
  case '<condense': font.condense = y.val ? parsexmlbool(y.val) : 1; break;
11367
11425
  case '<condense/>': font.condense = 1; break;
11426
+ case '</condense>': case '</condense': break;
11368
11427
 
11369
11428
  /* 18.8.17 extend CT_BooleanProperty */
11370
11429
  case '<extend': font.extend = y.val ? parsexmlbool(y.val) : 1; break;
11371
11430
  case '<extend/>': font.extend = 1; break;
11431
+ case '</extend>': case '</extend': break;
11372
11432
 
11373
11433
  /* 18.4.11 sz CT_FontSize */
11374
11434
  case '<sz': if(y.val) font.sz = +y.val; break;
11375
- case '<sz/>': case '</sz>': break;
11435
+ case '<sz/>': case '</sz>': case '</sz': break;
11376
11436
 
11377
11437
  /* 18.4.14 vertAlign CT_VerticalAlignFontProperty */
11378
11438
  case '<vertAlign': if(y.val) font.vertAlign = y.val; break;
11379
- case '<vertAlign/>': case '</vertAlign>': break;
11439
+ case '<vertAlign/>': case '</vertAlign>': case '</vertAlign': break;
11380
11440
 
11381
11441
  /* 18.8.18 family CT_FontFamily */
11382
11442
  case '<family': if(y.val) font.family = parseInt(y.val,10); break;
11383
- case '<family/>': case '</family>': break;
11443
+ case '<family/>': case '</family>': case '</family': break;
11384
11444
 
11385
11445
  /* 18.8.35 scheme CT_FontScheme */
11386
11446
  case '<scheme': if(y.val) font.scheme = y.val; break;
11387
- case '<scheme/>': case '</scheme>': break;
11447
+ case '<scheme/>': case '</scheme>': case '</scheme': break;
11388
11448
 
11389
11449
  /* 18.4.1 charset CT_IntProperty */
11390
11450
  case '<charset':
11391
11451
  if(y.val == '1') break;
11392
11452
  y.codepage = CS2CP[parseInt(y.val, 10)];
11393
11453
  break;
11454
+ case '<charset/>': case '</charset>': case '</charset': break;
11394
11455
 
11395
11456
  /* 18.?.? color CT_Color */
11396
11457
  case '<color':
@@ -11413,11 +11474,11 @@ function parse_fonts(t, styles, themes, opts) {
11413
11474
  }
11414
11475
 
11415
11476
  break;
11416
- case '<color/>': case '</color>': break;
11477
+ case '<color/>': case '</color>': case '</color': break;
11417
11478
 
11418
11479
  /* note: sometimes mc:AlternateContent appears bare */
11419
11480
  case '<AlternateContent': pass = true; break;
11420
- case '</AlternateContent>': pass = false; break;
11481
+ case '</AlternateContent>': case '</AlternateContent': pass = false; break;
11421
11482
 
11422
11483
  /* 18.2.10 extLst CT_ExtensionList ? */
11423
11484
  case '<extLst': case '<extLst>': case '</extLst>': break;
@@ -15920,7 +15981,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
15920
15981
  var merges = [];
15921
15982
  var _merge = data2.match(mergecregex);
15922
15983
  if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)
15923
- merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1));
15984
+ merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("=")+2));
15924
15985
 
15925
15986
  /* 18.3.1.48 hyperlinks CT_Hyperlinks */
15926
15987
  var hlink = data2.match(hlinkregex);
@@ -16379,16 +16440,17 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles, wb) {
16379
16440
 
16380
16441
  function write_ws_xml_data(ws, opts, idx, wb) {
16381
16442
  var o = [], r = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols = [], R=0, C=0, rows = ws['!rows'];
16382
- var dense = ws["!data"] != null;
16443
+ var dense = ws["!data"] != null, data = dense ? ws["!data"] : [];
16383
16444
  var params = ({r:rr}), row, height = -1;
16384
16445
  var date1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904;
16385
16446
  for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);
16386
16447
  for(R = range.s.r; R <= range.e.r; ++R) {
16387
16448
  r = [];
16388
16449
  rr = encode_row(R);
16450
+ var data_R = dense ? data[R] : [];
16389
16451
  for(C = range.s.c; C <= range.e.c; ++C) {
16390
16452
  ref = cols[C] + rr;
16391
- var _cell = dense ? (ws["!data"][R]||[])[C]: ws[ref];
16453
+ var _cell = dense ? data_R[C] : ws[ref];
16392
16454
  if(_cell === undefined) continue;
16393
16455
  if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb, date1904)) != null) r.push(cell);
16394
16456
  }
@@ -17389,12 +17451,15 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen, date1904) {
17389
17451
  if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
17390
17452
  if(last_seen) write_record(ba, 0x000D /* BrtShortRk */, write_BrtShortRk(cell, o));
17391
17453
  else write_record(ba, 0x0002 /* BrtCellRk */, write_BrtCellRk(cell, o));
17392
- } else if(isNaN(cell.v)) {
17393
- if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x24}, o)); // #NUM!
17394
- else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x24}, o)); // #NUM!
17395
17454
  } else if(!isFinite(cell.v)) {
17396
- if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x07}, o)); // #DIV/0!
17397
- else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x07}, o)); // #DIV/0!
17455
+ o.t = "e";
17456
+ if(isNaN(cell.v)) {
17457
+ if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x24}, o)); // #NUM!
17458
+ else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x24}, o)); // #NUM!
17459
+ } else {
17460
+ if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError({t:"e", v: 0x07}, o)); // #DIV/0!
17461
+ else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError({t:"e", v: 0x07}, o)); // #DIV/0!
17462
+ }
17398
17463
  } else {
17399
17464
  if(last_seen) write_record(ba, 0x0010 /* BrtShortReal */, write_BrtShortReal(cell, o));
17400
17465
  else write_record(ba, 0x0005 /* BrtCellReal */, write_BrtCellReal(cell, o));
@@ -17416,23 +17481,24 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen, date1904) {
17416
17481
  }
17417
17482
 
17418
17483
  function write_CELLTABLE(ba, ws, idx, opts, wb) {
17419
- var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
17484
+ var range = safe_decode_range(ws['!ref'] || "A1"), rr = "", cols = [];
17420
17485
  var date1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904;
17421
17486
  write_record(ba, 0x0091 /* BrtBeginSheetData */);
17422
- var dense = ws["!data"] != null;
17487
+ var dense = ws["!data"] != null, row = dense ? ws["!data"][range.s.r] : [];
17423
17488
  var cap = range.e.r;
17424
17489
  if(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);
17425
17490
  for(var R = range.s.r; R <= cap; ++R) {
17426
17491
  rr = encode_row(R);
17492
+ if(dense) row = ws["!data"][R];
17427
17493
  /* [ACCELLTABLE] */
17428
17494
  /* BrtRowHdr */
17429
17495
  write_row_header(ba, ws, range, R);
17496
+ if(dense && !row) continue;
17430
17497
  var last_seen = false;
17431
17498
  if(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
17432
17499
  /* *16384CELL */
17433
17500
  if(R === range.s.r) cols[C] = encode_col(C);
17434
- ref = cols[C] + rr;
17435
- var cell = dense ? (ws["!data"][R]||[])[C] : ws[ref];
17501
+ var cell = dense ? row[C] : ws[cols[C] + rr];
17436
17502
  if(!cell) { last_seen = false; continue; }
17437
17503
  /* write cell */
17438
17504
  last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen, date1904);
@@ -19695,7 +19761,13 @@ function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){
19695
19761
  var t = "", p = "";
19696
19762
  switch(cell.t) {
19697
19763
  case 'z': if(!opts.sheetStubs) return ""; break;
19698
- case 'n': t = 'Number'; p = String(cell.v); break;
19764
+ case 'n': {
19765
+ if(!isFinite(cell.v)) {
19766
+ t = 'Error'; p = BErr[isNaN(cell.v) ? 0x24 : 0x07];
19767
+ } else {
19768
+ t = 'Number'; p = String(cell.v);
19769
+ }
19770
+ } break;
19699
19771
  case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break;
19700
19772
  case 'e': t = 'Error'; p = BErr[cell.v]; break;
19701
19773
  case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || table_fmt[14]; break;
@@ -19737,9 +19809,12 @@ function write_ws_xlml_table(ws, opts, idx, wb) {
19737
19809
  o.push(writextag("Column",null,k));
19738
19810
  });
19739
19811
  var dense = ws["!data"] != null;
19812
+ var addr = {r:0,c:0};
19740
19813
  for(var R = range.s.r; R <= range.e.r; ++R) {
19741
19814
  var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];
19815
+ addr.r = R;
19742
19816
  for(var C = range.s.c; C <= range.e.c; ++C) {
19817
+ addr.c = C;
19743
19818
  var skip = false;
19744
19819
  for(mi = 0; mi != marr.length; ++mi) {
19745
19820
  if(marr[mi].s.c > C) continue;
@@ -19750,7 +19825,6 @@ function write_ws_xlml_table(ws, opts, idx, wb) {
19750
19825
  break;
19751
19826
  }
19752
19827
  if(skip) continue;
19753
- var addr = {r:R,c:C};
19754
19828
  var ref = encode_col(C) + encode_row(R), cell = dense ? (ws["!data"][R]||[])[C] : ws[ref];
19755
19829
  row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));
19756
19830
  }
@@ -19774,7 +19848,7 @@ function write_ws_xlml(idx, opts, wb) {
19774
19848
  /* WorksheetOptions */
19775
19849
  o.push(write_ws_xlml_wsopts(ws, opts, idx, wb));
19776
19850
 
19777
- if(ws["!autofilter"]) o.push('<AutoFilter x:Range="' + a1_to_rc(fix_range(ws["!autofilter"].ref), {r:0,c:0}) + '" xmlns="urn:schemas-microsoft-com:office:excel"></AutoFilter>');
19851
+ if(ws && ws["!autofilter"]) o.push('<AutoFilter x:Range="' + a1_to_rc(fix_range(ws["!autofilter"].ref), {r:0,c:0}) + '" xmlns="urn:schemas-microsoft-com:office:excel"></AutoFilter>');
19778
19852
 
19779
19853
  return o.join("");
19780
19854
  }
@@ -19793,11 +19867,10 @@ function write_xlml(wb, opts) {
19793
19867
  d.push(write_props_xlml(wb, opts));
19794
19868
  d.push(write_wb_xlml(wb, opts));
19795
19869
  d.push("");
19796
- d.push("");
19870
+ d.push(write_names_xlml(wb, opts));
19797
19871
  for(var i = 0; i < wb.SheetNames.length; ++i)
19798
19872
  d.push(writextag("Worksheet", write_ws_xlml(i, opts, wb), {"ss:Name":escapexml(wb.SheetNames[i])}));
19799
19873
  d[2] = write_sty_xlml(wb, opts);
19800
- d[3] = write_names_xlml(wb, opts);
19801
19874
  return XML_HEADER + writextag("Workbook", d.join(""), {
19802
19875
  'xmlns': XLMLNS.ss,
19803
19876
  'xmlns:o': XLMLNS.o,
@@ -21978,7 +22051,7 @@ function write_ws_biff2(ba, ws, idx, opts, wb) {
21978
22051
  if(range.e.c > 0xFF || range.e.r > 0x3FFF) {
21979
22052
  if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
21980
22053
  range.e.c = Math.min(range.e.c, 0xFF);
21981
- range.e.r = Math.min(range.e.c, 0x3FFF);
22054
+ range.e.r = Math.min(range.e.r, 0x3FFF);
21982
22055
  }
21983
22056
  var date1904 = (((wb||{}).Workbook||{}).WBProps||{}).date1904;
21984
22057
  var row = [], comments = [];
@@ -22387,9 +22460,9 @@ function write_ws_biff8(idx, opts, wb) {
22387
22460
  var range = safe_decode_range(ws['!ref'] || "A1");
22388
22461
  var MAX_ROWS = b8 ? 65536 : 16384;
22389
22462
  if(range.e.c > 0xFF || range.e.r >= MAX_ROWS) {
22390
- if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
22463
+ if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV" + MAX_ROWS);
22391
22464
  range.e.c = Math.min(range.e.c, 0xFF);
22392
- range.e.r = Math.min(range.e.c, MAX_ROWS-1);
22465
+ range.e.r = Math.min(range.e.r, MAX_ROWS-1);
22393
22466
  }
22394
22467
 
22395
22468
  write_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));
@@ -22424,12 +22497,11 @@ function write_ws_biff8(idx, opts, wb) {
22424
22497
  if(dense) row = ws["!data"][R] || [];
22425
22498
  rr = encode_row(R);
22426
22499
  for(C = range.s.c; C <= range.e.c; ++C) {
22427
- ref = cols[C] + rr;
22428
- var cell = dense ? row[C] : ws[ref];
22500
+ var cell = dense ? row[C] : ws[cols[C] + rr];
22429
22501
  if(!cell) continue;
22430
22502
  /* write cell */
22431
22503
  write_ws_biff8_cell(ba, cell, R, C, opts, date1904);
22432
- if(b8 && cell.l) ws['!links'].push([ref, cell.l]);
22504
+ if(b8 && cell.l) ws['!links'].push([cols[C] + rr, cell.l]);
22433
22505
  if(cell.c) comments.push([cell.c, R, C]);
22434
22506
  }
22435
22507
  }
@@ -22573,6 +22645,9 @@ function write_biff_buf(wb, opts) {
22573
22645
  if(range.e.c > 255) { // note: 255 is IV
22574
22646
  if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
22575
22647
  }
22648
+ if(range.e.r > 65535) {
22649
+ if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond row 65536. Data may be lost.");
22650
+ }
22576
22651
  }
22577
22652
 
22578
22653
  var o = opts || {};
@@ -22632,6 +22707,8 @@ function html_to_sheet(str, _opts) {
22632
22707
  if(opts.UTC === false) o.v = utc_to_local(o.v);
22633
22708
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
22634
22709
  o.z = opts.dateNF || table_fmt[14];
22710
+ } else if(m.charCodeAt(0) == 35 /* # */ && RBErr[m] != null) {
22711
+ o.t = 'e'; o.w = m; o.v = RBErr[m];
22635
22712
  }
22636
22713
  if(o.cellText !== false) o.w = m;
22637
22714
  if(dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = o; }
@@ -22659,6 +22736,10 @@ function make_html_row(ws, r, R, o) {
22659
22736
  if(RS < 0) continue;
22660
22737
  var coord = encode_col(C) + encode_row(R);
22661
22738
  var cell = dense ? (ws["!data"][R]||[])[C] : ws[coord];
22739
+ if(cell && cell.t == 'n' && cell.v != null && !isFinite(cell.v)) {
22740
+ if(isNaN(cell.v)) cell = ({t:'e', v:0x24, w:BErr[0x24]});
22741
+ else cell = ({t:'e', v:0x07, w:BErr[0x07]});
22742
+ }
22662
22743
  /* TODO: html entities */
22663
22744
  var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
22664
22745
  sp = ({});
@@ -22769,6 +22850,7 @@ function sheet_add_dom(ws, table, _opts) {
22769
22850
  if(v != null) {
22770
22851
  if(v.length == 0) o.t = _t || 'z';
22771
22852
  else if(opts.raw || v.trim().length == 0 || _t == "s"){}
22853
+ else if(_t == "e" && BErr[+v]) o = {t:'e', v:+v, w: BErr[+v]};
22772
22854
  else if(v === 'TRUE') o = {t:'b', v:true};
22773
22855
  else if(v === 'FALSE') o = {t:'b', v:false};
22774
22856
  else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
@@ -22777,7 +22859,7 @@ function sheet_add_dom(ws, table, _opts) {
22777
22859
  if(opts.UTC) o.v = local_to_utc(o.v);
22778
22860
  if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
22779
22861
  o.z = opts.dateNF || table_fmt[14];
22780
- }
22862
+ } else if(v.charCodeAt(0) == 35 /* # */ && RBErr[v] != null) o = ({t:'e', v: RBErr[v], w: v});
22781
22863
  }
22782
22864
  if(o.z === undefined && z != null) o.z = z;
22783
22865
  /* The first link is used. Links are assumed to be fully specified.
@@ -23078,7 +23160,7 @@ function parse_content_xml(d, _opts, _nfm) {
23078
23160
  var Sheets = {}, SheetNames = [];
23079
23161
  var ws = ({}); if(opts.dense) ws["!data"] = [];
23080
23162
  var Rn, q;
23081
- var ctag = ({value:""});
23163
+ var ctag = ({value:""}), ctag2 = ({});
23082
23164
  var textp = "", textpidx = 0, textptag, oldtextp = "", oldtextpidx = 0;
23083
23165
  var textR = [], oldtextR = [];
23084
23166
  var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
@@ -23137,10 +23219,18 @@ function parse_content_xml(d, _opts, _nfm) {
23137
23219
  if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
23138
23220
  C = -1; break;
23139
23221
  case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
23140
- if(Rn[1] !== '/') ++C;
23141
- if(opts.sheetStubs) {
23142
- if(opts.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = {t:'z'}; }
23143
- else ws[encode_cell({r:R,c:C})] = {t:'z'};
23222
+ if(Rn[1] !== '/') {
23223
+ ++C;
23224
+ ctag = parsexmltag(Rn[0], false);
23225
+ colpeat = parseInt(ctag['number-columns-repeated']||"1",10) || 1;
23226
+ if(opts.sheetStubs) {
23227
+ while(colpeat-- > 0) {
23228
+ if(opts.dense) { if(!ws["!data"][R]) ws["!data"][R] = []; ws["!data"][R][C] = {t:'z'}; }
23229
+ else ws[encode_cell({r:R,c:C})] = {t:'z'};
23230
+ ++C;
23231
+ } --C;
23232
+ }
23233
+ else C += colpeat - 1;
23144
23234
  }
23145
23235
  textp = ""; textR = [];
23146
23236
  break; /* stub */
@@ -23148,7 +23238,7 @@ function parse_content_xml(d, _opts, _nfm) {
23148
23238
  if(Rn[0].charAt(Rn[0].length-2) === '/') {
23149
23239
  ++C;
23150
23240
  ctag = parsexmltag(Rn[0], false);
23151
- colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
23241
+ colpeat = parseInt(ctag['number-columns-repeated']||"1", 10)||1;
23152
23242
  q = ({t:'z', v:null});
23153
23243
  if(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));
23154
23244
  if(ctag["style-name"] && styles[ctag["style-name"]]) q.z = styles[ctag["style-name"]];
@@ -23172,6 +23262,7 @@ function parse_content_xml(d, _opts, _nfm) {
23172
23262
  if(R < range.s.r) range.s.r = R;
23173
23263
  if(rptR > range.e.r) range.e.r = rptR;
23174
23264
  ctag = parsexmltag(Rn[0], false);
23265
+ ctag2 = parsexmltagraw(Rn[0], true);
23175
23266
  comments = []; comment = ({});
23176
23267
  q = ({t:ctag['数据类型'] || ctag['value-type'], v:null});
23177
23268
  if(ctag["style-name"] && styles[ctag["style-name"]]) q.z = styles[ctag["style-name"]];
@@ -23191,10 +23282,12 @@ function parse_content_xml(d, _opts, _nfm) {
23191
23282
  q.F = arrayf[i][1];
23192
23283
  }
23193
23284
  if(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {
23194
- mR = parseInt(ctag['number-rows-spanned'],10) || 0;
23195
- mC = parseInt(ctag['number-columns-spanned'],10) || 0;
23196
- mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
23197
- merges.push(mrange);
23285
+ mR = parseInt(ctag['number-rows-spanned']||"1",10) || 1;
23286
+ mC = parseInt(ctag['number-columns-spanned']||"1",10) || 1;
23287
+ if(mR * mC > 1) {
23288
+ mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
23289
+ merges.push(mrange);
23290
+ }
23198
23291
  }
23199
23292
 
23200
23293
  /* 19.675.2 table:number-columns-repeated */
@@ -23225,6 +23318,9 @@ function parse_content_xml(d, _opts, _nfm) {
23225
23318
  }
23226
23319
  } else {
23227
23320
  isstub = false;
23321
+ if(ctag2['calcext:value-type'] == "error" && RBErr[textp] != null) {
23322
+ q.t = 'e'; q.w = textp; q.v = RBErr[textp];
23323
+ }
23228
23324
  if(q.t === 's') {
23229
23325
  q.v = textp || '';
23230
23326
  if(textR.length) q.R = textR;
@@ -23623,7 +23719,6 @@ function parse_fods(data, opts) {
23623
23719
  wb.bookType = "fods";
23624
23720
  return wb;
23625
23721
  }
23626
-
23627
23722
  /* OpenDocument */
23628
23723
  var write_styles_ods = /* @__PURE__ */(function() {
23629
23724
  var master_styles = [
@@ -23888,9 +23983,22 @@ var write_content_ods = /* @__PURE__ */(function() {
23888
23983
  ct['office:boolean-value'] = (cell.v ? 'true' : 'false');
23889
23984
  break;
23890
23985
  case 'n':
23891
- textp = (cell.w||String(cell.v||0));
23892
- ct['office:value-type'] = "float";
23893
- ct['office:value'] = (cell.v||0);
23986
+ if(!isFinite(cell.v)) {
23987
+ if(isNaN(cell.v)) {
23988
+ textp = "#NUM!";
23989
+ ct['table:formula'] = "of:=#NUM!";
23990
+ } else {
23991
+ textp = "#DIV/0!";
23992
+ ct['table:formula'] = "of:=" + (cell.v < 0 ? "-" : "") + "1/0";
23993
+ }
23994
+ ct['office:string-value'] = "";
23995
+ ct['office:value-type'] = "string";
23996
+ ct['calcext:value-type'] = "error";
23997
+ } else {
23998
+ textp = (cell.w||String(cell.v||0));
23999
+ ct['office:value-type'] = "float";
24000
+ ct['office:value'] = (cell.v||0);
24001
+ }
23894
24002
  break;
23895
24003
  case 's': case 'str':
23896
24004
  textp = cell.v == null ? "" : cell.v;
@@ -25242,7 +25350,7 @@ function s5s_to_iwa_comment(s5s) {
25242
25350
  return out;
25243
25351
  }
25244
25352
  function parse_TST_TableModelArchive(M, root, ws, opts) {
25245
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
25353
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
25246
25354
  var pb = parse_shallow(root.data);
25247
25355
  var range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
25248
25356
  range.e.r = (varint_to_i32(pb[6][0].data) >>> 0) - 1;
@@ -25321,6 +25429,38 @@ function parse_TST_TableModelArchive(M, root, ws, opts) {
25321
25429
  };
25322
25430
  });
25323
25431
  }
25432
+ if (!((_k = ws["!merges"]) == null ? void 0 : _k.length) && ((_l = pb[47]) == null ? void 0 : _l[0])) {
25433
+ var merge_owner = parse_shallow(pb[47][0].data);
25434
+ if ((_m = merge_owner[2]) == null ? void 0 : _m[0]) {
25435
+ var formula_store = parse_shallow(merge_owner[2][0].data);
25436
+ if ((_n = formula_store[3]) == null ? void 0 : _n[0]) {
25437
+ ws["!merges"] = mappa(formula_store[3], function(u) {
25438
+ var _a2, _b2, _c2, _d2, _e2;
25439
+ var formula_pair = parse_shallow(u);
25440
+ var formula = parse_shallow(formula_pair[2][0].data);
25441
+ var AST_node_array = parse_shallow(formula[1][0].data);
25442
+ if (!((_a2 = AST_node_array[1]) == null ? void 0 : _a2[0]))
25443
+ return;
25444
+ var AST_node0 = parse_shallow(AST_node_array[1][0].data);
25445
+ var AST_node_type = varint_to_i32(AST_node0[1][0].data);
25446
+ if (AST_node_type != 67)
25447
+ return;
25448
+ var AST_colon_tract = parse_shallow(AST_node0[40][0].data);
25449
+ if (!((_b2 = AST_colon_tract[3]) == null ? void 0 : _b2[0]) || !((_c2 = AST_colon_tract[4]) == null ? void 0 : _c2[0]))
25450
+ return;
25451
+ var colrange = parse_shallow(AST_colon_tract[3][0].data);
25452
+ var rowrange = parse_shallow(AST_colon_tract[4][0].data);
25453
+ var c = varint_to_i32(colrange[1][0].data);
25454
+ var C = ((_d2 = colrange[2]) == null ? void 0 : _d2[0]) ? varint_to_i32(colrange[2][0].data) : c;
25455
+ var r = varint_to_i32(rowrange[1][0].data);
25456
+ var R = ((_e2 = rowrange[2]) == null ? void 0 : _e2[0]) ? varint_to_i32(rowrange[2][0].data) : r;
25457
+ return { s: { r: r, c: c }, e: { r: R, c: C } };
25458
+ }).filter(function(x) {
25459
+ return x != null;
25460
+ });
25461
+ }
25462
+ }
25463
+ }
25324
25464
  }
25325
25465
  function parse_TST_TableInfoArchive(M, root, opts) {
25326
25466
  var pb = parse_shallow(root.data);
@@ -27127,6 +27267,8 @@ function readSync(data, opts) {
27127
27267
  var o = opts||{};
27128
27268
  if(o.codepage && typeof $cptable === "undefined") console.error("Codepage tables are not loaded. Non-ASCII characters may not give expected results");
27129
27269
  if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o));
27270
+ /* Javet projects `byte[]` to `Int8Array` */
27271
+ if(typeof Int8Array !== 'undefined' && data instanceof Int8Array) return readSync(new Uint8Array(data.buffer, data.byteOffset, data.length), o);
27130
27272
  if(typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && !o.type) o.type = typeof Deno !== "undefined" ? "buffer" : "array";
27131
27273
  var d = data, n = [0,0,0,0], str = false;
27132
27274
  if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
@@ -27482,7 +27624,7 @@ function sheet_to_json(sheet, opts) {
27482
27624
  }
27483
27625
 
27484
27626
  var qreg = /"/g;
27485
- function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
27627
+ function make_csv_row(sheet, r, R, cols, fs, rs, FS, w, o) {
27486
27628
  var isempty = true;
27487
27629
  var row = [], txt = "", rr = encode_row(R);
27488
27630
  var dense = sheet["!data"] != null;
@@ -27495,7 +27637,7 @@ function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
27495
27637
  isempty = false;
27496
27638
  txt = ''+(o.rawNumbers && val.t == "n" ? val.v : format_cell(val, null, o));
27497
27639
  for(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = "\"" + txt.replace(qreg, '""') + "\""; break; }
27498
- if(txt == "ID") txt = '"ID"';
27640
+ if(txt == "ID" && w == 0 && row.length == 0) txt = '"ID"';
27499
27641
  } else if(val.f != null && !val.F) {
27500
27642
  isempty = false;
27501
27643
  txt = '=' + val.f; if(txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"';
@@ -27522,7 +27664,7 @@ function sheet_to_csv(sheet, opts) {
27522
27664
  var w = 0;
27523
27665
  for(var R = r.s.r; R <= r.e.r; ++R) {
27524
27666
  if ((rowinfo[R]||{}).hidden) continue;
27525
- row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
27667
+ row = make_csv_row(sheet, r, R, cols, fs, rs, FS, w, o);
27526
27668
  if(row == null) { continue; }
27527
27669
  if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row);
27528
27670
  }
@@ -27537,7 +27679,7 @@ function sheet_to_txt(sheet, opts) {
27537
27679
  return String.fromCharCode(255) + String.fromCharCode(254) + o;
27538
27680
  }
27539
27681
 
27540
- function sheet_to_formulae(sheet) {
27682
+ function sheet_to_formulae(sheet, opts) {
27541
27683
  var y = "", x, val="";
27542
27684
  if(sheet == null || sheet["!ref"] == null) return [];
27543
27685
  var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C;
@@ -27558,6 +27700,7 @@ function sheet_to_formulae(sheet) {
27558
27700
  if(y.indexOf(":") == -1) y = y + ":" + y;
27559
27701
  }
27560
27702
  if(x.f != null) val = x.f;
27703
+ else if(opts && opts.values === false) continue;
27561
27704
  else if(x.t == 'z') continue;
27562
27705
  else if(x.t == 'n' && x.v != null) val = "" + x.v;
27563
27706
  else if(x.t == 'b') val = x.v ? "TRUE" : "FALSE";
@@ -27826,7 +27969,7 @@ function write_csv_stream(sheet, opts) {
27826
27969
  while(R <= r.e.r) {
27827
27970
  ++R;
27828
27971
  if ((rowinfo[R-1]||{}).hidden) continue;
27829
- row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
27972
+ row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, w, o);
27830
27973
  if(row != null) {
27831
27974
  if(row || (o.blankrows !== false)) return stream.push((w++ ? RS : "") + row);
27832
27975
  }
@@ -27923,10 +28066,165 @@ function write_json_stream(sheet, opts) {
27923
28066
  return stream;
27924
28067
  }
27925
28068
 
28069
+ function write_xlml_stream(wb, o) {
28070
+ var stream = _Readable();
28071
+ var opts = o == null ? {} : o;
28072
+ var stride = +opts.stride || 10;
28073
+ if(!wb.SSF) wb.SSF = dup(table_fmt);
28074
+ if(wb.SSF) {
28075
+ make_ssf(); SSF_load_table(wb.SSF);
28076
+ // $FlowIgnore
28077
+ opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
28078
+ opts.ssf = wb.SSF;
28079
+ opts.cellXfs = [];
28080
+ get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
28081
+ }
28082
+
28083
+ /* do one pass to determine styles since they must be added before tables */
28084
+ wb.SheetNames.forEach(function(n) {
28085
+ var ws = wb.Sheets[n];
28086
+ if(!ws || !ws["!ref"]) return;
28087
+ var range = decode_range(ws["!ref"]);
28088
+ var dense = ws["!data"] != null;
28089
+ var ddata = dense ? ws["!data"] : [];
28090
+ var addr = {r:0,c:0};
28091
+ for(var R = range.s.r; R <= range.e.r; ++R) {
28092
+ addr.r = R;
28093
+ if(dense && !ddata[R]) continue;
28094
+ for(var C = range.s.c; C <= range.e.c; ++C) {
28095
+ addr.c = C;
28096
+ var cell = dense ? ddata[R][C] : ws[encode_col(C) + encode_row(R)];
28097
+ if(!cell) continue;
28098
+ if(cell.t == "d" && cell.z == null) { cell = dup(cell); cell.z = table_fmt[14]; }
28099
+ void get_cell_style(opts.cellXfs, cell, opts);
28100
+ }
28101
+ }
28102
+ });
28103
+ var sty = write_sty_xlml(wb, opts);
28104
+
28105
+ var stage = 0, wsidx = 0, ws = wb.Sheets[wb.SheetNames[wsidx]], range = safe_decode_range(ws), R = -1, T = false;
28106
+
28107
+ var marr = [], mi = 0, dense = false, darr = [], addr = {r:0,c:0};
28108
+
28109
+ stream._read = function() { switch(stage) {
28110
+ /* header */
28111
+ case 0: {
28112
+ stage = 1;
28113
+ stream.push(XML_HEADER);
28114
+ stream.push("<Workbook" + wxt_helper({
28115
+ 'xmlns': XLMLNS.ss,
28116
+ 'xmlns:o': XLMLNS.o,
28117
+ 'xmlns:x': XLMLNS.x,
28118
+ 'xmlns:ss': XLMLNS.ss,
28119
+ 'xmlns:dt': XLMLNS.dt,
28120
+ 'xmlns:html': XLMLNS.html
28121
+ }) + ">");
28122
+ } break;
28123
+
28124
+ /* preamble */
28125
+ case 1: {
28126
+ stage = 2;
28127
+ stream.push(write_props_xlml(wb, opts));
28128
+ stream.push(write_wb_xlml(wb, opts));
28129
+ } break;
28130
+
28131
+ /* style and name tables */
28132
+ case 2: {
28133
+ stage = 3;
28134
+ stream.push(sty);
28135
+ stream.push(write_names_xlml(wb, opts));
28136
+ } break;
28137
+
28138
+ /* worksheet preamble */
28139
+ case 3: {
28140
+ T = false;
28141
+ if(wsidx >= wb.SheetNames.length) { stage = -1; stream.push(""); break; }
28142
+
28143
+ stream.push("<Worksheet" + wxt_helper({ "ss:Name": escapexml(wb.SheetNames[wsidx])}) + ">");
28144
+
28145
+ ws = wb.Sheets[wb.SheetNames[wsidx]];
28146
+ if(!ws) { stream.push("</Worksheet>"); return void ++wsidx; }
28147
+
28148
+ var names = write_ws_xlml_names(ws, opts, wsidx, wb);
28149
+ if(names.length) stream.push("<Names>" + names + "</Names>");
28150
+
28151
+ if(!ws["!ref"]) return (stage = 5);
28152
+ range = safe_decode_range(ws["!ref"]);
28153
+ R = range.s.r;
28154
+ stage = 4;
28155
+ } break;
28156
+
28157
+ /* worksheet intramble */
28158
+ case 4: {
28159
+ if(R < 0 || R > range.e.r) { if(T) stream.push("</Table>"); return void (stage = 5); }
28160
+
28161
+ if(R <= range.s.r) {
28162
+ if(ws['!cols']) ws['!cols'].forEach(function(n, i) {
28163
+ process_col(n);
28164
+ var w = !!n.width;
28165
+ var p = col_obj_w(i, n);
28166
+ var k = {"ss:Index":i+1};
28167
+ if(w) k['ss:Width'] = width2px(p.width);
28168
+ if(n.hidden) k['ss:Hidden']="1";
28169
+ if(!T) { T = true; stream.push("<Table>"); }
28170
+ stream.push(writextag("Column",null,k));
28171
+ });
28172
+ dense = ws["!data"] != null;
28173
+ if(dense) darr = ws["!data"];
28174
+ addr.r = addr.c = 0;
28175
+ }
28176
+
28177
+ /* undefined `stride` rows per invocation */
28178
+ for(var cnt = 0; R <= range.e.r && cnt < stride; ++R, ++cnt) {
28179
+ var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];
28180
+ addr.r = R;
28181
+ if(!(dense && !darr[R])) for(var C = range.s.c; C <= range.e.c; ++C) {
28182
+ addr.c = C;
28183
+ var skip = false;
28184
+ for(mi = 0; mi != marr.length; ++mi) {
28185
+ if(marr[mi].s.c > C) continue;
28186
+ if(marr[mi].s.r > R) continue;
28187
+ if(marr[mi].e.c < C) continue;
28188
+ if(marr[mi].e.r < R) continue;
28189
+ if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
28190
+ break;
28191
+ }
28192
+ if(skip) continue;
28193
+ var ref = encode_col(C) + encode_row(R), cell = dense ? darr[R][C] : ws[ref];
28194
+ row.push(write_ws_xlml_cell(cell, ref, ws, opts, wsidx, wb, addr));
28195
+ }
28196
+ row.push("</Row>");
28197
+ if(!T) { T = true; stream.push("<Table>"); }
28198
+ stream.push(row.join(""));
28199
+ }
28200
+ } break;
28201
+
28202
+ /* worksheet postamble */
28203
+ case 5: {
28204
+ stream.push(write_ws_xlml_wsopts(ws, opts, wsidx, wb));
28205
+ if(ws && ws["!autofilter"]) stream.push('<AutoFilter x:Range="' + a1_to_rc(fix_range(ws["!autofilter"].ref), {r:0,c:0}) + '" xmlns="urn:schemas-microsoft-com:office:excel"></AutoFilter>');
28206
+ stream.push("</Worksheet>");
28207
+ wsidx++; R = -1;
28208
+ return void (stage = 3);
28209
+ }
28210
+
28211
+ /* footer */
28212
+ case -1: {
28213
+ stage = -2;
28214
+ stream.push("</Workbook>");
28215
+ } break;
28216
+
28217
+ /* exeunt */
28218
+ case -2: stream.push(null); break;
28219
+ }};
28220
+ return stream;
28221
+ }
28222
+
27926
28223
  var __stream = {
27927
28224
  to_json: write_json_stream,
27928
28225
  to_html: write_html_stream,
27929
28226
  to_csv: write_csv_stream,
28227
+ to_xlml: write_xlml_stream,
27930
28228
  set_readable: set_readable
27931
28229
  };
27932
28230
  if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;