read-excel-file 5.2.7 → 5.2.11

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 (91) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +4 -0
  3. package/bundle/read-excel-file.min.js +2 -2
  4. package/bundle/read-excel-file.min.js.map +1 -1
  5. package/commonjs/read/coordinates.js +56 -0
  6. package/commonjs/read/coordinates.js.map +1 -0
  7. package/commonjs/read/dropEmptyColumns.js +52 -0
  8. package/commonjs/read/dropEmptyColumns.js.map +1 -0
  9. package/commonjs/read/dropEmptyColumns.test.js.map +1 -0
  10. package/commonjs/read/dropEmptyRows.js +55 -0
  11. package/commonjs/read/dropEmptyRows.js.map +1 -0
  12. package/commonjs/read/dropEmptyRows.test.js.map +1 -0
  13. package/commonjs/read/getData.js +99 -0
  14. package/commonjs/read/getData.js.map +1 -0
  15. package/commonjs/read/parseCell.js +71 -0
  16. package/commonjs/read/parseCell.js.map +1 -0
  17. package/commonjs/read/parseCellValue.js +204 -0
  18. package/commonjs/read/parseCellValue.js.map +1 -0
  19. package/commonjs/read/parseCells.js +30 -0
  20. package/commonjs/read/parseCells.js.map +1 -0
  21. package/commonjs/read/parseDimensions.js +47 -0
  22. package/commonjs/read/parseDimensions.js.map +1 -0
  23. package/commonjs/read/parseFilePaths.js +83 -0
  24. package/commonjs/read/parseFilePaths.js.map +1 -0
  25. package/commonjs/read/parseProperties.js +48 -0
  26. package/commonjs/read/parseProperties.js.map +1 -0
  27. package/commonjs/read/parseSharedStrings.js +17 -0
  28. package/commonjs/read/parseSharedStrings.js.map +1 -0
  29. package/commonjs/read/parseSheet.js +25 -0
  30. package/commonjs/read/parseSheet.js.map +1 -0
  31. package/commonjs/read/parseStyles.js +72 -0
  32. package/commonjs/read/parseStyles.js.map +1 -0
  33. package/commonjs/read/readXlsx.js +25 -657
  34. package/commonjs/read/readXlsx.js.map +1 -1
  35. package/commonjs/types/URL.js +56 -2
  36. package/commonjs/types/URL.js.map +1 -1
  37. package/commonjs/xml/dom.js +17 -3
  38. package/commonjs/xml/dom.js.map +1 -1
  39. package/commonjs/xml/xlsx-xpath.js +10 -0
  40. package/commonjs/xml/xlsx-xpath.js.map +1 -1
  41. package/commonjs/xml/xlsx.js +22 -0
  42. package/commonjs/xml/xlsx.js.map +1 -1
  43. package/commonjs/xml/xmlNode.js +1 -1
  44. package/commonjs/xml/xmlNode.js.map +1 -1
  45. package/{index.d.ts.test → index.d.ts} +1 -4
  46. package/modules/read/coordinates.js +48 -0
  47. package/modules/read/coordinates.js.map +1 -0
  48. package/modules/read/dropEmptyColumns.js +45 -0
  49. package/modules/read/dropEmptyColumns.js.map +1 -0
  50. package/modules/read/dropEmptyColumns.test.js.map +1 -0
  51. package/modules/read/dropEmptyRows.js +48 -0
  52. package/modules/read/dropEmptyRows.js.map +1 -0
  53. package/modules/read/dropEmptyRows.test.js.map +1 -0
  54. package/modules/read/getData.js +88 -0
  55. package/modules/read/getData.js.map +1 -0
  56. package/modules/read/parseCell.js +59 -0
  57. package/modules/read/parseCell.js.map +1 -0
  58. package/modules/read/parseCellValue.js +192 -0
  59. package/modules/read/parseCellValue.js.map +1 -0
  60. package/modules/read/parseCells.js +19 -0
  61. package/modules/read/parseCells.js.map +1 -0
  62. package/modules/read/parseDimensions.js +38 -0
  63. package/modules/read/parseDimensions.js.map +1 -0
  64. package/modules/read/parseFilePaths.js +76 -0
  65. package/modules/read/parseFilePaths.js.map +1 -0
  66. package/modules/read/parseProperties.js +40 -0
  67. package/modules/read/parseProperties.js.map +1 -0
  68. package/modules/read/parseSharedStrings.js +9 -0
  69. package/modules/read/parseSharedStrings.js.map +1 -0
  70. package/modules/read/parseSheet.js +13 -0
  71. package/modules/read/parseSheet.js.map +1 -0
  72. package/modules/read/parseStyles.js +64 -0
  73. package/modules/read/parseStyles.js.map +1 -0
  74. package/modules/read/readXlsx.js +20 -653
  75. package/modules/read/readXlsx.js.map +1 -1
  76. package/modules/types/URL.js +56 -2
  77. package/modules/types/URL.js.map +1 -1
  78. package/modules/xml/dom.js +14 -3
  79. package/modules/xml/dom.js.map +1 -1
  80. package/modules/xml/xlsx-xpath.js +6 -0
  81. package/modules/xml/xlsx-xpath.js.map +1 -1
  82. package/modules/xml/xlsx.js +19 -1
  83. package/modules/xml/xlsx.js.map +1 -1
  84. package/modules/xml/xmlNode.js +1 -1
  85. package/modules/xml/xmlNode.js.map +1 -1
  86. package/node/{index.d.ts.test → index.d.ts} +1 -1
  87. package/package.json +6 -5
  88. package/schema/{index.d.ts.test → index.d.ts} +0 -0
  89. package/types.d.ts +1 -4
  90. package/commonjs/read/readXlsx.test.js.map +0 -1
  91. package/modules/read/readXlsx.test.js.map +0 -1
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.calculateDimensions = calculateDimensions;
7
+ exports.parseCellCoordinates = parseCellCoordinates;
8
+ // Maps "A1"-like coordinates to `{ row, column }` numeric coordinates.
9
+ var LETTERS = ["", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
10
+
11
+ function calculateDimensions(cells) {
12
+ var comparator = function comparator(a, b) {
13
+ return a - b;
14
+ };
15
+
16
+ var allRows = cells.map(function (cell) {
17
+ return cell.row;
18
+ }).sort(comparator);
19
+ var allCols = cells.map(function (cell) {
20
+ return cell.column;
21
+ }).sort(comparator);
22
+ var minRow = allRows[0];
23
+ var maxRow = allRows[allRows.length - 1];
24
+ var minCol = allCols[0];
25
+ var maxCol = allCols[allCols.length - 1];
26
+ return [{
27
+ row: minRow,
28
+ column: minCol
29
+ }, {
30
+ row: maxRow,
31
+ column: maxCol
32
+ }];
33
+ }
34
+
35
+ function columnLettersToNumber(columnLetters) {
36
+ // `for ... of ...` would require Babel polyfill for iterating a string.
37
+ var n = 0;
38
+ var i = 0;
39
+
40
+ while (i < columnLetters.length) {
41
+ n *= 26;
42
+ n += LETTERS.indexOf(columnLetters[i]);
43
+ i++;
44
+ }
45
+
46
+ return n;
47
+ }
48
+
49
+ function parseCellCoordinates(coords) {
50
+ // Examples: "AA2091", "R988", "B1"
51
+ coords = coords.split(/(\d+)/);
52
+ return [// Row.
53
+ parseInt(coords[1]), // Column.
54
+ columnLettersToNumber(coords[0].trim())];
55
+ }
56
+ //# sourceMappingURL=coordinates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/coordinates.js"],"names":["LETTERS","calculateDimensions","cells","comparator","a","b","allRows","map","cell","row","sort","allCols","column","minRow","maxRow","length","minCol","maxCol","columnLettersToNumber","columnLetters","n","i","indexOf","parseCellCoordinates","coords","split","parseInt","trim"],"mappings":";;;;;;;AAAA;AACA,IAAMA,OAAO,GAAG,CAAC,EAAD,EAAK,GAAL,EAAU,GAAV,EAAe,GAAf,EAAoB,GAApB,EAAyB,GAAzB,EAA8B,GAA9B,EAAmC,GAAnC,EAAwC,GAAxC,EAA6C,GAA7C,EAAkD,GAAlD,EAAuD,GAAvD,EAA4D,GAA5D,EAAiE,GAAjE,EAAsE,GAAtE,EAA2E,GAA3E,EAAgF,GAAhF,EAAqF,GAArF,EAA0F,GAA1F,EAA+F,GAA/F,EAAoG,GAApG,EAAyG,GAAzG,EAA8G,GAA9G,EAAmH,GAAnH,EAAwH,GAAxH,EAA6H,GAA7H,EAAkI,GAAlI,CAAhB;;AAEO,SAASC,mBAAT,CAA8BC,KAA9B,EAAqC;AAC1C,MAAMC,UAAU,GAAG,SAAbA,UAAa,CAACC,CAAD,EAAIC,CAAJ;AAAA,WAAUD,CAAC,GAAGC,CAAd;AAAA,GAAnB;;AACA,MAAMC,OAAO,GAAGJ,KAAK,CAACK,GAAN,CAAU,UAAAC,IAAI;AAAA,WAAIA,IAAI,CAACC,GAAT;AAAA,GAAd,EAA4BC,IAA5B,CAAiCP,UAAjC,CAAhB;AACA,MAAMQ,OAAO,GAAGT,KAAK,CAACK,GAAN,CAAU,UAAAC,IAAI;AAAA,WAAIA,IAAI,CAACI,MAAT;AAAA,GAAd,EAA+BF,IAA/B,CAAoCP,UAApC,CAAhB;AACA,MAAMU,MAAM,GAAGP,OAAO,CAAC,CAAD,CAAtB;AACA,MAAMQ,MAAM,GAAGR,OAAO,CAACA,OAAO,CAACS,MAAR,GAAiB,CAAlB,CAAtB;AACA,MAAMC,MAAM,GAAGL,OAAO,CAAC,CAAD,CAAtB;AACA,MAAMM,MAAM,GAAGN,OAAO,CAACA,OAAO,CAACI,MAAR,GAAiB,CAAlB,CAAtB;AAEA,SAAO,CACL;AAAEN,IAAAA,GAAG,EAAEI,MAAP;AAAeD,IAAAA,MAAM,EAAEI;AAAvB,GADK,EAEL;AAAEP,IAAAA,GAAG,EAAEK,MAAP;AAAeF,IAAAA,MAAM,EAAEK;AAAvB,GAFK,CAAP;AAID;;AAED,SAASC,qBAAT,CAA+BC,aAA/B,EAA8C;AAC5C;AACA,MAAIC,CAAC,GAAG,CAAR;AACA,MAAIC,CAAC,GAAG,CAAR;;AACA,SAAOA,CAAC,GAAGF,aAAa,CAACJ,MAAzB,EAAiC;AAC/BK,IAAAA,CAAC,IAAI,EAAL;AACAA,IAAAA,CAAC,IAAIpB,OAAO,CAACsB,OAAR,CAAgBH,aAAa,CAACE,CAAD,CAA7B,CAAL;AACAA,IAAAA,CAAC;AACF;;AACD,SAAOD,CAAP;AACD;;AAEM,SAASG,oBAAT,CAA8BC,MAA9B,EAAsC;AAC3C;AACAA,EAAAA,MAAM,GAAGA,MAAM,CAACC,KAAP,CAAa,OAAb,CAAT;AACA,SAAO,CACL;AACAC,EAAAA,QAAQ,CAACF,MAAM,CAAC,CAAD,CAAP,CAFH,EAGL;AACAN,EAAAA,qBAAqB,CAACM,MAAM,CAAC,CAAD,CAAN,CAAUG,IAAV,EAAD,CAJhB,CAAP;AAMD","sourcesContent":["// Maps \"A1\"-like coordinates to `{ row, column }` numeric coordinates.\r\nconst LETTERS = [\"\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"]\r\n\r\nexport function calculateDimensions (cells) {\r\n const comparator = (a, b) => a - b\r\n const allRows = cells.map(cell => cell.row).sort(comparator)\r\n const allCols = cells.map(cell => cell.column).sort(comparator)\r\n const minRow = allRows[0]\r\n const maxRow = allRows[allRows.length - 1]\r\n const minCol = allCols[0]\r\n const maxCol = allCols[allCols.length - 1]\r\n\r\n return [\r\n { row: minRow, column: minCol },\r\n { row: maxRow, column: maxCol }\r\n ]\r\n}\r\n\r\nfunction columnLettersToNumber(columnLetters) {\r\n // `for ... of ...` would require Babel polyfill for iterating a string.\r\n let n = 0\r\n let i = 0\r\n while (i < columnLetters.length) {\r\n n *= 26\r\n n += LETTERS.indexOf(columnLetters[i])\r\n i++\r\n }\r\n return n\r\n}\r\n\r\nexport function parseCellCoordinates(coords) {\r\n // Examples: \"AA2091\", \"R988\", \"B1\"\r\n coords = coords.split(/(\\d+)/)\r\n return [\r\n // Row.\r\n parseInt(coords[1]),\r\n // Column.\r\n columnLettersToNumber(coords[0].trim())\r\n ]\r\n}"],"file":"coordinates.js"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = dropEmptyColumns;
7
+
8
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+
10
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
+
12
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
13
+
14
+ function dropEmptyColumns(data) {
15
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
16
+ _ref$accessor = _ref.accessor,
17
+ accessor = _ref$accessor === void 0 ? function (_) {
18
+ return _;
19
+ } : _ref$accessor,
20
+ onlyTrimAtTheEnd = _ref.onlyTrimAtTheEnd;
21
+
22
+ var i = data[0].length - 1;
23
+
24
+ while (i >= 0) {
25
+ var empty = true;
26
+
27
+ for (var _iterator = _createForOfIteratorHelperLoose(data), _step; !(_step = _iterator()).done;) {
28
+ var row = _step.value;
29
+
30
+ if (accessor(row[i]) !== null) {
31
+ empty = false;
32
+ break;
33
+ }
34
+ }
35
+
36
+ if (empty) {
37
+ var j = 0;
38
+
39
+ while (j < data.length) {
40
+ data[j].splice(i, 1);
41
+ j++;
42
+ }
43
+ } else if (onlyTrimAtTheEnd) {
44
+ break;
45
+ }
46
+
47
+ i--;
48
+ }
49
+
50
+ return data;
51
+ }
52
+ //# sourceMappingURL=dropEmptyColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/dropEmptyColumns.js"],"names":["dropEmptyColumns","data","accessor","_","onlyTrimAtTheEnd","i","length","empty","row","j","splice"],"mappings":";;;;;;;;;;;;;AAAe,SAASA,gBAAT,CAA0BC,IAA1B,EAGP;AAAA,iFAAJ,EAAI;AAAA,2BAFNC,QAEM;AAAA,MAFNA,QAEM,8BAFK,UAAAC,CAAC;AAAA,WAAIA,CAAJ;AAAA,GAEN;AAAA,MADNC,gBACM,QADNA,gBACM;;AACN,MAAIC,CAAC,GAAGJ,IAAI,CAAC,CAAD,CAAJ,CAAQK,MAAR,GAAiB,CAAzB;;AACA,SAAOD,CAAC,IAAI,CAAZ,EAAe;AACb,QAAIE,KAAK,GAAG,IAAZ;;AACA,yDAAkBN,IAAlB,wCAAwB;AAAA,UAAbO,GAAa;;AACtB,UAAIN,QAAQ,CAACM,GAAG,CAACH,CAAD,CAAJ,CAAR,KAAqB,IAAzB,EAA+B;AAC7BE,QAAAA,KAAK,GAAG,KAAR;AACA;AACD;AACF;;AACD,QAAIA,KAAJ,EAAW;AACT,UAAIE,CAAC,GAAG,CAAR;;AACA,aAAOA,CAAC,GAAGR,IAAI,CAACK,MAAhB,EAAwB;AACtBL,QAAAA,IAAI,CAACQ,CAAD,CAAJ,CAAQC,MAAR,CAAeL,CAAf,EAAkB,CAAlB;AACAI,QAAAA,CAAC;AACF;AACF,KAND,MAMO,IAAIL,gBAAJ,EAAsB;AAC3B;AACD;;AACDC,IAAAA,CAAC;AACF;;AACD,SAAOJ,IAAP;AACD","sourcesContent":["export default function dropEmptyColumns(data, {\r\n accessor = _ => _,\r\n onlyTrimAtTheEnd\r\n} = {}) {\r\n let i = data[0].length - 1\r\n while (i >= 0) {\r\n let empty = true\r\n for (const row of data) {\r\n if (accessor(row[i]) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n if (empty) {\r\n let j = 0;\r\n while (j < data.length) {\r\n data[j].splice(i, 1)\r\n j++\r\n }\r\n } else if (onlyTrimAtTheEnd) {\r\n break\r\n }\r\n i--\r\n }\r\n return data\r\n}"],"file":"dropEmptyColumns.js"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/dropEmptyColumns.test.js"],"names":["describe","it","onlyTrimAtTheEnd","should","deep","equal"],"mappings":";;AAAA;;;;AAEAA,QAAQ,CAAC,kBAAD,EAAqB,YAAM;AAClCC,EAAAA,EAAE,CAAC,6CAAD,EAAgD,YAAM;AACvD,sCAAiB,CAChB,CAAC,IAAD,EAAO,GAAP,EAAY,GAAZ,EAAiB,GAAjB,EAAsB,IAAtB,EAA4B,IAA5B,CADgB,EAEhB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,EAAkB,IAAlB,EAAwB,IAAxB,EAA8B,IAA9B,CAFgB,EAGhB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,EAAyB,IAAzB,EAA+B,IAA/B,CAHgB,EAIhB,CAAC,IAAD,EAAO,IAAP,EAAa,GAAb,EAAkB,GAAlB,EAAuB,GAAvB,EAA4B,IAA5B,CAJgB,CAAjB,EAKG;AACFC,MAAAA,gBAAgB,EAAE;AADhB,KALH,EAQCC,MARD,CAQQC,IARR,CAQaC,KARb,CAQmB,CAClB,CAAC,IAAD,EAAO,GAAP,EAAY,GAAZ,EAAiB,GAAjB,EAAsB,IAAtB,CADkB,EAElB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,EAAkB,IAAlB,EAAwB,IAAxB,CAFkB,EAGlB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,EAAyB,IAAzB,CAHkB,EAIlB,CAAC,IAAD,EAAO,IAAP,EAAa,GAAb,EAAkB,GAAlB,EAAuB,GAAvB,CAJkB,CARnB;AAcA,GAfC,CAAF;AAiBAJ,EAAAA,EAAE,CAAC,2BAAD,EAA8B,YAAM;AACrC,sCAAiB,CAChB,CAAC,IAAD,EAAO,GAAP,EAAY,GAAZ,EAAiB,GAAjB,EAAsB,IAAtB,EAA4B,IAA5B,CADgB,EAEhB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,EAAkB,IAAlB,EAAwB,IAAxB,EAA8B,IAA9B,CAFgB,EAGhB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,EAAyB,IAAzB,EAA+B,IAA/B,CAHgB,EAIhB,CAAC,IAAD,EAAO,IAAP,EAAa,GAAb,EAAkB,GAAlB,EAAuB,GAAvB,EAA4B,IAA5B,CAJgB,CAAjB,EAMCE,MAND,CAMQC,IANR,CAMaC,KANb,CAMmB,CAClB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,IAAhB,CADkB,EAElB,CAAC,GAAD,EAAM,IAAN,EAAY,IAAZ,EAAkB,IAAlB,CAFkB,EAGlB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,CAHkB,EAIlB,CAAC,IAAD,EAAO,GAAP,EAAY,GAAZ,EAAiB,GAAjB,CAJkB,CANnB;AAYA,GAbC,CAAF;AAcA,CAhCO,CAAR","sourcesContent":["import dropEmptyColumns from './dropEmptyColumns'\r\n\r\ndescribe('dropEmptyColumns', () => {\r\n\tit('should drop empty columns (only at the end)', () => {\r\n\t\tdropEmptyColumns([\r\n\t\t\t[null, 'A', 'B', 'C', null, null],\r\n\t\t\t[null, 'D', null, null, null, null],\r\n\t\t\t[null, null, null, null, null, null],\r\n\t\t\t[null, null, 'E', 'F', 'G', null]\r\n\t\t], {\r\n\t\t\tonlyTrimAtTheEnd: true\r\n\t\t})\r\n\t\t.should.deep.equal([\r\n\t\t\t[null, 'A', 'B', 'C', null],\r\n\t\t\t[null, 'D', null, null, null],\r\n\t\t\t[null, null, null, null, null],\r\n\t\t\t[null, null, 'E', 'F', 'G']\r\n\t\t])\r\n\t})\r\n\r\n\tit('should drop empty columns', () => {\r\n\t\tdropEmptyColumns([\r\n\t\t\t[null, 'A', 'B', 'C', null, null],\r\n\t\t\t[null, 'D', null, null, null, null],\r\n\t\t\t[null, null, null, null, null, null],\r\n\t\t\t[null, null, 'E', 'F', 'G', null]\r\n\t\t])\r\n\t\t.should.deep.equal([\r\n\t\t\t['A', 'B', 'C', null],\r\n\t\t\t['D', null, null, null],\r\n\t\t\t[null, null, null, null],\r\n\t\t\t[null, 'E', 'F', 'G']\r\n\t\t])\r\n\t})\r\n})"],"file":"dropEmptyColumns.test.js"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = dropEmptyRows;
7
+
8
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+
10
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
+
12
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
13
+
14
+ function dropEmptyRows(data) {
15
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
16
+ rowMap = _ref.rowMap,
17
+ _ref$accessor = _ref.accessor,
18
+ accessor = _ref$accessor === void 0 ? function (_) {
19
+ return _;
20
+ } : _ref$accessor,
21
+ onlyTrimAtTheEnd = _ref.onlyTrimAtTheEnd;
22
+
23
+ // Drop empty rows.
24
+ var i = data.length - 1;
25
+
26
+ while (i >= 0) {
27
+ // Check if the row is empty.
28
+ var empty = true;
29
+
30
+ for (var _iterator = _createForOfIteratorHelperLoose(data[i]), _step; !(_step = _iterator()).done;) {
31
+ var cell = _step.value;
32
+
33
+ if (accessor(cell) !== null) {
34
+ empty = false;
35
+ break;
36
+ }
37
+ } // Remove the empty row.
38
+
39
+
40
+ if (empty) {
41
+ data.splice(i, 1);
42
+
43
+ if (rowMap) {
44
+ rowMap.splice(i, 1);
45
+ }
46
+ } else if (onlyTrimAtTheEnd) {
47
+ break;
48
+ }
49
+
50
+ i--;
51
+ }
52
+
53
+ return data;
54
+ }
55
+ //# sourceMappingURL=dropEmptyRows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/dropEmptyRows.js"],"names":["dropEmptyRows","data","rowMap","accessor","_","onlyTrimAtTheEnd","i","length","empty","cell","splice"],"mappings":";;;;;;;;;;;;;AAAe,SAASA,aAAT,CAAuBC,IAAvB,EAIP;AAAA,iFAAJ,EAAI;AAAA,MAHNC,MAGM,QAHNA,MAGM;AAAA,2BAFNC,QAEM;AAAA,MAFNA,QAEM,8BAFK,UAAAC,CAAC;AAAA,WAAIA,CAAJ;AAAA,GAEN;AAAA,MADNC,gBACM,QADNA,gBACM;;AACN;AACA,MAAIC,CAAC,GAAGL,IAAI,CAACM,MAAL,GAAc,CAAtB;;AACA,SAAOD,CAAC,IAAI,CAAZ,EAAe;AACb;AACA,QAAIE,KAAK,GAAG,IAAZ;;AACA,yDAAmBP,IAAI,CAACK,CAAD,CAAvB,wCAA4B;AAAA,UAAjBG,IAAiB;;AAC1B,UAAIN,QAAQ,CAACM,IAAD,CAAR,KAAmB,IAAvB,EAA6B;AAC3BD,QAAAA,KAAK,GAAG,KAAR;AACA;AACD;AACF,KARY,CASb;;;AACA,QAAIA,KAAJ,EAAW;AACTP,MAAAA,IAAI,CAACS,MAAL,CAAYJ,CAAZ,EAAe,CAAf;;AACA,UAAIJ,MAAJ,EAAY;AACVA,QAAAA,MAAM,CAACQ,MAAP,CAAcJ,CAAd,EAAiB,CAAjB;AACD;AACF,KALD,MAKO,IAAID,gBAAJ,EAAsB;AAC3B;AACD;;AACDC,IAAAA,CAAC;AACF;;AACD,SAAOL,IAAP;AACD","sourcesContent":["export default function dropEmptyRows(data, {\r\n rowMap,\r\n accessor = _ => _,\r\n onlyTrimAtTheEnd\r\n} = {}) {\r\n // Drop empty rows.\r\n let i = data.length - 1\r\n while (i >= 0) {\r\n // Check if the row is empty.\r\n let empty = true\r\n for (const cell of data[i]) {\r\n if (accessor(cell) !== null) {\r\n empty = false\r\n break\r\n }\r\n }\r\n // Remove the empty row.\r\n if (empty) {\r\n data.splice(i, 1)\r\n if (rowMap) {\r\n rowMap.splice(i, 1)\r\n }\r\n } else if (onlyTrimAtTheEnd) {\r\n break\r\n }\r\n i--\r\n }\r\n return data\r\n}"],"file":"dropEmptyRows.js"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/dropEmptyRows.test.js"],"names":["describe","it","onlyTrimAtTheEnd","should","deep","equal","rowMap"],"mappings":";;AAAA;;;;AAEAA,QAAQ,CAAC,eAAD,EAAkB,YAAM;AAC/BC,EAAAA,EAAE,CAAC,0CAAD,EAA6C,YAAM;AACpD,mCAAc,CACb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CADa,EAEb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFa,EAGb,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAHa,EAIb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CAJa,EAKb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CALa,EAMb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CANa,CAAd,EAOG;AACFC,MAAAA,gBAAgB,EAAE;AADhB,KAPH,EAUCC,MAVD,CAUQC,IAVR,CAUaC,KAVb,CAUmB,CAClB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CADkB,EAElB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFkB,EAGlB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAHkB,EAIlB,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CAJkB,EAKlB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CALkB,CAVnB;AAiBA,GAlBC,CAAF;AAoBAJ,EAAAA,EAAE,CAAC,wBAAD,EAA2B,YAAM;AAClC,mCAAc,CACb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CADa,EAEb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFa,EAGb,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAHa,EAIb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CAJa,EAKb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CALa,EAMb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CANa,CAAd,EAQCE,MARD,CAQQC,IARR,CAQaC,KARb,CAQmB,CAClB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CADkB,EAElB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAFkB,EAGlB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAHkB,CARnB;AAaA,GAdC,CAAF;AAgBAJ,EAAAA,EAAE,CAAC,kDAAD,EAAqD,YAAM;AAC5D,QAAMK,MAAM,GAAG,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,EAAa,CAAb,CAAf;AAEA,mCAAc,CACb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CADa,EAEb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAFa,EAGb,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAHa,EAIb,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,CAJa,EAKb,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CALa,CAAd,EAOA;AAAEA,MAAAA,MAAM,EAANA;AAAF,KAPA,EAQCH,MARD,CAQQC,IARR,CAQaC,KARb,CAQmB,CAClB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CADkB,EAElB,CAAC,IAAD,EAAO,GAAP,EAAY,IAAZ,CAFkB,EAGlB,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,CAHkB,CARnB;AAcAC,IAAAA,MAAM,CAACH,MAAP,CAAcC,IAAd,CAAmBC,KAAnB,CAAyB,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAzB;AACA,GAlBC,CAAF;AAmBA,CAxDO,CAAR","sourcesContent":["import dropEmptyRows from './dropEmptyRows'\r\n\r\ndescribe('dropEmptyRows', () => {\r\n\tit('should drop empty rows (only at the end)', () => {\r\n\t\tdropEmptyRows([\r\n\t\t\t[null, null, null],\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t[null, null, null],\r\n\t\t\t['E', 'F', 'G'],\r\n\t\t\t[null, null, null]\r\n\t\t], {\r\n\t\t\tonlyTrimAtTheEnd: true\r\n\t\t})\r\n\t\t.should.deep.equal([\r\n\t\t\t[null, null, null],\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t[null, null, null],\r\n\t\t\t['E', 'F', 'G']\r\n\t\t])\r\n\t})\r\n\r\n\tit('should drop empty rows', () => {\r\n\t\tdropEmptyRows([\r\n\t\t\t[null, null, null],\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t[null, null, null],\r\n\t\t\t['E', 'F', 'G'],\r\n\t\t\t[null, null, null]\r\n\t\t])\r\n\t\t.should.deep.equal([\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t['E', 'F', 'G']\r\n\t\t])\r\n\t})\r\n\r\n\tit('should generate row map when dropping empty rows', () => {\r\n\t\tconst rowMap = [0, 1, 2, 3, 4]\r\n\r\n\t\tdropEmptyRows([\r\n\t\t\t[null, null, null],\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t[null, null, null],\r\n\t\t\t['E', 'F', 'G']\r\n\t\t],\r\n\t\t{ rowMap })\r\n\t\t.should.deep.equal([\r\n\t\t\t['A', 'B', 'C'],\r\n\t\t\t[null, 'D', null],\r\n\t\t\t['E', 'F', 'G']\r\n\t\t])\r\n\r\n\t\trowMap.should.deep.equal([1, 2, 4])\r\n\t})\r\n})"],"file":"dropEmptyRows.test.js"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = getData;
7
+
8
+ var _dropEmptyRows = _interopRequireDefault(require("./dropEmptyRows"));
9
+
10
+ var _dropEmptyColumns = _interopRequireDefault(require("./dropEmptyColumns"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
+
14
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
15
+
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
+
18
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
19
+
20
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
+
22
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
23
+
24
+ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
25
+
26
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
27
+
28
+ function getData(sheet, options) {
29
+ var dimensions = sheet.dimensions,
30
+ cells = sheet.cells; // If the sheet is empty.
31
+
32
+ if (cells.length === 0) {
33
+ return [];
34
+ }
35
+
36
+ var _dimensions = _slicedToArray(dimensions, 2),
37
+ leftTop = _dimensions[0],
38
+ rightBottom = _dimensions[1];
39
+
40
+ var colsCount = rightBottom.column - leftTop.column + 1;
41
+ var rowsCount = rightBottom.row - leftTop.row + 1; // Initialize spreadsheet data structure.
42
+
43
+ var data = new Array(rowsCount);
44
+ var i = 0;
45
+
46
+ while (i < rowsCount) {
47
+ data[i] = new Array(colsCount);
48
+ var j = 0;
49
+
50
+ while (j < colsCount) {
51
+ data[i][j] = null;
52
+ j++;
53
+ }
54
+
55
+ i++;
56
+ } // Fill in spreadsheet data structure.
57
+ // (this code implies that `cells` aren't necessarily sorted by row and column:
58
+ // maybe that's not correct, this piece code was initially copy-pasted
59
+ // from some other library that used `XPath`)
60
+
61
+
62
+ for (var _iterator = _createForOfIteratorHelperLoose(cells), _step; !(_step = _iterator()).done;) {
63
+ var cell = _step.value;
64
+ var row = cell.row - leftTop.row;
65
+ var column = cell.column - leftTop.column;
66
+ data[row][column] = cell.value;
67
+ } // Fill in the row map.
68
+
69
+
70
+ var rowMap = options.rowMap;
71
+
72
+ if (rowMap) {
73
+ var _i2 = 0;
74
+
75
+ while (_i2 < data.length) {
76
+ rowMap[_i2] = _i2;
77
+ _i2++;
78
+ }
79
+ } // Drop empty columns or rows.
80
+
81
+
82
+ data = (0, _dropEmptyRows["default"])((0, _dropEmptyColumns["default"])(data, {
83
+ onlyTrimAtTheEnd: true
84
+ }), {
85
+ onlyTrimAtTheEnd: true,
86
+ rowMap: rowMap
87
+ }); // Optionally transform data before applying `schema`.
88
+
89
+ if (options.transformData) {
90
+ data = options.transformData(data); // data = options.transformData(data, {
91
+ // dropEmptyRowsAndColumns(data) {
92
+ // return dropEmptyRows(dropEmptyColumns(data), { rowMap })
93
+ // }
94
+ // })
95
+ }
96
+
97
+ return data;
98
+ }
99
+ //# sourceMappingURL=getData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/getData.js"],"names":["getData","sheet","options","dimensions","cells","length","leftTop","rightBottom","colsCount","column","rowsCount","row","data","Array","i","j","cell","value","rowMap","onlyTrimAtTheEnd","transformData"],"mappings":";;;;;;;AAAA;;AACA;;;;;;;;;;;;;;;;;;AAEe,SAASA,OAAT,CAAiBC,KAAjB,EAAwBC,OAAxB,EAAiC;AAC9C,MAAQC,UAAR,GAA8BF,KAA9B,CAAQE,UAAR;AAAA,MAAoBC,KAApB,GAA8BH,KAA9B,CAAoBG,KAApB,CAD8C,CAG9C;;AACA,MAAIA,KAAK,CAACC,MAAN,KAAiB,CAArB,EAAwB;AACtB,WAAO,EAAP;AACD;;AAED,mCAA+BF,UAA/B;AAAA,MAAOG,OAAP;AAAA,MAAgBC,WAAhB;;AAEA,MAAMC,SAAS,GAAID,WAAW,CAACE,MAAZ,GAAqBH,OAAO,CAACG,MAA9B,GAAwC,CAA1D;AACA,MAAMC,SAAS,GAAIH,WAAW,CAACI,GAAZ,GAAkBL,OAAO,CAACK,GAA3B,GAAkC,CAApD,CAX8C,CAa9C;;AACA,MAAIC,IAAI,GAAG,IAAIC,KAAJ,CAAUH,SAAV,CAAX;AACA,MAAII,CAAC,GAAG,CAAR;;AACA,SAAOA,CAAC,GAAGJ,SAAX,EAAsB;AACpBE,IAAAA,IAAI,CAACE,CAAD,CAAJ,GAAU,IAAID,KAAJ,CAAUL,SAAV,CAAV;AACA,QAAIO,CAAC,GAAG,CAAR;;AACA,WAAOA,CAAC,GAAGP,SAAX,EAAsB;AACpBI,MAAAA,IAAI,CAACE,CAAD,CAAJ,CAAQC,CAAR,IAAa,IAAb;AACAA,MAAAA,CAAC;AACF;;AACDD,IAAAA,CAAC;AACF,GAxB6C,CA0B9C;AACA;AACA;AACA;;;AACA,uDAAmBV,KAAnB,wCAA0B;AAAA,QAAfY,IAAe;AACxB,QAAML,GAAG,GAAGK,IAAI,CAACL,GAAL,GAAWL,OAAO,CAACK,GAA/B;AACA,QAAMF,MAAM,GAAGO,IAAI,CAACP,MAAL,GAAcH,OAAO,CAACG,MAArC;AACAG,IAAAA,IAAI,CAACD,GAAD,CAAJ,CAAUF,MAAV,IAAoBO,IAAI,CAACC,KAAzB;AACD,GAlC6C,CAoC9C;;;AACA,MAAQC,MAAR,GAAmBhB,OAAnB,CAAQgB,MAAR;;AACA,MAAIA,MAAJ,EAAY;AACV,QAAIJ,GAAC,GAAG,CAAR;;AACA,WAAOA,GAAC,GAAGF,IAAI,CAACP,MAAhB,EAAwB;AACtBa,MAAAA,MAAM,CAACJ,GAAD,CAAN,GAAYA,GAAZ;AACAA,MAAAA,GAAC;AACF;AACF,GA5C6C,CA8C9C;;;AACAF,EAAAA,IAAI,GAAG,+BACL,kCAAiBA,IAAjB,EAAuB;AAAEO,IAAAA,gBAAgB,EAAE;AAApB,GAAvB,CADK,EAEL;AAAEA,IAAAA,gBAAgB,EAAE,IAApB;AAA0BD,IAAAA,MAAM,EAANA;AAA1B,GAFK,CAAP,CA/C8C,CAoD9C;;AACA,MAAIhB,OAAO,CAACkB,aAAZ,EAA2B;AACzBR,IAAAA,IAAI,GAAGV,OAAO,CAACkB,aAAR,CAAsBR,IAAtB,CAAP,CADyB,CAEzB;AACA;AACA;AACA;AACA;AACD;;AAED,SAAOA,IAAP;AACD","sourcesContent":["import dropEmptyRows from './dropEmptyRows'\r\nimport dropEmptyColumns from './dropEmptyColumns'\r\n\r\nexport default function getData(sheet, options) {\r\n const { dimensions, cells } = sheet\r\n\r\n // If the sheet is empty.\r\n if (cells.length === 0) {\r\n return []\r\n }\r\n\r\n const [leftTop, rightBottom] = dimensions\r\n\r\n const colsCount = (rightBottom.column - leftTop.column) + 1\r\n const rowsCount = (rightBottom.row - leftTop.row) + 1\r\n\r\n // Initialize spreadsheet data structure.\r\n let data = new Array(rowsCount)\r\n let i = 0\r\n while (i < rowsCount) {\r\n data[i] = new Array(colsCount)\r\n let j = 0\r\n while (j < colsCount) {\r\n data[i][j] = null\r\n j++\r\n }\r\n i++\r\n }\r\n\r\n // Fill in spreadsheet data structure.\r\n // (this code implies that `cells` aren't necessarily sorted by row and column:\r\n // maybe that's not correct, this piece code was initially copy-pasted\r\n // from some other library that used `XPath`)\r\n for (const cell of cells) {\r\n const row = cell.row - leftTop.row\r\n const column = cell.column - leftTop.column\r\n data[row][column] = cell.value\r\n }\r\n\r\n // Fill in the row map.\r\n const { rowMap } = options\r\n if (rowMap) {\r\n let i = 0\r\n while (i < data.length) {\r\n rowMap[i] = i\r\n i++\r\n }\r\n }\r\n\r\n // Drop empty columns or rows.\r\n data = dropEmptyRows(\r\n dropEmptyColumns(data, { onlyTrimAtTheEnd: true }),\r\n { onlyTrimAtTheEnd: true, rowMap }\r\n )\r\n\r\n // Optionally transform data before applying `schema`.\r\n if (options.transformData) {\r\n data = options.transformData(data)\r\n // data = options.transformData(data, {\r\n // dropEmptyRowsAndColumns(data) {\r\n // return dropEmptyRows(dropEmptyColumns(data), { rowMap })\r\n // }\r\n // })\r\n }\r\n\r\n return data\r\n}"],"file":"getData.js"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = parseCell;
7
+
8
+ var _parseCellValue = _interopRequireDefault(require("./parseCellValue"));
9
+
10
+ var _coordinates = require("./coordinates");
11
+
12
+ var _xlsx = require("../xml/xlsx");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
15
+
16
+ // Example of a `<c/>`ell element:
17
+ //
18
+ // <c>
19
+ // <f>string</f> — formula.
20
+ // <v>string</v> — formula pre-computed value.
21
+ // <is>
22
+ // <t>string</t> — an `inlineStr` string (rather than a "common string" from a dictionary).
23
+ // <r>
24
+ // <rPr>
25
+ // ...
26
+ // </rPr>
27
+ // <t>string</t>
28
+ // </r>
29
+ // <rPh sb="1" eb="1">
30
+ // <t>string</t>
31
+ // </rPh>
32
+ // <phoneticPr fontId="1"/>
33
+ // </is>
34
+ // <extLst>
35
+ // <ext>
36
+ // <!--any element-->
37
+ // </ext>
38
+ // </extLst>
39
+ // </c>
40
+ //
41
+ function parseCell(node, sheet, xml, values, styles, properties, options) {
42
+ var coords = (0, _coordinates.parseCellCoordinates)(node.getAttribute('r'));
43
+ var valueElement = (0, _xlsx.getCellValue)(sheet, node); // For `xpath`, `value` can be `undefined` while for native `DOMParser` it's `null`.
44
+ // So using `value && ...` instead of `if (value !== undefined) { ... }` here
45
+ // for uniform compatibility with both `xpath` and native `DOMParser`.
46
+
47
+ var value = valueElement && valueElement.textContent;
48
+ var type;
49
+
50
+ if (node.hasAttribute('t')) {
51
+ type = node.getAttribute('t');
52
+ }
53
+
54
+ return {
55
+ row: coords[0],
56
+ column: coords[1],
57
+ value: (0, _parseCellValue["default"])(value, type, {
58
+ getInlineStringValue: function getInlineStringValue() {
59
+ return (0, _xlsx.getCellInlineStringValue)(sheet, node);
60
+ },
61
+ getStyleId: function getStyleId() {
62
+ return node.getAttribute('s');
63
+ },
64
+ styles: styles,
65
+ values: values,
66
+ properties: properties,
67
+ options: options
68
+ })
69
+ };
70
+ }
71
+ //# sourceMappingURL=parseCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/parseCell.js"],"names":["parseCell","node","sheet","xml","values","styles","properties","options","coords","getAttribute","valueElement","value","textContent","type","hasAttribute","row","column","getInlineStringValue","getStyleId"],"mappings":";;;;;;;AAAA;;AAEA;;AAIA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,SAAT,CAAmBC,IAAnB,EAAyBC,KAAzB,EAAgCC,GAAhC,EAAqCC,MAArC,EAA6CC,MAA7C,EAAqDC,UAArD,EAAiEC,OAAjE,EAA0E;AACvF,MAAMC,MAAM,GAAG,uCAAqBP,IAAI,CAACQ,YAAL,CAAkB,GAAlB,CAArB,CAAf;AAEA,MAAMC,YAAY,GAAG,wBAAaR,KAAb,EAAoBD,IAApB,CAArB,CAHuF,CAKvF;AACA;AACA;;AACA,MAAIU,KAAK,GAAGD,YAAY,IAAIA,YAAY,CAACE,WAAzC;AAEA,MAAIC,IAAJ;;AACA,MAAIZ,IAAI,CAACa,YAAL,CAAkB,GAAlB,CAAJ,EAA4B;AAC1BD,IAAAA,IAAI,GAAGZ,IAAI,CAACQ,YAAL,CAAkB,GAAlB,CAAP;AACD;;AAED,SAAO;AACLM,IAAAA,GAAG,EAAEP,MAAM,CAAC,CAAD,CADN;AAELQ,IAAAA,MAAM,EAAER,MAAM,CAAC,CAAD,CAFT;AAGLG,IAAAA,KAAK,EAAE,gCAAeA,KAAf,EAAsBE,IAAtB,EAA4B;AACjCI,MAAAA,oBAAoB,EAAE;AAAA,eAAM,oCAAyBf,KAAzB,EAAgCD,IAAhC,CAAN;AAAA,OADW;AAEjCiB,MAAAA,UAAU,EAAE;AAAA,eAAMjB,IAAI,CAACQ,YAAL,CAAkB,GAAlB,CAAN;AAAA,OAFqB;AAGjCJ,MAAAA,MAAM,EAANA,MAHiC;AAIjCD,MAAAA,MAAM,EAANA,MAJiC;AAKjCE,MAAAA,UAAU,EAAVA,UALiC;AAMjCC,MAAAA,OAAO,EAAPA;AANiC,KAA5B;AAHF,GAAP;AAYD","sourcesContent":["import parseCellValue from './parseCellValue'\r\n\r\nimport {\r\n parseCellCoordinates\r\n} from './coordinates'\r\n\r\nimport {\r\n getCellValue,\r\n getCellInlineStringValue\r\n} from '../xml/xlsx'\r\n\r\n// Example of a `<c/>`ell element:\r\n//\r\n// <c>\r\n// <f>string</f> — formula.\r\n// <v>string</v> — formula pre-computed value.\r\n// <is>\r\n// <t>string</t> — an `inlineStr` string (rather than a \"common string\" from a dictionary).\r\n// <r>\r\n// <rPr>\r\n// ...\r\n// </rPr>\r\n// <t>string</t>\r\n// </r>\r\n// <rPh sb=\"1\" eb=\"1\">\r\n// <t>string</t>\r\n// </rPh>\r\n// <phoneticPr fontId=\"1\"/>\r\n// </is>\r\n// <extLst>\r\n// <ext>\r\n// <!--any element-->\r\n// </ext>\r\n// </extLst>\r\n// </c>\r\n//\r\nexport default function parseCell(node, sheet, xml, values, styles, properties, options) {\r\n const coords = parseCellCoordinates(node.getAttribute('r'))\r\n\r\n const valueElement = getCellValue(sheet, node)\r\n\r\n // For `xpath`, `value` can be `undefined` while for native `DOMParser` it's `null`.\r\n // So using `value && ...` instead of `if (value !== undefined) { ... }` here\r\n // for uniform compatibility with both `xpath` and native `DOMParser`.\r\n let value = valueElement && valueElement.textContent\r\n\r\n let type\r\n if (node.hasAttribute('t')) {\r\n type = node.getAttribute('t')\r\n }\r\n\r\n return {\r\n row: coords[0],\r\n column: coords[1],\r\n value: parseCellValue(value, type, {\r\n getInlineStringValue: () => getCellInlineStringValue(sheet, node),\r\n getStyleId: () => node.getAttribute('s'),\r\n styles,\r\n values,\r\n properties,\r\n options\r\n })\r\n }\r\n}"],"file":"parseCell.js"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = getCellValue;
7
+
8
+ var _parseDate = _interopRequireDefault(require("./parseDate"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
11
+
12
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+
14
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+
16
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
17
+
18
+ // https://hexdocs.pm/xlsxir/number_styles.html
19
+ var BUILT_IN_DATE_NUMBER_FORMAT_IDS = [14, 15, 16, 17, 18, 19, 20, 21, 22, 27, 30, 36, 45, 46, 47, 50, 57];
20
+
21
+ function getCellValue(value, type, _ref) {
22
+ var getInlineStringValue = _ref.getInlineStringValue,
23
+ getStyleId = _ref.getStyleId,
24
+ styles = _ref.styles,
25
+ values = _ref.values,
26
+ properties = _ref.properties,
27
+ options = _ref.options;
28
+
29
+ if (!type) {
30
+ // Default cell type is "n" (numeric).
31
+ // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html
32
+ type = 'n';
33
+ } // Available Excel cell types:
34
+ // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md
35
+ //
36
+ // Some other document (seems to be old):
37
+ // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html
38
+ //
39
+
40
+
41
+ switch (type) {
42
+ // If the cell contains formula string.
43
+ case 'str':
44
+ value = value.trim();
45
+
46
+ if (value === '') {
47
+ value = undefined;
48
+ }
49
+
50
+ break;
51
+ // If the cell contains an "inline" (not "shared") string.
52
+
53
+ case 'inlineStr':
54
+ value = getInlineStringValue();
55
+
56
+ if (value === undefined) {
57
+ throw new Error("Unsupported \"inline string\" cell value structure"); // : ${cellNode.textContent}`)
58
+ }
59
+
60
+ value = value.trim();
61
+
62
+ if (value === '') {
63
+ value = undefined;
64
+ }
65
+
66
+ break;
67
+ // If the cell contains a "shared" string.
68
+ // "Shared" strings is a way for an Excel editor to reduce
69
+ // the file size by storing "commonly used" strings in a dictionary
70
+ // and then referring to such strings by their index in that dictionary.
71
+
72
+ case 's':
73
+ // If a cell has no value then there's no `<c/>` element for it.
74
+ // If a `<c/>` element exists then it's not empty.
75
+ // The `<v/>`alue is a key in the "shared strings" dictionary of the
76
+ // XLSX file, so look it up in the `values` dictionary by the numeric key.
77
+ value = values[parseInt(value)];
78
+ value = value.trim();
79
+
80
+ if (value === '') {
81
+ value = undefined;
82
+ }
83
+
84
+ break;
85
+
86
+ case 'b':
87
+ value = value === '1' ? true : false;
88
+ break;
89
+ // Stub: blank stub cell that is ignored by data processing utilities.
90
+
91
+ case 'z':
92
+ value = undefined;
93
+ break;
94
+ // Error: `value` is a numeric code.
95
+ // They also wrote: "and `w` property stores its common name".
96
+ // It's unclear what they meant by that.
97
+
98
+ case 'e':
99
+ value = decodeError(value);
100
+ break;
101
+ // Date: a string to be parsed as a date.
102
+ // (usually a string in "ISO 8601" format)
103
+
104
+ case 'd':
105
+ if (value === undefined) {
106
+ break;
107
+ }
108
+
109
+ value = new Date(value);
110
+ break;
111
+
112
+ case 'n':
113
+ if (value === undefined) {
114
+ break;
115
+ }
116
+
117
+ value = parseFloat(value); // XLSX does have "d" type for dates, but it's not commonly used.
118
+ // specific format for dates.
119
+ // Sometimes a date can be heuristically detected.
120
+ // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777
121
+ //
122
+ // Format IDs:
123
+ // https://xlsxwriter.readthedocs.io/format.html#format-set-num-format
124
+ //
125
+
126
+ var styleId = getStyleId();
127
+
128
+ if (styleId) {
129
+ // styleId = parseInt(styleId)
130
+ var style = styles[styleId];
131
+
132
+ if (!style) {
133
+ throw new Error("Cell style not found: ".concat(styleId));
134
+ }
135
+
136
+ if (BUILT_IN_DATE_NUMBER_FORMAT_IDS.indexOf(parseInt(style.numberFormat.id)) >= 0 || options.dateFormat && style.numberFormat.template === options.dateFormat || options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template)) {
137
+ value = (0, _parseDate["default"])(value, properties);
138
+ }
139
+ }
140
+
141
+ break;
142
+
143
+ default:
144
+ throw new TypeError("Cell type not supported: ".concat(type));
145
+ } // Convert empty values to `null`.
146
+
147
+
148
+ if (value === undefined) {
149
+ value = null;
150
+ }
151
+
152
+ return value;
153
+ } // Decodes numeric error code to a string code.
154
+ // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md
155
+
156
+
157
+ function decodeError(errorCode) {
158
+ // While the error values are determined by the application,
159
+ // the following are some example error values that could be used:
160
+ switch (errorCode) {
161
+ case 0x00:
162
+ return '#NULL!';
163
+
164
+ case 0x07:
165
+ return '#DIV/0!';
166
+
167
+ case 0x0F:
168
+ return '#VALUE!';
169
+
170
+ case 0x17:
171
+ return '#REF!';
172
+
173
+ case 0x1D:
174
+ return '#NAME?';
175
+
176
+ case 0x24:
177
+ return '#NUM!';
178
+
179
+ case 0x2A:
180
+ return '#N/A';
181
+
182
+ case 0x2B:
183
+ return '#GETTING_DATA';
184
+
185
+ default:
186
+ // Such error code doesn't exist. I made it up.
187
+ return "#ERROR_".concat(errorCode);
188
+ }
189
+ }
190
+
191
+ function isDateTemplate(template) {
192
+ var tokens = template.split(/\W+/);
193
+
194
+ for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
195
+ var token = _step.value;
196
+
197
+ if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {
198
+ return false;
199
+ }
200
+ }
201
+
202
+ return true;
203
+ }
204
+ //# sourceMappingURL=parseCellValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../source/read/parseCellValue.js"],"names":["BUILT_IN_DATE_NUMBER_FORMAT_IDS","getCellValue","value","type","getInlineStringValue","getStyleId","styles","values","properties","options","trim","undefined","Error","parseInt","decodeError","Date","parseFloat","styleId","style","indexOf","numberFormat","id","dateFormat","template","smartDateParser","isDateTemplate","TypeError","errorCode","tokens","split","token"],"mappings":"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","sourcesContent":["import parseDate from './parseDate'\r\n\r\n// https://hexdocs.pm/xlsxir/number_styles.html\r\nconst BUILT_IN_DATE_NUMBER_FORMAT_IDS = [14,15,16,17,18,19,20,21,22,27,30,36,45,46,47,50,57]\r\n\r\nexport default function getCellValue(value, type, {\r\n\tgetInlineStringValue,\r\n\tgetStyleId,\r\n\tstyles,\r\n\tvalues,\r\n\tproperties,\r\n\toptions\r\n}) {\r\n if (!type) {\r\n // Default cell type is \"n\" (numeric).\r\n // http://www.datypic.com/sc/ooxml/t-ssml_CT_Cell.html\r\n type = 'n'\r\n }\r\n\r\n // Available Excel cell types:\r\n // https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\n //\r\n // Some other document (seems to be old):\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/ST_CellType.html\r\n //\r\n switch (type) {\r\n // If the cell contains formula string.\r\n case 'str':\r\n value = value.trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n // If the cell contains an \"inline\" (not \"shared\") string.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure`) // : ${cellNode.textContent}`)\r\n }\r\n value = value.trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n // If the cell contains a \"shared\" string.\r\n // \"Shared\" strings is a way for an Excel editor to reduce\r\n // the file size by storing \"commonly used\" strings in a dictionary\r\n // and then referring to such strings by their index in that dictionary.\r\n case 's':\r\n // If a cell has no value then there's no `<c/>` element for it.\r\n // If a `<c/>` element exists then it's not empty.\r\n // The `<v/>`alue is a key in the \"shared strings\" dictionary of the\r\n // XLSX file, so look it up in the `values` dictionary by the numeric key.\r\n value = values[parseInt(value)]\r\n value = value.trim()\r\n if (value === '') {\r\n value = undefined\r\n }\r\n break\r\n\r\n case 'b':\r\n value = value === '1' ? true : false\r\n break\r\n\r\n // Stub: blank stub cell that is ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // Error: `value` is a numeric code.\r\n // They also wrote: \"and `w` property stores its common name\".\r\n // It's unclear what they meant by that.\r\n case 'e':\r\n value = decodeError(value)\r\n break\r\n\r\n // Date: a string to be parsed as a date.\r\n // (usually a string in \"ISO 8601\" format)\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n value = new Date(value)\r\n break\r\n\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n value = parseFloat(value)\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // specific format for dates.\r\n // Sometimes a date can be heuristically detected.\r\n // https://github.com/catamphetamine/read-excel-file/issues/3#issuecomment-395770777\r\n //\r\n // Format IDs:\r\n // https://xlsxwriter.readthedocs.io/format.html#format-set-num-format\r\n //\r\n const styleId = getStyleId()\r\n if (styleId) {\r\n // styleId = parseInt(styleId)\r\n const style = styles[styleId]\r\n if (!style) {\r\n throw new Error(`Cell style not found: ${styleId}`)\r\n }\r\n if (BUILT_IN_DATE_NUMBER_FORMAT_IDS.indexOf(parseInt(style.numberFormat.id)) >= 0 ||\r\n (options.dateFormat && style.numberFormat.template === options.dateFormat) ||\r\n (options.smartDateParser !== false && style.numberFormat.template && isDateTemplate(style.numberFormat.template))) {\r\n value = parseDate(value, properties)\r\n }\r\n }\r\n break\r\n\r\n default:\r\n throw new TypeError(`Cell type not supported: ${type}`)\r\n }\r\n\r\n // Convert empty values to `null`.\r\n if (value === undefined) {\r\n value = null\r\n }\r\n\r\n return value\r\n}\r\n\r\n// Decodes numeric error code to a string code.\r\n// https://github.com/SheetJS/sheetjs/blob/19620da30be2a7d7b9801938a0b9b1fd3c4c4b00/docbits/52_datatype.md\r\nfunction decodeError(errorCode) {\r\n // While the error values are determined by the application,\r\n // the following are some example error values that could be used:\r\n switch (errorCode) {\r\n case 0x00:\r\n return '#NULL!'\r\n case 0x07:\r\n return '#DIV/0!'\r\n case 0x0F:\r\n return '#VALUE!'\r\n case 0x17:\r\n return '#REF!'\r\n case 0x1D:\r\n return '#NAME?'\r\n case 0x24:\r\n return '#NUM!'\r\n case 0x2A:\r\n return '#N/A'\r\n case 0x2B:\r\n return '#GETTING_DATA'\r\n default:\r\n // Such error code doesn't exist. I made it up.\r\n return `#ERROR_${errorCode}`\r\n }\r\n}\r\n\r\nfunction isDateTemplate(template) {\r\n const tokens = template.split(/\\W+/)\r\n for (const token of tokens) {\r\n if (['MM', 'DD', 'YY', 'YYYY'].indexOf(token) < 0) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n"],"file":"parseCellValue.js"}