read-excel-file 9.2.0 → 9.3.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 (205) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +5 -0
  3. package/README.md +153 -50
  4. package/bundle/read-excel-file.min.js +1 -1
  5. package/bundle/read-excel-file.min.js.map +1 -1
  6. package/bundle/read-excel-file.min.old.js +2 -0
  7. package/bundle/read-excel-file.min.old.js.map +1 -0
  8. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js +3 -0
  9. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
  10. package/commonjs/export/parseSheet.js +12 -9
  11. package/commonjs/export/parseSheet.js.map +1 -1
  12. package/commonjs/export/readSheetBrowser.js +6 -2
  13. package/commonjs/export/readSheetBrowser.js.map +1 -1
  14. package/commonjs/export/readSheetNode.js +6 -2
  15. package/commonjs/export/readSheetNode.js.map +1 -1
  16. package/commonjs/export/readSheetUniversal.js +14 -2
  17. package/commonjs/export/readSheetUniversal.js.map +1 -1
  18. package/commonjs/export/readSheetWebWorker.js +12 -2
  19. package/commonjs/export/readSheetWebWorker.js.map +1 -1
  20. package/commonjs/export/readXlsxFileBrowser.js +6 -2
  21. package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
  22. package/commonjs/export/readXlsxFileNode.js +6 -2
  23. package/commonjs/export/readXlsxFileNode.js.map +1 -1
  24. package/commonjs/export/readXlsxFileUniversal.js +14 -2
  25. package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
  26. package/commonjs/export/readXlsxFileWebWorker.js +12 -2
  27. package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
  28. package/commonjs/export/unpackXlsxFileBrowser.js +29 -6
  29. package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
  30. package/commonjs/export/unpackXlsxFileNode.js +6 -0
  31. package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
  32. package/commonjs/export/unpackXlsxFileUniversal.js +6 -0
  33. package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
  34. package/commonjs/export/unpackXlsxFileWebWorker.js +14 -0
  35. package/commonjs/export/unpackXlsxFileWebWorker.js.map +1 -0
  36. package/commonjs/parseSheetData/parseSheetData.js +6 -6
  37. package/commonjs/parseSheetData/parseSheetData.js.map +1 -1
  38. package/commonjs/utility/checkpoint.js +33 -0
  39. package/commonjs/utility/checkpoint.js.map +1 -0
  40. package/commonjs/utility/isObject.js +15 -0
  41. package/commonjs/utility/isObject.js.map +1 -0
  42. package/commonjs/utility/isPromise.js +18 -0
  43. package/commonjs/utility/isPromise.js.map +1 -0
  44. package/commonjs/xlsx/convertCellsToData2dArray.js +0 -3
  45. package/commonjs/xlsx/convertCellsToData2dArray.js.map +1 -1
  46. package/commonjs/xlsx/isDateFormatStyle.js +2 -2
  47. package/commonjs/xlsx/isDateFormatStyle.js.map +1 -1
  48. package/commonjs/xlsx/parseCell.js +89 -24
  49. package/commonjs/xlsx/parseCell.js.map +1 -1
  50. package/{modules/xlsx/parseCellCoordinates.js → commonjs/xlsx/parseCellAddress.js} +18 -7
  51. package/commonjs/xlsx/parseCellAddress.js.map +1 -0
  52. package/commonjs/xlsx/parseCellValue.js +7 -23
  53. package/commonjs/xlsx/parseCellValue.js.map +1 -1
  54. package/commonjs/xlsx/parseFilePaths.js +31 -32
  55. package/commonjs/xlsx/parseFilePaths.js.map +1 -1
  56. package/commonjs/xlsx/parseNumber.js +20 -0
  57. package/commonjs/xlsx/parseNumber.js.map +1 -0
  58. package/commonjs/xlsx/parseSharedString.js +64 -0
  59. package/commonjs/xlsx/parseSharedString.js.map +1 -0
  60. package/commonjs/xlsx/parseSharedStrings.js +45 -5
  61. package/commonjs/xlsx/parseSharedStrings.js.map +1 -1
  62. package/commonjs/xlsx/parseSheet.js +93 -9
  63. package/commonjs/xlsx/parseSheet.js.map +1 -1
  64. package/commonjs/xlsx/parseSheetData.js +68 -0
  65. package/commonjs/xlsx/parseSheetData.js.map +1 -0
  66. package/commonjs/xlsx/parseSpreadsheetContents.js +244 -43
  67. package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -1
  68. package/commonjs/xlsx/parseSpreadsheetInfo.js +67 -36
  69. package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -1
  70. package/commonjs/xlsx/parseStyles.js +89 -36
  71. package/commonjs/xlsx/parseStyles.js.map +1 -1
  72. package/commonjs/xml/dom.js +2 -1
  73. package/commonjs/xml/dom.js.map +1 -1
  74. package/commonjs/xml/parseXmlStream.js +14 -0
  75. package/commonjs/xml/parseXmlStream.js.map +1 -0
  76. package/commonjs/xml/parseXmlStream.sax.js +109 -0
  77. package/commonjs/xml/parseXmlStream.sax.js.map +1 -0
  78. package/commonjs/xml/parseXmlStream.saxen.code.js +953 -0
  79. package/commonjs/xml/parseXmlStream.saxen.code.js.map +1 -0
  80. package/commonjs/xml/parseXmlStream.saxen.js +85 -0
  81. package/commonjs/xml/parseXmlStream.saxen.js.map +1 -0
  82. package/commonjs/xml/xlsx.js +75 -40
  83. package/commonjs/xml/xlsx.js.map +1 -1
  84. package/commonjs/zip/unzipFromArrayBuffer.js +5 -14
  85. package/commonjs/zip/unzipFromArrayBuffer.js.map +1 -1
  86. package/commonjs/zip/unzipFromStream.fflate.js +154 -25
  87. package/commonjs/zip/unzipFromStream.fflate.js.map +1 -1
  88. package/commonjs/zip/unzipFromStream.js.map +1 -1
  89. package/commonjs/zip/unzipFromStream.unzipper.js +37 -26
  90. package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -1
  91. package/modules/export/convertValuesFromUint8ArraysToStrings.js +2 -0
  92. package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
  93. package/modules/export/parseSheet.js +12 -9
  94. package/modules/export/parseSheet.js.map +1 -1
  95. package/modules/export/readSheetBrowser.js +5 -2
  96. package/modules/export/readSheetBrowser.js.map +1 -1
  97. package/modules/export/readSheetNode.js +5 -2
  98. package/modules/export/readSheetNode.js.map +1 -1
  99. package/modules/export/readSheetUniversal.js +14 -2
  100. package/modules/export/readSheetUniversal.js.map +1 -1
  101. package/modules/export/readSheetWebWorker.js +12 -2
  102. package/modules/export/readSheetWebWorker.js.map +1 -1
  103. package/modules/export/readXlsxFileBrowser.js +5 -2
  104. package/modules/export/readXlsxFileBrowser.js.map +1 -1
  105. package/modules/export/readXlsxFileNode.js +5 -2
  106. package/modules/export/readXlsxFileNode.js.map +1 -1
  107. package/modules/export/readXlsxFileUniversal.js +14 -2
  108. package/modules/export/readXlsxFileUniversal.js.map +1 -1
  109. package/modules/export/readXlsxFileWebWorker.js +12 -2
  110. package/modules/export/readXlsxFileWebWorker.js.map +1 -1
  111. package/modules/export/unpackXlsxFileBrowser.js +26 -6
  112. package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
  113. package/modules/export/unpackXlsxFileNode.js +3 -0
  114. package/modules/export/unpackXlsxFileNode.js.map +1 -1
  115. package/modules/export/unpackXlsxFileUniversal.js +3 -0
  116. package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
  117. package/modules/export/unpackXlsxFileWebWorker.js +6 -0
  118. package/modules/export/unpackXlsxFileWebWorker.js.map +1 -0
  119. package/modules/parseSheetData/parseSheetData.js +4 -4
  120. package/modules/parseSheetData/parseSheetData.js.map +1 -1
  121. package/modules/utility/checkpoint.js +25 -0
  122. package/modules/utility/checkpoint.js.map +1 -0
  123. package/modules/utility/isObject.js +9 -0
  124. package/modules/utility/isObject.js.map +1 -0
  125. package/modules/utility/isPromise.js +12 -0
  126. package/modules/utility/isPromise.js.map +1 -0
  127. package/modules/xlsx/convertCellsToData2dArray.js +0 -3
  128. package/modules/xlsx/convertCellsToData2dArray.js.map +1 -1
  129. package/modules/xlsx/isDateFormatStyle.js +2 -2
  130. package/modules/xlsx/isDateFormatStyle.js.map +1 -1
  131. package/modules/xlsx/parseCell.js +85 -24
  132. package/modules/xlsx/parseCell.js.map +1 -1
  133. package/{commonjs/xlsx/parseCellCoordinates.js → modules/xlsx/parseCellAddress.js} +12 -13
  134. package/modules/xlsx/parseCellAddress.js.map +1 -0
  135. package/modules/xlsx/parseCellValue.js +7 -23
  136. package/modules/xlsx/parseCellValue.js.map +1 -1
  137. package/modules/xlsx/parseFilePaths.js +31 -33
  138. package/modules/xlsx/parseFilePaths.js.map +1 -1
  139. package/modules/xlsx/parseNumber.js +14 -0
  140. package/modules/xlsx/parseNumber.js.map +1 -0
  141. package/modules/xlsx/parseSharedString.js +55 -0
  142. package/modules/xlsx/parseSharedString.js.map +1 -0
  143. package/modules/xlsx/parseSharedStrings.js +46 -5
  144. package/modules/xlsx/parseSharedStrings.js.map +1 -1
  145. package/modules/xlsx/parseSheet.js +91 -9
  146. package/modules/xlsx/parseSheet.js.map +1 -1
  147. package/modules/xlsx/parseSheetData.js +55 -0
  148. package/modules/xlsx/parseSheetData.js.map +1 -0
  149. package/modules/xlsx/parseSpreadsheetContents.js +242 -43
  150. package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
  151. package/modules/xlsx/parseSpreadsheetInfo.js +67 -37
  152. package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
  153. package/modules/xlsx/parseStyles.js +88 -36
  154. package/modules/xlsx/parseStyles.js.map +1 -1
  155. package/modules/xml/dom.js +2 -1
  156. package/modules/xml/dom.js.map +1 -1
  157. package/modules/xml/parseXmlStream.js +18 -0
  158. package/modules/xml/parseXmlStream.js.map +1 -0
  159. package/modules/xml/parseXmlStream.sax.js +103 -0
  160. package/modules/xml/parseXmlStream.sax.js.map +1 -0
  161. package/modules/xml/parseXmlStream.saxen.code.js +947 -0
  162. package/modules/xml/parseXmlStream.saxen.code.js.map +1 -0
  163. package/modules/xml/parseXmlStream.saxen.js +79 -0
  164. package/modules/xml/parseXmlStream.saxen.js.map +1 -0
  165. package/modules/xml/xlsx.js +72 -36
  166. package/modules/xml/xlsx.js.map +1 -1
  167. package/modules/zip/unzipFromArrayBuffer.js +5 -14
  168. package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
  169. package/modules/zip/unzipFromStream.fflate.js +157 -24
  170. package/modules/zip/unzipFromStream.fflate.js.map +1 -1
  171. package/modules/zip/unzipFromStream.js +56 -2
  172. package/modules/zip/unzipFromStream.js.map +1 -1
  173. package/modules/zip/unzipFromStream.unzipper.js +38 -26
  174. package/modules/zip/unzipFromStream.unzipper.js.map +1 -1
  175. package/package.json +4 -6
  176. package/commonjs/xlsx/parseCellCoordinates.js.map +0 -1
  177. package/commonjs/xlsx/parseCells.js +0 -34
  178. package/commonjs/xlsx/parseCells.js.map +0 -1
  179. package/commonjs/xlsx/parseSheetDimensions.js +0 -43
  180. package/commonjs/xlsx/parseSheetDimensions.js.map +0 -1
  181. package/commonjs/xml/xml.js +0 -13
  182. package/commonjs/xml/xml.js.map +0 -1
  183. package/commonjs/xml/xmlBrowser.js +0 -17
  184. package/commonjs/xml/xmlBrowser.js.map +0 -1
  185. package/commonjs/xml/xpath/xlsx-xpath.js +0 -92
  186. package/commonjs/xml/xpath/xlsx-xpath.js.map +0 -1
  187. package/commonjs/xml/xpath/xpathBrowser.js +0 -33
  188. package/commonjs/xml/xpath/xpathBrowser.js.map +0 -1
  189. package/commonjs/xml/xpath/xpathNode.js +0 -16
  190. package/commonjs/xml/xpath/xpathNode.js.map +0 -1
  191. package/modules/xlsx/parseCellCoordinates.js.map +0 -1
  192. package/modules/xlsx/parseCells.js +0 -27
  193. package/modules/xlsx/parseCells.js.map +0 -1
  194. package/modules/xlsx/parseSheetDimensions.js +0 -37
  195. package/modules/xlsx/parseSheetDimensions.js.map +0 -1
  196. package/modules/xml/xml.js +0 -7
  197. package/modules/xml/xml.js.map +0 -1
  198. package/modules/xml/xmlBrowser.js +0 -11
  199. package/modules/xml/xmlBrowser.js.map +0 -1
  200. package/modules/xml/xpath/xlsx-xpath.js +0 -73
  201. package/modules/xml/xpath/xlsx-xpath.js.map +0 -1
  202. package/modules/xml/xpath/xpathBrowser.js +0 -27
  203. package/modules/xml/xpath/xpathBrowser.js.map +0 -1
  204. package/modules/xml/xpath/xpathNode.js +0 -9
  205. package/modules/xml/xpath/xpathNode.js.map +0 -1
@@ -1,32 +1,31 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports["default"] = parseCellCoordinates;
7
1
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
2
  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."); }
9
3
  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); }
10
4
  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; }
11
5
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
- function parseCellCoordinates(coordinatesString) {
7
+ /**
8
+ * Parses XLSX cell address into a row number and a column number.
9
+ * @param {string} coordinatesString
10
+ * @returns {number[]} Returns `[rowNumber, columnNumber]`
11
+ */
12
+ export default function parseCellAddress(coordinatesString) {
14
13
  // Coordinate examples: "AA2091", "R988", "B1".
15
14
  var _coordinatesString$sp = coordinatesString.split(/(\d+)/),
16
15
  _coordinatesString$sp2 = _slicedToArray(_coordinatesString$sp, 2),
17
16
  column = _coordinatesString$sp2[0],
18
17
  row = _coordinatesString$sp2[1];
19
18
  return [
20
- // Row.
19
+ // Row number (starting at `1`).
21
20
  Number(row),
22
- // Column.
23
- // It's not clear why would `column` ever be non-trimmed,
24
- // but if it was added here then perhaps it could hypothetically happen, or smth.
21
+ // Column number (starting at `1`).
22
+ // It's not clear if the `column` part could ever be non-trimmed,
23
+ // but this `.trim()` call was already here when I copied this code from somewhere.
25
24
  getColumnNumberFromColumnLetters(column.trim())];
26
25
  }
27
26
 
28
27
  // Maps "A1"-like coordinates to `{ row, column }` numeric coordinates.
29
- 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"];
28
+ 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'];
30
29
 
31
30
  // Converts a letter coordinate to a digit coordinate.
32
31
  // Examples: "A" -> 1, "B" -> 2, "Z" -> 26, "AA" -> 27, etc.
@@ -41,4 +40,4 @@ function getColumnNumberFromColumnLetters(columnLetters) {
41
40
  }
42
41
  return n;
43
42
  }
44
- //# sourceMappingURL=parseCellCoordinates.js.map
43
+ //# sourceMappingURL=parseCellAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCellAddress.js","names":["parseCellAddress","coordinatesString","_coordinatesString$sp","split","_coordinatesString$sp2","_slicedToArray","column","row","Number","getColumnNumberFromColumnLetters","trim","LETTERS","columnLetters","n","i","length","indexOf"],"sources":["../../source/xlsx/parseCellAddress.js"],"sourcesContent":["/**\r\n * Parses XLSX cell address into a row number and a column number.\r\n * @param {string} coordinatesString\r\n * @returns {number[]} Returns `[rowNumber, columnNumber]`\r\n */\r\nexport default function parseCellAddress(coordinatesString) {\r\n // Coordinate examples: \"AA2091\", \"R988\", \"B1\".\r\n const [column, row] = coordinatesString.split(/(\\d+)/)\r\n return [\r\n // Row number (starting at `1`).\r\n Number(row),\r\n // Column number (starting at `1`).\r\n\t\t// It's not clear if the `column` part could ever be non-trimmed,\r\n\t\t// but this `.trim()` call was already here when I copied this code from somewhere.\r\n getColumnNumberFromColumnLetters(column.trim())\r\n ]\r\n}\r\n\r\n// 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\n// Converts a letter coordinate to a digit coordinate.\r\n// Examples: \"A\" -> 1, \"B\" -> 2, \"Z\" -> 26, \"AA\" -> 27, etc.\r\nfunction getColumnNumberFromColumnLetters(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"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,gBAAgBA,CAACC,iBAAiB,EAAE;EAC1D;EACA,IAAAC,qBAAA,GAAsBD,iBAAiB,CAACE,KAAK,CAAC,OAAO,CAAC;IAAAC,sBAAA,GAAAC,cAAA,CAAAH,qBAAA;IAA/CI,MAAM,GAAAF,sBAAA;IAAEG,GAAG,GAAAH,sBAAA;EAClB,OAAO;EACL;EACAI,MAAM,CAACD,GAAG,CAAC;EACX;EACF;EACA;EACEE,gCAAgC,CAACH,MAAM,CAACI,IAAI,CAAC,CAAC,CAAC,CAChD;AACH;;AAEA;AACA,IAAMC,OAAO,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;AAEtJ;AACA;AACA,SAASF,gCAAgCA,CAACG,aAAa,EAAE;EACvD;EACA,IAAIC,CAAC,GAAG,CAAC;EACT,IAAIC,CAAC,GAAG,CAAC;EACT,OAAOA,CAAC,GAAGF,aAAa,CAACG,MAAM,EAAE;IAC/BF,CAAC,IAAI,EAAE;IACPA,CAAC,IAAIF,OAAO,CAACK,OAAO,CAACJ,aAAa,CAACE,CAAC,CAAC,CAAC;IACtCA,CAAC,EAAE;EACL;EACA,OAAOD,CAAC;AACV"}
@@ -1,11 +1,11 @@
1
1
  import parseExcelDate from './parseExcelDate.js';
2
+ import parseNumber from './parseNumber.js';
2
3
  import isDateFormatStyle from './isDateFormatStyle.js';
3
4
 
4
5
  // Parses a string `value` of a cell.
5
6
  export default function parseCellValue(value, type, _ref) {
6
- var getInlineStringValue = _ref.getInlineStringValue,
7
- getInlineStringXml = _ref.getInlineStringXml,
8
- getStyleId = _ref.getStyleId,
7
+ var inlineString = _ref.inlineString,
8
+ styleId = _ref.styleId,
9
9
  styles = _ref.styles,
10
10
  sharedStrings = _ref.sharedStrings,
11
11
  epoch1904 = _ref.epoch1904,
@@ -35,9 +35,9 @@ export default function parseCellValue(value, type, _ref) {
35
35
  // Perhaps the specification doesn't force it to use one or another.
36
36
  // Example: `<sheetData><row r="1"><c r="A1" s="1" t="inlineStr"><is><t>Test 123</t></is></c></row></sheetData>`.
37
37
  case 'inlineStr':
38
- value = getInlineStringValue();
38
+ value = inlineString;
39
39
  if (value === undefined) {
40
- throw new Error("Unsupported \"inline string\" cell value structure: ".concat(getInlineStringXml()));
40
+ throw new Error('Couldn\'t read "inline string" cell value');
41
41
  }
42
42
  value = parseString(value, options);
43
43
  break;
@@ -112,10 +112,9 @@ export default function parseCellValue(value, type, _ref) {
112
112
  }
113
113
  // XLSX does have "d" type for dates, but it's not commonly used.
114
114
  // Instead, it prefers using "n" type for storing dates as timestamps.
115
- var styleId = getStyleId();
116
115
  if (styleId && isDateFormatStyle(styleId, styles, options)) {
117
116
  // Parse the number from string.
118
- value = parseNumberDefault(value);
117
+ value = parseNumber(value);
119
118
  // Parse the number as a date timestamp.
120
119
  value = parseExcelDate(value, {
121
120
  epoch1904: epoch1904
@@ -124,8 +123,7 @@ export default function parseCellValue(value, type, _ref) {
124
123
  // Parse the number from string.
125
124
  // Supports custom parsing function to work around javascript number encoding precision issues.
126
125
  // https://gitlab.com/catamphetamine/read-excel-file/-/issues/85
127
- var parseNumber = options.parseNumber || parseNumberDefault;
128
- value = parseNumber(value);
126
+ value = (options.parseNumber || parseNumber)(value);
129
127
  }
130
128
  break;
131
129
  default:
@@ -179,18 +177,4 @@ function parseString(value, options) {
179
177
  }
180
178
  return value;
181
179
  }
182
-
183
- // Parses a number from string.
184
- // Throws an error if the number couldn't be parsed.
185
- // When parsing floating-point number, is affected by
186
- // the javascript number encoding precision issues:
187
- // https://www.youtube.com/watch?v=2gIxbTn7GSc
188
- // https://www.avioconsulting.com/blog/overcoming-javascript-numeric-precision-issues
189
- function parseNumberDefault(stringifiedNumber) {
190
- var parsedNumber = Number(stringifiedNumber);
191
- if (isNaN(parsedNumber)) {
192
- throw new Error("Invalid \"numeric\" cell value: ".concat(stringifiedNumber));
193
- }
194
- return parsedNumber;
195
- }
196
180
  //# sourceMappingURL=parseCellValue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseCellValue.js","names":["parseExcelDate","isDateFormatStyle","parseCellValue","value","type","_ref","getInlineStringValue","getInlineStringXml","getStyleId","styles","sharedStrings","epoch1904","options","parseString","undefined","Error","concat","sharedStringIndex","Number","isNaN","length","decodeError","parsedDate","Date","valueOf","styleId","parseNumberDefault","parseNumber","TypeError","errorCode","trim","stringifiedNumber","parsedNumber"],"sources":["../../source/xlsx/parseCellValue.js"],"sourcesContent":["import parseExcelDate from './parseExcelDate.js'\r\nimport isDateFormatStyle from './isDateFormatStyle.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n getInlineStringValue,\r\n getInlineStringXml,\r\n getStyleId,\r\n styles,\r\n sharedStrings,\r\n epoch1904,\r\n options\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 // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = getInlineStringValue()\r\n if (value === undefined) {\r\n throw new Error(`Unsupported \"inline string\" cell value structure: ${getInlineStringXml()}`)\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\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 // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\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 `sharedStrings` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= sharedStrings.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = sharedStrings[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\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 // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate.valueOf())) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n const styleId = getStyleId()\r\n if (styleId && isDateFormatStyle(styleId, styles, options)) {\r\n // Parse the number from string.\r\n value = parseNumberDefault(value)\r\n // Parse the number as a date timestamp.\r\n value = parseExcelDate(value, { epoch1904 })\r\n } else {\r\n // Parse the number from string.\r\n // Supports custom parsing function to work around javascript number encoding precision issues.\r\n // https://gitlab.com/catamphetamine/read-excel-file/-/issues/85\r\n const parseNumber = options.parseNumber || parseNumberDefault\r\n value = parseNumber(value)\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 parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}\r\n\r\n// Parses a number from string.\r\n// Throws an error if the number couldn't be parsed.\r\n// When parsing floating-point number, is affected by\r\n// the javascript number encoding precision issues:\r\n// https://www.youtube.com/watch?v=2gIxbTn7GSc\r\n// https://www.avioconsulting.com/blog/overcoming-javascript-numeric-precision-issues\r\nfunction parseNumberDefault(stringifiedNumber) {\r\n const parsedNumber = Number(stringifiedNumber)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Invalid \"numeric\" cell value: ${stringifiedNumber}`)\r\n }\r\n return parsedNumber\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"parseCellValue.js","names":["parseExcelDate","parseNumber","isDateFormatStyle","parseCellValue","value","type","_ref","inlineString","styleId","styles","sharedStrings","epoch1904","options","parseString","undefined","Error","sharedStringIndex","Number","isNaN","concat","length","decodeError","parsedDate","Date","valueOf","TypeError","errorCode","trim"],"sources":["../../source/xlsx/parseCellValue.js"],"sourcesContent":["import parseExcelDate from './parseExcelDate.js'\r\nimport parseNumber from './parseNumber.js'\r\nimport isDateFormatStyle from './isDateFormatStyle.js'\r\n\r\n// Parses a string `value` of a cell.\r\nexport default function parseCellValue(value, type, {\r\n inlineString,\r\n styleId,\r\n styles,\r\n sharedStrings,\r\n epoch1904,\r\n options\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 // XLSX tends to store all strings as \"shared\" (indexed) ones\r\n // using \"s\" cell type (for saving on strage space).\r\n // \"str\" cell type is then generally only used for storing\r\n // formula-pre-calculated cell values.\r\n case 'str':\r\n value = parseString(value, options)\r\n break\r\n\r\n // Sometimes, XLSX stores strings as \"inline\" strings rather than \"shared\" (indexed) ones.\r\n // Perhaps the specification doesn't force it to use one or another.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"inlineStr\"><is><t>Test 123</t></is></c></row></sheetData>`.\r\n case 'inlineStr':\r\n value = inlineString\r\n if (value === undefined) {\r\n throw new Error('Couldn\\'t read \"inline string\" cell value')\r\n }\r\n value = parseString(value, options)\r\n break\r\n\r\n // XLSX tends to store string values as \"shared\" (indexed) ones.\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 // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c></row></sheetData>`.\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 `sharedStrings` dictionary by the numeric key.\r\n const sharedStringIndex = Number(value)\r\n if (isNaN(sharedStringIndex)) {\r\n throw new Error(`Invalid \"shared\" string index: ${value}`)\r\n }\r\n if (sharedStringIndex >= sharedStrings.length) {\r\n throw new Error(`An out-of-bounds \"shared\" string index: ${value}`)\r\n }\r\n value = sharedStrings[sharedStringIndex]\r\n value = parseString(value, options)\r\n break\r\n\r\n // Boolean (TRUE/FALSE) values are stored as either \"1\" or \"0\"\r\n // in cells of type \"b\".\r\n case 'b':\r\n if (value === '1') {\r\n value = true\r\n } else if (value === '0') {\r\n value = false\r\n } else {\r\n throw new Error(`Unsupported \"boolean\" cell value: ${value}`)\r\n }\r\n break\r\n\r\n // XLSX specification seems to support cells of type \"z\":\r\n // blank \"stub\" cells that should be ignored by data processing utilities.\r\n case 'z':\r\n value = undefined\r\n break\r\n\r\n // XLSX specification also defines cells of type \"e\" containing a numeric \"error\" code.\r\n // It's not clear what that means though.\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 // XLSX supports date cells of type \"d\", though seems like it (almost?) never\r\n // uses it for storing dates, preferring \"n\" numeric timestamp cells instead.\r\n // The value of a \"d\" cell is supposedly a string in \"ISO 8601\" format.\r\n // I haven't seen an XLSX file having such cells.\r\n // Example: `<sheetData><row r=\"1\"><c r=\"A1\" s=\"1\" t=\"d\"><v>2021-06-10T00:47:45.700Z</v></c></row></sheetData>`.\r\n case 'd':\r\n if (value === undefined) {\r\n break\r\n }\r\n const parsedDate = new Date(value)\r\n if (isNaN(parsedDate.valueOf())) {\r\n throw new Error(`Unsupported \"date\" cell value: ${value}`)\r\n }\r\n value = parsedDate\r\n break\r\n\r\n // Numeric cells have type \"n\".\r\n case 'n':\r\n if (value === undefined) {\r\n break\r\n }\r\n // XLSX does have \"d\" type for dates, but it's not commonly used.\r\n // Instead, it prefers using \"n\" type for storing dates as timestamps.\r\n if (styleId && isDateFormatStyle(styleId, styles, options)) {\r\n // Parse the number from string.\r\n value = parseNumber(value)\r\n // Parse the number as a date timestamp.\r\n value = parseExcelDate(value, { epoch1904 })\r\n } else {\r\n // Parse the number from string.\r\n // Supports custom parsing function to work around javascript number encoding precision issues.\r\n // https://gitlab.com/catamphetamine/read-excel-file/-/issues/85\r\n value = (options.parseNumber || parseNumber)(value)\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 parseString(value, options) {\r\n // In some weird cases, a developer might want to disable\r\n // the automatic trimming of all strings.\r\n // For example, leading spaces might express a tree-like hierarchy.\r\n // https://github.com/catamphetamine/read-excel-file/pull/106#issuecomment-1136062917\r\n if (options.trim !== false) {\r\n value = value.trim()\r\n }\r\n if (value === '') {\r\n value = undefined\r\n }\r\n return value\r\n}"],"mappings":"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"}
@@ -1,15 +1,13 @@
1
- import { getRelationships } from '../xml/xlsx.js';
2
-
3
1
  /**
4
2
  * Returns sheet file paths.
5
3
  * Seems that the correct place to look for the `sheetId` -> `filename` mapping
6
4
  * is `xl/_rels/workbook.xml.rels` file.
7
5
  * https://github.com/tidyverse/readxl/issues/104
8
6
  * @param {string} content — `xl/_rels/workbook.xml.rels` file contents.
9
- * @param {object} xml
10
- * @return {object}
7
+ * @param {function} parseXmlStream — SAX XML parser.
8
+ * @return {object} — An object of shape `{ sheets: Record<string, string>, sharedStrings: string?, styles: string? }`
11
9
  */
12
- export default function parseFilePaths(content, xml) {
10
+ export default function parseFilePaths(content, parseXmlStream) {
13
11
  // Example:
14
12
  // <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
15
13
  // ...
@@ -18,39 +16,39 @@ export default function parseFilePaths(content, xml) {
18
16
  // Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"
19
17
  // Target="worksheets/sheet1.xml"/>
20
18
  // </Relationships>
21
- var document = xml.createDocument(content);
22
- var filePaths = {
19
+ return parseXmlStream(content, {
20
+ createInitialState: createInitialStateInWorkbookRelationships,
21
+ onOpenTag: onOpenTagInWorkbookRelationships
22
+ }).then(function (state) {
23
+ return state;
24
+ });
25
+ }
26
+ function createInitialStateInWorkbookRelationships() {
27
+ return {
23
28
  sheets: {},
24
29
  sharedStrings: undefined,
25
30
  styles: undefined
26
31
  };
27
- var addFilePathInfo = function addFilePathInfo(relationship) {
28
- var filePath = relationship.getAttribute('Target');
29
- var fileType = relationship.getAttribute('Type');
30
- switch (fileType) {
31
- case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':
32
- filePaths.styles = getFilePath(filePath);
33
- break;
34
- case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':
35
- filePaths.sharedStrings = getFilePath(filePath);
36
- break;
37
- case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':
38
- filePaths.sheets[relationship.getAttribute('Id')] = getFilePath(filePath);
39
- break;
40
- }
41
- };
42
- getRelationships(document).forEach(addFilePathInfo);
43
-
44
- // Seems like "sharedStrings.xml" is not required to exist.
45
- // For example, when the spreadsheet doesn't contain any strings.
46
- // https://github.com/catamphetamine/read-excel-file/issues/85
47
- // if (!filePaths.sharedStrings) {
48
- // throw new Error('"sharedStrings.xml" file not found in the *.xlsx file')
49
- // }
50
-
51
- return filePaths;
52
32
  }
53
- function getFilePath(path) {
33
+ function onOpenTagInWorkbookRelationships(tagName, attributes, state) {
34
+ if (tagName === 'Relationship') {
35
+ addFilePathForRelation(state, attributes.Id, attributes.Type, attributes.Target);
36
+ }
37
+ }
38
+ function addFilePathForRelation(state, id, type, target) {
39
+ switch (type) {
40
+ case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':
41
+ state.styles = getFilePathFromRelationTarget(target);
42
+ break;
43
+ case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':
44
+ state.sharedStrings = getFilePathFromRelationTarget(target);
45
+ break;
46
+ case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':
47
+ state.sheets[id] = getFilePathFromRelationTarget(target);
48
+ break;
49
+ }
50
+ }
51
+ function getFilePathFromRelationTarget(path) {
54
52
  // Normally, `path` is a relative path inside the ZIP archive,
55
53
  // like "worksheets/sheet1.xml", or "sharedStrings.xml", or "styles.xml".
56
54
  // There has been one weird case when file path was an absolute path,
@@ -1 +1 @@
1
- {"version":3,"file":"parseFilePaths.js","names":["getRelationships","parseFilePaths","content","xml","document","createDocument","filePaths","sheets","sharedStrings","undefined","styles","addFilePathInfo","relationship","filePath","getAttribute","fileType","getFilePath","forEach","path","slice","length"],"sources":["../../source/xlsx/parseFilePaths.js"],"sourcesContent":["import {\r\n getRelationships\r\n} from '../xml/xlsx.js'\r\n\r\n/**\r\n * Returns sheet file paths.\r\n * Seems that the correct place to look for the `sheetId` -> `filename` mapping\r\n * is `xl/_rels/workbook.xml.rels` file.\r\n * https://github.com/tidyverse/readxl/issues/104\r\n * @param {string} content — `xl/_rels/workbook.xml.rels` file contents.\r\n * @param {object} xml\r\n * @return {object}\r\n */\r\nexport default function parseFilePaths(content, xml) {\r\n // Example:\r\n // <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n // ...\r\n // <Relationship\r\n // Id=\"rId3\"\r\n // Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\"\r\n // Target=\"worksheets/sheet1.xml\"/>\r\n // </Relationships>\r\n const document = xml.createDocument(content)\r\n\r\n const filePaths = {\r\n sheets: {},\r\n sharedStrings: undefined,\r\n styles: undefined\r\n }\r\n\r\n const addFilePathInfo = (relationship) => {\r\n const filePath = relationship.getAttribute('Target')\r\n const fileType = relationship.getAttribute('Type')\r\n switch (fileType) {\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':\r\n filePaths.styles = getFilePath(filePath)\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':\r\n filePaths.sharedStrings = getFilePath(filePath)\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':\r\n filePaths.sheets[relationship.getAttribute('Id')] = getFilePath(filePath)\r\n break\r\n }\r\n }\r\n\r\n getRelationships(document).forEach(addFilePathInfo)\r\n\r\n // Seems like \"sharedStrings.xml\" is not required to exist.\r\n // For example, when the spreadsheet doesn't contain any strings.\r\n // https://github.com/catamphetamine/read-excel-file/issues/85\r\n // if (!filePaths.sharedStrings) {\r\n // throw new Error('\"sharedStrings.xml\" file not found in the *.xlsx file')\r\n // }\r\n\r\n return filePaths\r\n}\r\n\r\nfunction getFilePath(path) {\r\n // Normally, `path` is a relative path inside the ZIP archive,\r\n // like \"worksheets/sheet1.xml\", or \"sharedStrings.xml\", or \"styles.xml\".\r\n // There has been one weird case when file path was an absolute path,\r\n // like \"/xl/worksheets/sheet1.xml\" (specifically for sheets):\r\n // https://github.com/catamphetamine/read-excel-file/pull/95\r\n // Other libraries (like `xlsx`) and software (like Google Docs)\r\n // seem to support such absolute file paths, so this library does too.\r\n if (path[0] === '/') {\r\n return path.slice('/'.length)\r\n }\r\n // // Seems like a path could also be a URL.\r\n // // http://officeopenxml.com/anatomyofOOXML-xlsx.php\r\n // if (/^[a-z]+\\:\\/\\//.test(path)) {\r\n // return path\r\n // }\r\n return 'xl/' + path\r\n}"],"mappings":"AAAA,SACEA,gBAAgB,QACX,gBAAgB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,cAAcA,CAACC,OAAO,EAAEC,GAAG,EAAE;EACnD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAMC,QAAQ,GAAGD,GAAG,CAACE,cAAc,CAACH,OAAO,CAAC;EAE5C,IAAMI,SAAS,GAAG;IAChBC,MAAM,EAAE,CAAC,CAAC;IACVC,aAAa,EAAEC,SAAS;IACxBC,MAAM,EAAED;EACV,CAAC;EAED,IAAME,eAAe,GAAG,SAAlBA,eAAeA,CAAIC,YAAY,EAAK;IACxC,IAAMC,QAAQ,GAAGD,YAAY,CAACE,YAAY,CAAC,QAAQ,CAAC;IACpD,IAAMC,QAAQ,GAAGH,YAAY,CAACE,YAAY,CAAC,MAAM,CAAC;IAClD,QAAQC,QAAQ;MACd,KAAK,4EAA4E;QAC/ET,SAAS,CAACI,MAAM,GAAGM,WAAW,CAACH,QAAQ,CAAC;QACxC;MACF,KAAK,mFAAmF;QACtFP,SAAS,CAACE,aAAa,GAAGQ,WAAW,CAACH,QAAQ,CAAC;QAC/C;MACF,KAAK,+EAA+E;QAClFP,SAAS,CAACC,MAAM,CAACK,YAAY,CAACE,YAAY,CAAC,IAAI,CAAC,CAAC,GAAGE,WAAW,CAACH,QAAQ,CAAC;QACzE;IACJ;EACF,CAAC;EAEDb,gBAAgB,CAACI,QAAQ,CAAC,CAACa,OAAO,CAACN,eAAe,CAAC;;EAEnD;EACA;EACA;EACA;EACA;EACA;;EAEA,OAAOL,SAAS;AAClB;AAEA,SAASU,WAAWA,CAACE,IAAI,EAAE;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;IACnB,OAAOA,IAAI,CAACC,KAAK,CAAC,GAAG,CAACC,MAAM,CAAC;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA,OAAO,KAAK,GAAGF,IAAI;AACrB"}
1
+ {"version":3,"file":"parseFilePaths.js","names":["parseFilePaths","content","parseXmlStream","createInitialState","createInitialStateInWorkbookRelationships","onOpenTag","onOpenTagInWorkbookRelationships","then","state","sheets","sharedStrings","undefined","styles","tagName","attributes","addFilePathForRelation","Id","Type","Target","id","type","target","getFilePathFromRelationTarget","path","slice","length"],"sources":["../../source/xlsx/parseFilePaths.js"],"sourcesContent":["/**\r\n * Returns sheet file paths.\r\n * Seems that the correct place to look for the `sheetId` -> `filename` mapping\r\n * is `xl/_rels/workbook.xml.rels` file.\r\n * https://github.com/tidyverse/readxl/issues/104\r\n * @param {string} content — `xl/_rels/workbook.xml.rels` file contents.\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @return {object} — An object of shape `{ sheets: Record<string, string>, sharedStrings: string?, styles: string? }`\r\n */\r\nexport default function parseFilePaths(content, parseXmlStream) {\r\n // Example:\r\n // <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n // ...\r\n // <Relationship\r\n // Id=\"rId3\"\r\n // Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\"\r\n // Target=\"worksheets/sheet1.xml\"/>\r\n // </Relationships>\r\n return parseXmlStream(content, {\r\n createInitialState: createInitialStateInWorkbookRelationships,\r\n onOpenTag: onOpenTagInWorkbookRelationships\r\n }).then((state) => {\r\n return state\r\n })\r\n}\r\n\r\nfunction createInitialStateInWorkbookRelationships() {\r\n return {\r\n sheets: {},\r\n sharedStrings: undefined,\r\n styles: undefined\r\n }\r\n}\r\n\r\nfunction onOpenTagInWorkbookRelationships(tagName, attributes, state) {\r\n if (tagName === 'Relationship') {\r\n addFilePathForRelation(state, attributes.Id, attributes.Type, attributes.Target)\r\n }\r\n}\r\n\r\nfunction addFilePathForRelation(state, id, type, target) {\r\n switch (type) {\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles':\r\n state.styles = getFilePathFromRelationTarget(target)\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings':\r\n state.sharedStrings = getFilePathFromRelationTarget(target)\r\n break\r\n case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet':\r\n state.sheets[id] = getFilePathFromRelationTarget(target)\r\n break\r\n }\r\n}\r\n\r\nfunction getFilePathFromRelationTarget(path) {\r\n // Normally, `path` is a relative path inside the ZIP archive,\r\n // like \"worksheets/sheet1.xml\", or \"sharedStrings.xml\", or \"styles.xml\".\r\n // There has been one weird case when file path was an absolute path,\r\n // like \"/xl/worksheets/sheet1.xml\" (specifically for sheets):\r\n // https://github.com/catamphetamine/read-excel-file/pull/95\r\n // Other libraries (like `xlsx`) and software (like Google Docs)\r\n // seem to support such absolute file paths, so this library does too.\r\n if (path[0] === '/') {\r\n return path.slice('/'.length)\r\n }\r\n // // Seems like a path could also be a URL.\r\n // // http://officeopenxml.com/anatomyofOOXML-xlsx.php\r\n // if (/^[a-z]+\\:\\/\\//.test(path)) {\r\n // return path\r\n // }\r\n return 'xl/' + path\r\n}\r\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,cAAcA,CAACC,OAAO,EAAEC,cAAc,EAAE;EAC9D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAOA,cAAc,CAACD,OAAO,EAAE;IAC7BE,kBAAkB,EAAEC,yCAAyC;IAC7DC,SAAS,EAAEC;EACb,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,KAAK,EAAK;IACjB,OAAOA,KAAK;EACd,CAAC,CAAC;AACJ;AAEA,SAASJ,yCAAyCA,CAAA,EAAG;EACnD,OAAO;IACLK,MAAM,EAAE,CAAC,CAAC;IACVC,aAAa,EAAEC,SAAS;IACxBC,MAAM,EAAED;EACV,CAAC;AACH;AAEA,SAASL,gCAAgCA,CAACO,OAAO,EAAEC,UAAU,EAAEN,KAAK,EAAE;EACpE,IAAIK,OAAO,KAAK,cAAc,EAAE;IAC9BE,sBAAsB,CAACP,KAAK,EAAEM,UAAU,CAACE,EAAE,EAAEF,UAAU,CAACG,IAAI,EAAEH,UAAU,CAACI,MAAM,CAAC;EAClF;AACF;AAEA,SAASH,sBAAsBA,CAACP,KAAK,EAAEW,EAAE,EAAEC,IAAI,EAAEC,MAAM,EAAE;EACvD,QAAQD,IAAI;IACV,KAAK,4EAA4E;MAC/EZ,KAAK,CAACI,MAAM,GAAGU,6BAA6B,CAACD,MAAM,CAAC;MACpD;IACF,KAAK,mFAAmF;MACtFb,KAAK,CAACE,aAAa,GAAGY,6BAA6B,CAACD,MAAM,CAAC;MAC3D;IACF,KAAK,+EAA+E;MAClFb,KAAK,CAACC,MAAM,CAACU,EAAE,CAAC,GAAGG,6BAA6B,CAACD,MAAM,CAAC;MACxD;EACJ;AACF;AAEA,SAASC,6BAA6BA,CAACC,IAAI,EAAE;EAC3C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;IACnB,OAAOA,IAAI,CAACC,KAAK,CAAC,GAAG,CAACC,MAAM,CAAC;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA,OAAO,KAAK,GAAGF,IAAI;AACrB"}
@@ -0,0 +1,14 @@
1
+ // Parses a number from string.
2
+ // Throws an error if the number couldn't be parsed.
3
+ // When parsing floating-point number, is affected by
4
+ // the javascript number encoding precision issues:
5
+ // https://www.youtube.com/watch?v=2gIxbTn7GSc
6
+ // https://www.avioconsulting.com/blog/overcoming-javascript-numeric-precision-issues
7
+ export default function parseNumber(stringifiedNumber) {
8
+ var parsedNumber = Number(stringifiedNumber);
9
+ if (isNaN(parsedNumber)) {
10
+ throw new Error("Couldn't parse number: ".concat(stringifiedNumber));
11
+ }
12
+ return parsedNumber;
13
+ }
14
+ //# sourceMappingURL=parseNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseNumber.js","names":["parseNumber","stringifiedNumber","parsedNumber","Number","isNaN","Error","concat"],"sources":["../../source/xlsx/parseNumber.js"],"sourcesContent":["// Parses a number from string.\r\n// Throws an error if the number couldn't be parsed.\r\n// When parsing floating-point number, is affected by\r\n// the javascript number encoding precision issues:\r\n// https://www.youtube.com/watch?v=2gIxbTn7GSc\r\n// https://www.avioconsulting.com/blog/overcoming-javascript-numeric-precision-issues\r\nexport default function parseNumber(stringifiedNumber) {\r\n const parsedNumber = Number(stringifiedNumber)\r\n if (isNaN(parsedNumber)) {\r\n throw new Error(`Couldn't parse number: ${stringifiedNumber}`)\r\n }\r\n return parsedNumber\r\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,WAAWA,CAACC,iBAAiB,EAAE;EACrD,IAAMC,YAAY,GAAGC,MAAM,CAACF,iBAAiB,CAAC;EAC9C,IAAIG,KAAK,CAACF,YAAY,CAAC,EAAE;IACvB,MAAM,IAAIG,KAAK,2BAAAC,MAAA,CAA2BL,iBAAiB,CAAE,CAAC;EAChE;EACA,OAAOC,YAAY;AACrB"}
@@ -0,0 +1,55 @@
1
+ export function createInitialStateInSharedString() {
2
+ return {
3
+ t: false,
4
+ r: false,
5
+ rPh: false,
6
+ string: ''
7
+ };
8
+ }
9
+
10
+ // In an XLSX `sharedStrings.xml` file, a <si/> (string item) element can have
11
+ // either a single child <t/> element (meaning that "rich formatting" is not used)
12
+ // or multiple child <r/> elements (meaning that "rich formatting" is used).
13
+ export function onOpenTagInSharedString(tagName, attributes, state) {
14
+ // The possible children of <si> are:
15
+ // * <t>: Represents a simple text string. For plain text, this is the only child.
16
+ // * <r>: Represents a rich text run. When a cell contains text where only some words are bolded, colored, or styled differently, multiple <r> elements are used to break the text into formatted segments.
17
+ // * <rPh> (Phonetic Run): Used primarily for East Asian languages to provide phonetic reading/pronunciation data (e.g., furigana in Japanese). It associates a phonetic pronunciation run right alongside the base string text tag <t>.
18
+ // * <phoneticPr>: Defines the phonetic properties used for East Asian languages, specifically mapping how strings should be read for sorting and pronunciation.
19
+ if (tagName === 't') {
20
+ state.t = true;
21
+ } else if (tagName === 'r') {
22
+ // The possible children of <r/> are:
23
+ // * <rPr> (Run Properties): The formatting properties for the text (font, size, color, bold, italic, etc.).
24
+ // * <t> (Text): The actual text payload.
25
+ // * <rPh> (Phonetic Run): Phonetic pronunciation guidance (used for East Asian languages like Japanese). It associates a phonetic pronunciation run right alongside the base string text tag <t>.
26
+ state.r = true;
27
+ } else if (tagName === 'rPh') {
28
+ // The possible children of <rPh/> are:
29
+ // * <t> (Text): Contains the actual phonetic text or reading (usually in Katakana for Japanese) that corresponds to the associated character string.
30
+ state.rPh = true;
31
+ }
32
+ }
33
+ export function onCloseTagInSharedString(tagName, state) {
34
+ if (tagName === 't') {
35
+ state.t = false;
36
+ } else if (tagName === 'r') {
37
+ state.r = false;
38
+ } else if (tagName === 'rPh') {
39
+ state.rPh = false;
40
+ }
41
+ }
42
+ export function onTextInSharedString(text, state) {
43
+ if (state.rPh) {
44
+ // Ignore anything inside `<rPh/>` tags
45
+ } else if (state.t) {
46
+ if (state.r) {
47
+ // An `<r/>` element could contain multiple `<t/>` elements,
48
+ // the text content from all of which should be concatenated.
49
+ state.string += text;
50
+ } else {
51
+ state.string = text;
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=parseSharedString.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseSharedString.js","names":["createInitialStateInSharedString","t","r","rPh","string","onOpenTagInSharedString","tagName","attributes","state","onCloseTagInSharedString","onTextInSharedString","text"],"sources":["../../source/xlsx/parseSharedString.js"],"sourcesContent":["export function createInitialStateInSharedString() {\r\n\treturn {\r\n\t\tt: false,\r\n\t\tr: false,\r\n\t\trPh: false,\r\n\t\tstring: ''\r\n\t}\r\n}\r\n\r\n// In an XLSX `sharedStrings.xml` file, a <si/> (string item) element can have\r\n// either a single child <t/> element (meaning that \"rich formatting\" is not used)\r\n// or multiple child <r/> elements (meaning that \"rich formatting\" is used).\r\nexport function onOpenTagInSharedString(tagName, attributes, state) {\r\n\t// The possible children of <si> are:\r\n\t// * <t>: Represents a simple text string. For plain text, this is the only child.\r\n\t// * <r>: Represents a rich text run. When a cell contains text where only some words are bolded, colored, or styled differently, multiple <r> elements are used to break the text into formatted segments.\r\n\t// * <rPh> (Phonetic Run): Used primarily for East Asian languages to provide phonetic reading/pronunciation data (e.g., furigana in Japanese). It associates a phonetic pronunciation run right alongside the base string text tag <t>.\r\n\t// * <phoneticPr>: Defines the phonetic properties used for East Asian languages, specifically mapping how strings should be read for sorting and pronunciation.\r\n\tif (tagName === 't') {\r\n\t\tstate.t = true\r\n\t} else if (tagName === 'r') {\r\n\t\t// The possible children of <r/> are:\r\n\t\t// * <rPr> (Run Properties): The formatting properties for the text (font, size, color, bold, italic, etc.).\r\n\t\t// * <t> (Text): The actual text payload.\r\n\t\t// * <rPh> (Phonetic Run): Phonetic pronunciation guidance (used for East Asian languages like Japanese). It associates a phonetic pronunciation run right alongside the base string text tag <t>.\r\n\t\tstate.r = true\r\n\t} else if (tagName === 'rPh') {\r\n\t\t// The possible children of <rPh/> are:\r\n\t\t// * <t> (Text): Contains the actual phonetic text or reading (usually in Katakana for Japanese) that corresponds to the associated character string.\r\n\t\tstate.rPh = true\r\n\t}\r\n}\r\n\r\nexport function onCloseTagInSharedString(tagName, state) {\r\n\tif (tagName === 't') {\r\n\t\tstate.t = false\r\n\t} else if (tagName === 'r') {\r\n\t\tstate.r = false\r\n\t} else if (tagName === 'rPh') {\r\n\t\tstate.rPh = false\r\n\t}\r\n}\r\n\r\nexport function onTextInSharedString(text, state) {\r\n\tif (state.rPh) {\r\n\t\t// Ignore anything inside `<rPh/>` tags\r\n\t} else if (state.t) {\r\n\t\tif (state.r) {\r\n\t\t\t// An `<r/>` element could contain multiple `<t/>` elements,\r\n\t\t\t// the text content from all of which should be concatenated.\r\n\t\t\tstate.string += text\r\n\t\t} else {\r\n\t\t\tstate.string = text\r\n\t\t}\r\n\t}\r\n}"],"mappings":"AAAA,OAAO,SAASA,gCAAgCA,CAAA,EAAG;EAClD,OAAO;IACNC,CAAC,EAAE,KAAK;IACRC,CAAC,EAAE,KAAK;IACRC,GAAG,EAAE,KAAK;IACVC,MAAM,EAAE;EACT,CAAC;AACF;;AAEA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAACC,OAAO,EAAEC,UAAU,EAAEC,KAAK,EAAE;EACnE;EACA;EACA;EACA;EACA;EACA,IAAIF,OAAO,KAAK,GAAG,EAAE;IACpBE,KAAK,CAACP,CAAC,GAAG,IAAI;EACf,CAAC,MAAM,IAAIK,OAAO,KAAK,GAAG,EAAE;IAC3B;IACA;IACA;IACA;IACAE,KAAK,CAACN,CAAC,GAAG,IAAI;EACf,CAAC,MAAM,IAAII,OAAO,KAAK,KAAK,EAAE;IAC7B;IACA;IACAE,KAAK,CAACL,GAAG,GAAG,IAAI;EACjB;AACD;AAEA,OAAO,SAASM,wBAAwBA,CAACH,OAAO,EAAEE,KAAK,EAAE;EACxD,IAAIF,OAAO,KAAK,GAAG,EAAE;IACpBE,KAAK,CAACP,CAAC,GAAG,KAAK;EAChB,CAAC,MAAM,IAAIK,OAAO,KAAK,GAAG,EAAE;IAC3BE,KAAK,CAACN,CAAC,GAAG,KAAK;EAChB,CAAC,MAAM,IAAII,OAAO,KAAK,KAAK,EAAE;IAC7BE,KAAK,CAACL,GAAG,GAAG,KAAK;EAClB;AACD;AAEA,OAAO,SAASO,oBAAoBA,CAACC,IAAI,EAAEH,KAAK,EAAE;EACjD,IAAIA,KAAK,CAACL,GAAG,EAAE;IACd;EAAA,CACA,MAAM,IAAIK,KAAK,CAACP,CAAC,EAAE;IACnB,IAAIO,KAAK,CAACN,CAAC,EAAE;MACZ;MACA;MACAM,KAAK,CAACJ,MAAM,IAAIO,IAAI;IACrB,CAAC,MAAM;MACNH,KAAK,CAACJ,MAAM,GAAGO,IAAI;IACpB;EACD;AACD"}
@@ -1,8 +1,49 @@
1
- import { getSharedStrings } from '../xml/xlsx.js';
2
- export default function parseSharedStrings(content, xml) {
3
- if (!content) {
4
- return [];
1
+ import { onOpenTagInSharedString, onCloseTagInSharedString, onTextInSharedString, createInitialStateInSharedString } from './parseSharedString.js';
2
+
3
+ /**
4
+ * Parses `sharedStrings.xml` file.
5
+ * @param {string} content
6
+ * @param {function} parseXmlStream — SAX XML parser.
7
+ * @returns {Promise<string[]>}
8
+ */
9
+ export default function parseSharedStrings(content, parseXmlStream) {
10
+ return parseXmlStream(content, {
11
+ createInitialState: createInitialStateInSharedStrings,
12
+ onOpenTag: onOpenTagInSharedStrings,
13
+ onCloseTag: onCloseTagInSharedStrings,
14
+ onText: onTextInSharedStrings
15
+ }).then(function (state) {
16
+ return state.strings;
17
+ });
18
+ }
19
+ function createInitialStateInSharedStrings() {
20
+ return {
21
+ si: undefined,
22
+ strings: []
23
+ };
24
+ }
25
+
26
+ // In an XLSX `sharedStrings.xml` file, a <si/> (string item) element can have
27
+ // either a single child <t/> element (meaning that "rich formatting" is not used)
28
+ // or multiple child <r/> elements (meaning that "rich formatting" is used).
29
+ function onOpenTagInSharedStrings(tagName, attributes, state) {
30
+ if (tagName === 'si') {
31
+ state.si = createInitialStateInSharedString();
32
+ } else if (state.si) {
33
+ onOpenTagInSharedString(tagName, attributes, state.si);
34
+ }
35
+ }
36
+ function onCloseTagInSharedStrings(tagName, state) {
37
+ if (tagName === 'si') {
38
+ state.strings.push(state.si.string);
39
+ state.si = undefined;
40
+ } else if (state.si) {
41
+ onCloseTagInSharedString(tagName, state.si);
42
+ }
43
+ }
44
+ function onTextInSharedStrings(text, state) {
45
+ if (state.si) {
46
+ onTextInSharedString(text, state.si);
5
47
  }
6
- return getSharedStrings(xml.createDocument(content));
7
48
  }
8
49
  //# sourceMappingURL=parseSharedStrings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseSharedStrings.js","names":["getSharedStrings","parseSharedStrings","content","xml","createDocument"],"sources":["../../source/xlsx/parseSharedStrings.js"],"sourcesContent":["import {\r\n getSharedStrings\r\n} from '../xml/xlsx.js'\r\n\r\nexport default function parseSharedStrings(content, xml) {\r\n if (!content) {\r\n return []\r\n }\r\n return getSharedStrings(xml.createDocument(content))\r\n}"],"mappings":"AAAA,SACEA,gBAAgB,QACX,gBAAgB;AAEvB,eAAe,SAASC,kBAAkBA,CAACC,OAAO,EAAEC,GAAG,EAAE;EACvD,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO,EAAE;EACX;EACA,OAAOF,gBAAgB,CAACG,GAAG,CAACC,cAAc,CAACF,OAAO,CAAC,CAAC;AACtD"}
1
+ {"version":3,"file":"parseSharedStrings.js","names":["onOpenTagInSharedString","onCloseTagInSharedString","onTextInSharedString","createInitialStateInSharedString","parseSharedStrings","content","parseXmlStream","createInitialState","createInitialStateInSharedStrings","onOpenTag","onOpenTagInSharedStrings","onCloseTag","onCloseTagInSharedStrings","onText","onTextInSharedStrings","then","state","strings","si","undefined","tagName","attributes","push","string","text"],"sources":["../../source/xlsx/parseSharedStrings.js"],"sourcesContent":["import {\r\n onOpenTagInSharedString,\r\n onCloseTagInSharedString,\r\n onTextInSharedString,\r\n createInitialStateInSharedString\r\n} from './parseSharedString.js'\r\n\r\n/**\r\n * Parses `sharedStrings.xml` file.\r\n * @param {string} content\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @returns {Promise<string[]>}\r\n */\r\nexport default function parseSharedStrings(content, parseXmlStream) {\r\n return parseXmlStream(content, {\r\n createInitialState: createInitialStateInSharedStrings,\r\n onOpenTag: onOpenTagInSharedStrings,\r\n onCloseTag: onCloseTagInSharedStrings,\r\n onText: onTextInSharedStrings\r\n }).then((state) => {\r\n return state.strings\r\n })\r\n}\r\n\r\nfunction createInitialStateInSharedStrings() {\r\n return {\r\n si: undefined,\r\n strings: []\r\n }\r\n}\r\n\r\n// In an XLSX `sharedStrings.xml` file, a <si/> (string item) element can have\r\n// either a single child <t/> element (meaning that \"rich formatting\" is not used)\r\n// or multiple child <r/> elements (meaning that \"rich formatting\" is used).\r\nfunction onOpenTagInSharedStrings(tagName, attributes, state) {\r\n if (tagName === 'si') {\r\n state.si = createInitialStateInSharedString()\r\n } else if (state.si) {\r\n onOpenTagInSharedString(tagName, attributes, state.si)\r\n }\r\n}\r\n\r\nfunction onCloseTagInSharedStrings(tagName, state) {\r\n if (tagName === 'si') {\r\n state.strings.push(state.si.string)\r\n state.si = undefined\r\n } else if (state.si) {\r\n onCloseTagInSharedString(tagName, state.si)\r\n }\r\n}\r\n\r\nfunction onTextInSharedStrings(text, state) {\r\n if (state.si) {\r\n onTextInSharedString(text, state.si)\r\n }\r\n}"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,EACpBC,gCAAgC,QAC3B,wBAAwB;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,kBAAkBA,CAACC,OAAO,EAAEC,cAAc,EAAE;EAClE,OAAOA,cAAc,CAACD,OAAO,EAAE;IAC7BE,kBAAkB,EAAEC,iCAAiC;IACrDC,SAAS,EAAEC,wBAAwB;IACnCC,UAAU,EAAEC,yBAAyB;IACrCC,MAAM,EAAEC;EACV,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,KAAK,EAAK;IACjB,OAAOA,KAAK,CAACC,OAAO;EACtB,CAAC,CAAC;AACJ;AAEA,SAAST,iCAAiCA,CAAA,EAAG;EAC3C,OAAO;IACLU,EAAE,EAAEC,SAAS;IACbF,OAAO,EAAE;EACX,CAAC;AACH;;AAEA;AACA;AACA;AACA,SAASP,wBAAwBA,CAACU,OAAO,EAAEC,UAAU,EAAEL,KAAK,EAAE;EAC5D,IAAII,OAAO,KAAK,IAAI,EAAE;IACpBJ,KAAK,CAACE,EAAE,GAAGf,gCAAgC,CAAC,CAAC;EAC/C,CAAC,MAAM,IAAIa,KAAK,CAACE,EAAE,EAAE;IACnBlB,uBAAuB,CAACoB,OAAO,EAAEC,UAAU,EAAEL,KAAK,CAACE,EAAE,CAAC;EACxD;AACF;AAEA,SAASN,yBAAyBA,CAACQ,OAAO,EAAEJ,KAAK,EAAE;EACjD,IAAII,OAAO,KAAK,IAAI,EAAE;IACpBJ,KAAK,CAACC,OAAO,CAACK,IAAI,CAACN,KAAK,CAACE,EAAE,CAACK,MAAM,CAAC;IACnCP,KAAK,CAACE,EAAE,GAAGC,SAAS;EACtB,CAAC,MAAM,IAAIH,KAAK,CAACE,EAAE,EAAE;IACnBjB,wBAAwB,CAACmB,OAAO,EAAEJ,KAAK,CAACE,EAAE,CAAC;EAC7C;AACF;AAEA,SAASJ,qBAAqBA,CAACU,IAAI,EAAER,KAAK,EAAE;EAC1C,IAAIA,KAAK,CAACE,EAAE,EAAE;IACZhB,oBAAoB,CAACsB,IAAI,EAAER,KAAK,CAACE,EAAE,CAAC;EACtC;AACF"}
@@ -1,14 +1,96 @@
1
- import parseCells from './parseCells.js';
2
- import parseSheetDimensions from './parseSheetDimensions.js';
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ 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."); }
3
+ 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); }
4
+ 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; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import parseSheetData, { createInitialStateInSheetData, onOpenTagInSheetData, onCloseTagInSheetData, onTextInSheetData } from './parseSheetData.js';
8
+ import parseCellAddress from './parseCellAddress.js';
3
9
  import reconstructSheetDimensionsFromSheetCells from './reconstructSheetDimensionsFromSheetCells.js';
4
10
  import convertSheetToData2dArray from './convertCellsToData2dArray.js';
5
- export default function parseSheet(content, xml, sharedStrings, styles, epoch1904, options) {
6
- var sheetDocument = xml.createDocument(content);
7
- var cells = parseCells(sheetDocument, sharedStrings, styles, epoch1904, options);
8
11
 
9
- // `dimensions` defines the spreadsheet area enclosing all non-empty cells.
10
- // https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.sheetdimension?view=openxml-2.8.1
11
- var dimensions = parseSheetDimensions(sheetDocument) || reconstructSheetDimensionsFromSheetCells(cells);
12
- return convertSheetToData2dArray(cells, dimensions);
12
+ /**
13
+ * Parses a `sheet.xml` file.
14
+ * @param {string} content
15
+ * @param {function} parseXmlStream — SAX XML parser.
16
+ * @param {object} options
17
+ * @returns {Promise<SheetData>}
18
+ */
19
+ export default function parseSheet(content, parseXmlStream, _ref) {
20
+ var sharedStrings = _ref.sharedStrings,
21
+ styles = _ref.styles,
22
+ epoch1904 = _ref.epoch1904,
23
+ options = _ref.options;
24
+ // When XML parser is finished, it returns a `state`
25
+ // where it has accumulated the cells it encountered during parsing.
26
+ // `getSheetData()` function reads the parser `state` and transforms it to `SheetData`.
27
+ var getSheetData = function getSheetData(state) {
28
+ var cells = parseSheetData(state.sheetData, sharedStrings, styles, epoch1904, options);
29
+ var dimensions = state.dimension ? parseSheetDimensionRef(state.dimension) : reconstructSheetDimensionsFromSheetCells(cells);
30
+ return convertSheetToData2dArray(cells, dimensions);
31
+ };
32
+ return parseXmlStream(content, {
33
+ createInitialState: createInitialStateInSheet,
34
+ onOpenTag: onOpenTagInSheet,
35
+ onCloseTag: onCloseTagInSheet,
36
+ onText: onTextInSheet
37
+ }).then(function (state) {
38
+ return getSheetData(state);
39
+ });
40
+ }
41
+ function createInitialStateInSheet() {
42
+ return {
43
+ dimension: undefined,
44
+ sheetData: undefined
45
+ };
46
+ }
47
+ function onOpenTagInSheet(tagName, attributes, state) {
48
+ if (tagName === 'dimension') {
49
+ state.dimension = attributes.ref;
50
+ } else if (tagName === 'sheetData') {
51
+ state.sheetData = createInitialStateInSheetData();
52
+ } else if (state.sheetData) {
53
+ onOpenTagInSheetData(tagName, attributes, state.sheetData);
54
+ }
55
+ }
56
+ function onCloseTagInSheet(tagName, state) {
57
+ if (state.sheetData) {
58
+ onCloseTagInSheetData(tagName, state.sheetData);
59
+ }
60
+ }
61
+ function onTextInSheet(text, state) {
62
+ if (state.sheetData) {
63
+ onTextInSheetData(text, state.sheetData);
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Sheet "dimension" defines the spreadsheet area containing all non-empty cells.
69
+ * Any cells outside the "dimension" are considered empty and should be ignored.
70
+ * https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.sheetdimension?view=openxml-2.8.1
71
+ * @param {string} `ref` — The value of `<dimension ref/>` attribute.
72
+ * @returns {object[]} `undefined` or `[{ row, column }, { row, column }]` — "From row number and column number to row number and column number".
73
+ */
74
+ function parseSheetDimensionRef(ref) {
75
+ var dimensions = ref.split(':').map(parseCellAddress).map(function (_ref2) {
76
+ var _ref3 = _slicedToArray(_ref2, 2),
77
+ row = _ref3[0],
78
+ column = _ref3[1];
79
+ return {
80
+ row: row,
81
+ column: column
82
+ };
83
+ });
84
+ // Sometimes there can be just a single cell as a spreadsheet's "dimensions".
85
+ // For example, the default "dimensions" in Apache POI library is "A1",
86
+ // meaning that only the first cell in the spreadsheet is used.
87
+ //
88
+ // A quote from Apache POI library:
89
+ // "Single cell ranges are formatted like single cell references (e.g. 'A1' instead of 'A1:A1')."
90
+ //
91
+ if (dimensions.length === 1) {
92
+ dimensions = [dimensions[0], dimensions[0]];
93
+ }
94
+ return dimensions;
13
95
  }
14
96
  //# sourceMappingURL=parseSheet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseSheet.js","names":["parseCells","parseSheetDimensions","reconstructSheetDimensionsFromSheetCells","convertSheetToData2dArray","parseSheet","content","xml","sharedStrings","styles","epoch1904","options","sheetDocument","createDocument","cells","dimensions"],"sources":["../../source/xlsx/parseSheet.js"],"sourcesContent":["import parseCells from './parseCells.js'\r\nimport parseSheetDimensions from './parseSheetDimensions.js'\r\nimport reconstructSheetDimensionsFromSheetCells from './reconstructSheetDimensionsFromSheetCells.js'\r\nimport convertSheetToData2dArray from './convertCellsToData2dArray.js'\r\n\r\nexport default function parseSheet(content, xml, sharedStrings, styles, epoch1904, options) {\r\n const sheetDocument = xml.createDocument(content)\r\n\r\n const cells = parseCells(sheetDocument, sharedStrings, styles, epoch1904, options)\r\n\r\n // `dimensions` defines the spreadsheet area enclosing all non-empty cells.\r\n // https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.sheetdimension?view=openxml-2.8.1\r\n const dimensions = parseSheetDimensions(sheetDocument) || reconstructSheetDimensionsFromSheetCells(cells)\r\n\r\n return convertSheetToData2dArray(cells, dimensions)\r\n}"],"mappings":"AAAA,OAAOA,UAAU,MAAM,iBAAiB;AACxC,OAAOC,oBAAoB,MAAM,2BAA2B;AAC5D,OAAOC,wCAAwC,MAAM,+CAA+C;AACpG,OAAOC,yBAAyB,MAAM,gCAAgC;AAEtE,eAAe,SAASC,UAAUA,CAACC,OAAO,EAAEC,GAAG,EAAEC,aAAa,EAAEC,MAAM,EAAEC,SAAS,EAAEC,OAAO,EAAE;EAC1F,IAAMC,aAAa,GAAGL,GAAG,CAACM,cAAc,CAACP,OAAO,CAAC;EAEjD,IAAMQ,KAAK,GAAGb,UAAU,CAACW,aAAa,EAAEJ,aAAa,EAAEC,MAAM,EAAEC,SAAS,EAAEC,OAAO,CAAC;;EAElF;EACA;EACA,IAAMI,UAAU,GAAGb,oBAAoB,CAACU,aAAa,CAAC,IAAIT,wCAAwC,CAACW,KAAK,CAAC;EAEzG,OAAOV,yBAAyB,CAACU,KAAK,EAAEC,UAAU,CAAC;AACrD"}
1
+ {"version":3,"file":"parseSheet.js","names":["parseSheetData","createInitialStateInSheetData","onOpenTagInSheetData","onCloseTagInSheetData","onTextInSheetData","parseCellAddress","reconstructSheetDimensionsFromSheetCells","convertSheetToData2dArray","parseSheet","content","parseXmlStream","_ref","sharedStrings","styles","epoch1904","options","getSheetData","state","cells","sheetData","dimensions","dimension","parseSheetDimensionRef","createInitialState","createInitialStateInSheet","onOpenTag","onOpenTagInSheet","onCloseTag","onCloseTagInSheet","onText","onTextInSheet","then","undefined","tagName","attributes","ref","text","split","map","_ref2","_ref3","_slicedToArray","row","column","length"],"sources":["../../source/xlsx/parseSheet.js"],"sourcesContent":["import parseSheetData, {\r\n createInitialStateInSheetData,\r\n onOpenTagInSheetData,\r\n onCloseTagInSheetData,\r\n onTextInSheetData\r\n} from './parseSheetData.js'\r\n\r\nimport parseCellAddress from './parseCellAddress.js'\r\n\r\nimport reconstructSheetDimensionsFromSheetCells from './reconstructSheetDimensionsFromSheetCells.js'\r\nimport convertSheetToData2dArray from './convertCellsToData2dArray.js'\r\n\r\n/**\r\n * Parses a `sheet.xml` file.\r\n * @param {string} content\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @param {object} options\r\n * @returns {Promise<SheetData>}\r\n */\r\nexport default function parseSheet(content, parseXmlStream, { sharedStrings, styles, epoch1904, options }) {\r\n // When XML parser is finished, it returns a `state`\r\n // where it has accumulated the cells it encountered during parsing.\r\n // `getSheetData()` function reads the parser `state` and transforms it to `SheetData`.\r\n const getSheetData = (state) => {\r\n const cells = parseSheetData(state.sheetData, sharedStrings, styles, epoch1904, options)\r\n const dimensions = state.dimension\r\n ? parseSheetDimensionRef(state.dimension)\r\n : reconstructSheetDimensionsFromSheetCells(cells)\r\n return convertSheetToData2dArray(cells, dimensions)\r\n }\r\n\r\n return parseXmlStream(content, {\r\n createInitialState: createInitialStateInSheet,\r\n onOpenTag: onOpenTagInSheet,\r\n onCloseTag: onCloseTagInSheet,\r\n onText: onTextInSheet\r\n }).then((state) => {\r\n return getSheetData(state)\r\n })\r\n}\r\n\r\nfunction createInitialStateInSheet() {\r\n return {\r\n dimension: undefined,\r\n sheetData: undefined\r\n }\r\n}\r\n\r\nfunction onOpenTagInSheet(tagName, attributes, state) {\r\n if (tagName === 'dimension') {\r\n state.dimension = attributes.ref\r\n } else if (tagName === 'sheetData') {\r\n state.sheetData = createInitialStateInSheetData()\r\n } else if (state.sheetData) {\r\n onOpenTagInSheetData(tagName, attributes, state.sheetData)\r\n }\r\n}\r\n\r\nfunction onCloseTagInSheet(tagName, state) {\r\n if (state.sheetData) {\r\n onCloseTagInSheetData(tagName, state.sheetData)\r\n }\r\n}\r\n\r\nfunction onTextInSheet(text, state) {\r\n if (state.sheetData) {\r\n onTextInSheetData(text, state.sheetData)\r\n }\r\n}\r\n\r\n/**\r\n * Sheet \"dimension\" defines the spreadsheet area containing all non-empty cells.\r\n * Any cells outside the \"dimension\" are considered empty and should be ignored.\r\n * https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.sheetdimension?view=openxml-2.8.1\r\n * @param {string} `ref` — The value of `<dimension ref/>` attribute.\r\n * @returns {object[]} `undefined` or `[{ row, column }, { row, column }]` — \"From row number and column number to row number and column number\".\r\n */\r\nfunction parseSheetDimensionRef(ref) {\r\n let dimensions = ref.split(':').map(parseCellAddress).map(\r\n ([row, column]) => ({ row, column })\r\n )\r\n // Sometimes there can be just a single cell as a spreadsheet's \"dimensions\".\r\n // For example, the default \"dimensions\" in Apache POI library is \"A1\",\r\n // meaning that only the first cell in the spreadsheet is used.\r\n //\r\n // A quote from Apache POI library:\r\n // \"Single cell ranges are formatted like single cell references (e.g. 'A1' instead of 'A1:A1').\"\r\n //\r\n if (dimensions.length === 1) {\r\n dimensions = [dimensions[0], dimensions[0]]\r\n }\r\n return dimensions\r\n}"],"mappings":"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"}