@alienkarma/exceljs 4.4.0-fork.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 (537) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +3024 -0
  3. package/README_zh.md +2878 -0
  4. package/dist/LICENSE +22 -0
  5. package/dist/es5/csv/csv.js +182 -0
  6. package/dist/es5/csv/csv.js.map +1 -0
  7. package/dist/es5/csv/line-buffer.js +68 -0
  8. package/dist/es5/csv/line-buffer.js.map +1 -0
  9. package/dist/es5/csv/stream-converter.js +110 -0
  10. package/dist/es5/csv/stream-converter.js.map +1 -0
  11. package/dist/es5/doc/anchor.js +73 -0
  12. package/dist/es5/doc/anchor.js.map +1 -0
  13. package/dist/es5/doc/cell.js +960 -0
  14. package/dist/es5/doc/cell.js.map +1 -0
  15. package/dist/es5/doc/column.js +274 -0
  16. package/dist/es5/doc/column.js.map +1 -0
  17. package/dist/es5/doc/data-validations.js +18 -0
  18. package/dist/es5/doc/data-validations.js.map +1 -0
  19. package/dist/es5/doc/defined-names.js +173 -0
  20. package/dist/es5/doc/defined-names.js.map +1 -0
  21. package/dist/es5/doc/enums.js +49 -0
  22. package/dist/es5/doc/enums.js.map +1 -0
  23. package/dist/es5/doc/image.js +69 -0
  24. package/dist/es5/doc/image.js.map +1 -0
  25. package/dist/es5/doc/modelcontainer.js +16 -0
  26. package/dist/es5/doc/modelcontainer.js.map +1 -0
  27. package/dist/es5/doc/note.js +64 -0
  28. package/dist/es5/doc/note.js.map +1 -0
  29. package/dist/es5/doc/pivot-table.js +137 -0
  30. package/dist/es5/doc/pivot-table.js.map +1 -0
  31. package/dist/es5/doc/range.js +229 -0
  32. package/dist/es5/doc/range.js.map +1 -0
  33. package/dist/es5/doc/row.js +382 -0
  34. package/dist/es5/doc/row.js.map +1 -0
  35. package/dist/es5/doc/table.js +441 -0
  36. package/dist/es5/doc/table.js.map +1 -0
  37. package/dist/es5/doc/workbook.js +205 -0
  38. package/dist/es5/doc/workbook.js.map +1 -0
  39. package/dist/es5/doc/worksheet.js +918 -0
  40. package/dist/es5/doc/worksheet.js.map +1 -0
  41. package/dist/es5/exceljs.bare.js +14 -0
  42. package/dist/es5/exceljs.bare.js.map +1 -0
  43. package/dist/es5/exceljs.browser.js +36 -0
  44. package/dist/es5/exceljs.browser.js.map +1 -0
  45. package/dist/es5/exceljs.nodejs.js +15 -0
  46. package/dist/es5/exceljs.nodejs.js.map +1 -0
  47. package/dist/es5/index.js +15 -0
  48. package/dist/es5/stream/xlsx/hyperlink-reader.js +90 -0
  49. package/dist/es5/stream/xlsx/hyperlink-reader.js.map +1 -0
  50. package/dist/es5/stream/xlsx/sheet-comments-writer.js +94 -0
  51. package/dist/es5/stream/xlsx/sheet-comments-writer.js.map +1 -0
  52. package/dist/es5/stream/xlsx/sheet-rels-writer.js +94 -0
  53. package/dist/es5/stream/xlsx/sheet-rels-writer.js.map +1 -0
  54. package/dist/es5/stream/xlsx/workbook-reader.js +362 -0
  55. package/dist/es5/stream/xlsx/workbook-reader.js.map +1 -0
  56. package/dist/es5/stream/xlsx/workbook-writer.js +347 -0
  57. package/dist/es5/stream/xlsx/workbook-writer.js.map +1 -0
  58. package/dist/es5/stream/xlsx/worksheet-reader.js +392 -0
  59. package/dist/es5/stream/xlsx/worksheet-reader.js.map +1 -0
  60. package/dist/es5/stream/xlsx/worksheet-writer.js +652 -0
  61. package/dist/es5/stream/xlsx/worksheet-writer.js.map +1 -0
  62. package/dist/es5/utils/auto-drain.js +18 -0
  63. package/dist/es5/utils/auto-drain.js.map +1 -0
  64. package/dist/es5/utils/browser-buffer-decode.js +15 -0
  65. package/dist/es5/utils/browser-buffer-decode.js.map +1 -0
  66. package/dist/es5/utils/browser-buffer-encode.js +18 -0
  67. package/dist/es5/utils/browser-buffer-encode.js.map +1 -0
  68. package/dist/es5/utils/cell-matrix.js +149 -0
  69. package/dist/es5/utils/cell-matrix.js.map +1 -0
  70. package/dist/es5/utils/col-cache.js +258 -0
  71. package/dist/es5/utils/col-cache.js.map +1 -0
  72. package/dist/es5/utils/copy-style.js +43 -0
  73. package/dist/es5/utils/copy-style.js.map +1 -0
  74. package/dist/es5/utils/encryptor.js +58 -0
  75. package/dist/es5/utils/encryptor.js.map +1 -0
  76. package/dist/es5/utils/iterate-stream.js +46 -0
  77. package/dist/es5/utils/iterate-stream.js.map +1 -0
  78. package/dist/es5/utils/parse-sax.js +47 -0
  79. package/dist/es5/utils/parse-sax.js.map +1 -0
  80. package/dist/es5/utils/shared-formula.js +42 -0
  81. package/dist/es5/utils/shared-formula.js.map +1 -0
  82. package/dist/es5/utils/shared-strings.js +32 -0
  83. package/dist/es5/utils/shared-strings.js.map +1 -0
  84. package/dist/es5/utils/stream-base64.js +66 -0
  85. package/dist/es5/utils/stream-base64.js.map +1 -0
  86. package/dist/es5/utils/stream-buf.js +343 -0
  87. package/dist/es5/utils/stream-buf.js.map +1 -0
  88. package/dist/es5/utils/string-buf.js +73 -0
  89. package/dist/es5/utils/string-buf.js.map +1 -0
  90. package/dist/es5/utils/string-builder.js +32 -0
  91. package/dist/es5/utils/string-builder.js.map +1 -0
  92. package/dist/es5/utils/stuttered-pipe.js +61 -0
  93. package/dist/es5/utils/stuttered-pipe.js.map +1 -0
  94. package/dist/es5/utils/typed-stack.js +23 -0
  95. package/dist/es5/utils/typed-stack.js.map +1 -0
  96. package/dist/es5/utils/under-dash.js +168 -0
  97. package/dist/es5/utils/under-dash.js.map +1 -0
  98. package/dist/es5/utils/utils.js +204 -0
  99. package/dist/es5/utils/utils.js.map +1 -0
  100. package/dist/es5/utils/xml-stream.js +151 -0
  101. package/dist/es5/utils/xml-stream.js.map +1 -0
  102. package/dist/es5/utils/zip-stream.js +79 -0
  103. package/dist/es5/utils/zip-stream.js.map +1 -0
  104. package/dist/es5/xlsx/defaultnumformats.js +230 -0
  105. package/dist/es5/xlsx/defaultnumformats.js.map +1 -0
  106. package/dist/es5/xlsx/rel-type.js +21 -0
  107. package/dist/es5/xlsx/rel-type.js.map +1 -0
  108. package/dist/es5/xlsx/xform/base-xform.js +139 -0
  109. package/dist/es5/xlsx/xform/base-xform.js.map +1 -0
  110. package/dist/es5/xlsx/xform/book/defined-name-xform.js +85 -0
  111. package/dist/es5/xlsx/xform/book/defined-name-xform.js.map +1 -0
  112. package/dist/es5/xlsx/xform/book/sheet-xform.js +32 -0
  113. package/dist/es5/xlsx/xform/book/sheet-xform.js.map +1 -0
  114. package/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js +24 -0
  115. package/dist/es5/xlsx/xform/book/workbook-calc-properties-xform.js.map +1 -0
  116. package/dist/es5/xlsx/xform/book/workbook-pivot-cache-xform.js +27 -0
  117. package/dist/es5/xlsx/xform/book/workbook-pivot-cache-xform.js.map +1 -0
  118. package/dist/es5/xlsx/xform/book/workbook-properties-xform.js +27 -0
  119. package/dist/es5/xlsx/xform/book/workbook-properties-xform.js.map +1 -0
  120. package/dist/es5/xlsx/xform/book/workbook-view-xform.js +51 -0
  121. package/dist/es5/xlsx/xform/book/workbook-view-xform.js.map +1 -0
  122. package/dist/es5/xlsx/xform/book/workbook-xform.js +241 -0
  123. package/dist/es5/xlsx/xform/book/workbook-xform.js.map +1 -0
  124. package/dist/es5/xlsx/xform/comment/comment-xform.js +103 -0
  125. package/dist/es5/xlsx/xform/comment/comment-xform.js.map +1 -0
  126. package/dist/es5/xlsx/xform/comment/comments-xform.js +76 -0
  127. package/dist/es5/xlsx/xform/comment/comments-xform.js.map +1 -0
  128. package/dist/es5/xlsx/xform/comment/style/vml-position-xform.js +35 -0
  129. package/dist/es5/xlsx/xform/comment/style/vml-position-xform.js.map +1 -0
  130. package/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js +32 -0
  131. package/dist/es5/xlsx/xform/comment/style/vml-protection-xform.js.map +1 -0
  132. package/dist/es5/xlsx/xform/comment/vml-anchor-xform.js +53 -0
  133. package/dist/es5/xlsx/xform/comment/vml-anchor-xform.js.map +1 -0
  134. package/dist/es5/xlsx/xform/comment/vml-client-data-xform.js +97 -0
  135. package/dist/es5/xlsx/xform/comment/vml-client-data-xform.js.map +1 -0
  136. package/dist/es5/xlsx/xform/comment/vml-notes-xform.js +107 -0
  137. package/dist/es5/xlsx/xform/comment/vml-notes-xform.js.map +1 -0
  138. package/dist/es5/xlsx/xform/comment/vml-shape-xform.js +92 -0
  139. package/dist/es5/xlsx/xform/comment/vml-shape-xform.js.map +1 -0
  140. package/dist/es5/xlsx/xform/comment/vml-textbox-xform.js +61 -0
  141. package/dist/es5/xlsx/xform/comment/vml-textbox-xform.js.map +1 -0
  142. package/dist/es5/xlsx/xform/composite-xform.js +51 -0
  143. package/dist/es5/xlsx/xform/composite-xform.js.map +1 -0
  144. package/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js +30 -0
  145. package/dist/es5/xlsx/xform/core/app-heading-pairs-xform.js.map +1 -0
  146. package/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js +27 -0
  147. package/dist/es5/xlsx/xform/core/app-titles-of-parts-xform.js.map +1 -0
  148. package/dist/es5/xlsx/xform/core/app-xform.js +93 -0
  149. package/dist/es5/xlsx/xform/core/app-xform.js.map +1 -0
  150. package/dist/es5/xlsx/xform/core/content-types-xform.js +127 -0
  151. package/dist/es5/xlsx/xform/core/content-types-xform.js.map +1 -0
  152. package/dist/es5/xlsx/xform/core/core-xform.js +158 -0
  153. package/dist/es5/xlsx/xform/core/core-xform.js.map +1 -0
  154. package/dist/es5/xlsx/xform/core/relationship-xform.js +23 -0
  155. package/dist/es5/xlsx/xform/core/relationship-xform.js.map +1 -0
  156. package/dist/es5/xlsx/xform/core/relationships-xform.js +65 -0
  157. package/dist/es5/xlsx/xform/core/relationships-xform.js.map +1 -0
  158. package/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js +47 -0
  159. package/dist/es5/xlsx/xform/drawing/base-cell-anchor-xform.js.map +1 -0
  160. package/dist/es5/xlsx/xform/drawing/blip-fill-xform.js +61 -0
  161. package/dist/es5/xlsx/xform/drawing/blip-fill-xform.js.map +1 -0
  162. package/dist/es5/xlsx/xform/drawing/blip-xform.js +39 -0
  163. package/dist/es5/xlsx/xform/drawing/blip-xform.js.map +1 -0
  164. package/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js +35 -0
  165. package/dist/es5/xlsx/xform/drawing/c-nv-pic-pr-xform.js.map +1 -0
  166. package/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js +62 -0
  167. package/dist/es5/xlsx/xform/drawing/c-nv-pr-xform.js.map +1 -0
  168. package/dist/es5/xlsx/xform/drawing/cell-position-xform.js +82 -0
  169. package/dist/es5/xlsx/xform/drawing/cell-position-xform.js.map +1 -0
  170. package/dist/es5/xlsx/xform/drawing/drawing-xform.js +98 -0
  171. package/dist/es5/xlsx/xform/drawing/drawing-xform.js.map +1 -0
  172. package/dist/es5/xlsx/xform/drawing/ext-lst-xform.js +40 -0
  173. package/dist/es5/xlsx/xform/drawing/ext-lst-xform.js.map +1 -0
  174. package/dist/es5/xlsx/xform/drawing/ext-xform.js +38 -0
  175. package/dist/es5/xlsx/xform/drawing/ext-xform.js.map +1 -0
  176. package/dist/es5/xlsx/xform/drawing/hlink-click-xform.js +38 -0
  177. package/dist/es5/xlsx/xform/drawing/hlink-click-xform.js.map +1 -0
  178. package/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js +59 -0
  179. package/dist/es5/xlsx/xform/drawing/nv-pic-pr-xform.js.map +1 -0
  180. package/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js +63 -0
  181. package/dist/es5/xlsx/xform/drawing/one-cell-anchor-xform.js.map +1 -0
  182. package/dist/es5/xlsx/xform/drawing/pic-xform.js +67 -0
  183. package/dist/es5/xlsx/xform/drawing/pic-xform.js.map +1 -0
  184. package/dist/es5/xlsx/xform/drawing/sp-pr.js +30 -0
  185. package/dist/es5/xlsx/xform/drawing/sp-pr.js.map +1 -0
  186. package/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js +62 -0
  187. package/dist/es5/xlsx/xform/drawing/two-cell-anchor-xform.js.map +1 -0
  188. package/dist/es5/xlsx/xform/list-xform.js +91 -0
  189. package/dist/es5/xlsx/xform/list-xform.js.map +1 -0
  190. package/dist/es5/xlsx/xform/pivot-table/cache-field.js +48 -0
  191. package/dist/es5/xlsx/xform/pivot-table/cache-field.js.map +1 -0
  192. package/dist/es5/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +73 -0
  193. package/dist/es5/xlsx/xform/pivot-table/pivot-cache-definition-xform.js.map +1 -0
  194. package/dist/es5/xlsx/xform/pivot-table/pivot-cache-records-xform.js +93 -0
  195. package/dist/es5/xlsx/xform/pivot-table/pivot-cache-records-xform.js.map +1 -0
  196. package/dist/es5/xlsx/xform/pivot-table/pivot-table-xform.js +176 -0
  197. package/dist/es5/xlsx/xform/pivot-table/pivot-table-xform.js.map +1 -0
  198. package/dist/es5/xlsx/xform/sheet/auto-filter-xform.js +40 -0
  199. package/dist/es5/xlsx/xform/sheet/auto-filter-xform.js.map +1 -0
  200. package/dist/es5/xlsx/xform/sheet/cell-xform.js +450 -0
  201. package/dist/es5/xlsx/xform/sheet/cell-xform.js.map +1 -0
  202. package/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js +275 -0
  203. package/dist/es5/xlsx/xform/sheet/cf/cf-rule-xform.js.map +1 -0
  204. package/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js +25 -0
  205. package/dist/es5/xlsx/xform/sheet/cf/cfvo-xform.js.map +1 -0
  206. package/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js +38 -0
  207. package/dist/es5/xlsx/xform/sheet/cf/color-scale-xform.js.map +1 -0
  208. package/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js +45 -0
  209. package/dist/es5/xlsx/xform/sheet/cf/conditional-formatting-xform.js.map +1 -0
  210. package/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js +77 -0
  211. package/dist/es5/xlsx/xform/sheet/cf/conditional-formattings-xform.js.map +1 -0
  212. package/dist/es5/xlsx/xform/sheet/cf/databar-xform.js +42 -0
  213. package/dist/es5/xlsx/xform/sheet/cf/databar-xform.js.map +1 -0
  214. package/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +71 -0
  215. package/dist/es5/xlsx/xform/sheet/cf/ext-lst-ref-xform.js.map +1 -0
  216. package/dist/es5/xlsx/xform/sheet/cf/formula-xform.js +22 -0
  217. package/dist/es5/xlsx/xform/sheet/cf/formula-xform.js.map +1 -0
  218. package/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js +43 -0
  219. package/dist/es5/xlsx/xform/sheet/cf/icon-set-xform.js.map +1 -0
  220. package/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +28 -0
  221. package/dist/es5/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js.map +1 -0
  222. package/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +88 -0
  223. package/dist/es5/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js.map +1 -0
  224. package/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +38 -0
  225. package/dist/es5/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js.map +1 -0
  226. package/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +52 -0
  227. package/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js.map +1 -0
  228. package/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +43 -0
  229. package/dist/es5/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js.map +1 -0
  230. package/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +75 -0
  231. package/dist/es5/xlsx/xform/sheet/cf-ext/databar-ext-xform.js.map +1 -0
  232. package/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js +22 -0
  233. package/dist/es5/xlsx/xform/sheet/cf-ext/f-ext-xform.js.map +1 -0
  234. package/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +66 -0
  235. package/dist/es5/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js.map +1 -0
  236. package/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +22 -0
  237. package/dist/es5/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js.map +1 -0
  238. package/dist/es5/xlsx/xform/sheet/col-xform.js +78 -0
  239. package/dist/es5/xlsx/xform/sheet/col-xform.js.map +1 -0
  240. package/dist/es5/xlsx/xform/sheet/data-validations-xform.js +247 -0
  241. package/dist/es5/xlsx/xform/sheet/data-validations-xform.js.map +1 -0
  242. package/dist/es5/xlsx/xform/sheet/dimension-xform.js +28 -0
  243. package/dist/es5/xlsx/xform/sheet/dimension-xform.js.map +1 -0
  244. package/dist/es5/xlsx/xform/sheet/drawing-xform.js +32 -0
  245. package/dist/es5/xlsx/xform/sheet/drawing-xform.js.map +1 -0
  246. package/dist/es5/xlsx/xform/sheet/ext-lst-xform.js +69 -0
  247. package/dist/es5/xlsx/xform/sheet/ext-lst-xform.js.map +1 -0
  248. package/dist/es5/xlsx/xform/sheet/header-footer-xform.js +126 -0
  249. package/dist/es5/xlsx/xform/sheet/header-footer-xform.js.map +1 -0
  250. package/dist/es5/xlsx/xform/sheet/hyperlink-xform.js +50 -0
  251. package/dist/es5/xlsx/xform/sheet/hyperlink-xform.js.map +1 -0
  252. package/dist/es5/xlsx/xform/sheet/merge-cell-xform.js +26 -0
  253. package/dist/es5/xlsx/xform/sheet/merge-cell-xform.js.map +1 -0
  254. package/dist/es5/xlsx/xform/sheet/merges.js +52 -0
  255. package/dist/es5/xlsx/xform/sheet/merges.js.map +1 -0
  256. package/dist/es5/xlsx/xform/sheet/outline-properties-xform.js +35 -0
  257. package/dist/es5/xlsx/xform/sheet/outline-properties-xform.js.map +1 -0
  258. package/dist/es5/xlsx/xform/sheet/page-breaks-xform.js +24 -0
  259. package/dist/es5/xlsx/xform/sheet/page-breaks-xform.js.map +1 -0
  260. package/dist/es5/xlsx/xform/sheet/page-margins-xform.js +46 -0
  261. package/dist/es5/xlsx/xform/sheet/page-margins-xform.js.map +1 -0
  262. package/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js +32 -0
  263. package/dist/es5/xlsx/xform/sheet/page-setup-properties-xform.js.map +1 -0
  264. package/dist/es5/xlsx/xform/sheet/page-setup-xform.js +99 -0
  265. package/dist/es5/xlsx/xform/sheet/page-setup-xform.js.map +1 -0
  266. package/dist/es5/xlsx/xform/sheet/picture-xform.js +32 -0
  267. package/dist/es5/xlsx/xform/sheet/picture-xform.js.map +1 -0
  268. package/dist/es5/xlsx/xform/sheet/print-options-xform.js +45 -0
  269. package/dist/es5/xlsx/xform/sheet/print-options-xform.js.map +1 -0
  270. package/dist/es5/xlsx/xform/sheet/row-breaks-xform.js +37 -0
  271. package/dist/es5/xlsx/xform/sheet/row-breaks-xform.js.map +1 -0
  272. package/dist/es5/xlsx/xform/sheet/row-xform.js +128 -0
  273. package/dist/es5/xlsx/xform/sheet/row-xform.js.map +1 -0
  274. package/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js +51 -0
  275. package/dist/es5/xlsx/xform/sheet/sheet-format-properties-xform.js.map +1 -0
  276. package/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js +83 -0
  277. package/dist/es5/xlsx/xform/sheet/sheet-properties-xform.js.map +1 -0
  278. package/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js +84 -0
  279. package/dist/es5/xlsx/xform/sheet/sheet-protection-xform.js.map +1 -0
  280. package/dist/es5/xlsx/xform/sheet/sheet-view-xform.js +190 -0
  281. package/dist/es5/xlsx/xform/sheet/sheet-view-xform.js.map +1 -0
  282. package/dist/es5/xlsx/xform/sheet/table-part-xform.js +32 -0
  283. package/dist/es5/xlsx/xform/sheet/table-part-xform.js.map +1 -0
  284. package/dist/es5/xlsx/xform/sheet/worksheet-xform.js +522 -0
  285. package/dist/es5/xlsx/xform/sheet/worksheet-xform.js.map +1 -0
  286. package/dist/es5/xlsx/xform/simple/boolean-xform.js +27 -0
  287. package/dist/es5/xlsx/xform/simple/boolean-xform.js.map +1 -0
  288. package/dist/es5/xlsx/xform/simple/date-xform.js +58 -0
  289. package/dist/es5/xlsx/xform/simple/date-xform.js.map +1 -0
  290. package/dist/es5/xlsx/xform/simple/float-xform.js +47 -0
  291. package/dist/es5/xlsx/xform/simple/float-xform.js.map +1 -0
  292. package/dist/es5/xlsx/xform/simple/integer-xform.js +53 -0
  293. package/dist/es5/xlsx/xform/simple/integer-xform.js.map +1 -0
  294. package/dist/es5/xlsx/xform/simple/string-xform.js +47 -0
  295. package/dist/es5/xlsx/xform/simple/string-xform.js.map +1 -0
  296. package/dist/es5/xlsx/xform/static-xform.js +61 -0
  297. package/dist/es5/xlsx/xform/static-xform.js.map +1 -0
  298. package/dist/es5/xlsx/xform/strings/phonetic-text-xform.js +98 -0
  299. package/dist/es5/xlsx/xform/strings/phonetic-text-xform.js.map +1 -0
  300. package/dist/es5/xlsx/xform/strings/rich-text-xform.js +92 -0
  301. package/dist/es5/xlsx/xform/strings/rich-text-xform.js.map +1 -0
  302. package/dist/es5/xlsx/xform/strings/shared-string-xform.js +99 -0
  303. package/dist/es5/xlsx/xform/strings/shared-string-xform.js.map +1 -0
  304. package/dist/es5/xlsx/xform/strings/shared-strings-xform.js +114 -0
  305. package/dist/es5/xlsx/xform/strings/shared-strings-xform.js.map +1 -0
  306. package/dist/es5/xlsx/xform/strings/text-xform.js +39 -0
  307. package/dist/es5/xlsx/xform/strings/text-xform.js.map +1 -0
  308. package/dist/es5/xlsx/xform/style/alignment-xform.js +139 -0
  309. package/dist/es5/xlsx/xform/style/alignment-xform.js.map +1 -0
  310. package/dist/es5/xlsx/xform/style/border-xform.js +185 -0
  311. package/dist/es5/xlsx/xform/style/border-xform.js.map +1 -0
  312. package/dist/es5/xlsx/xform/style/color-xform.js +66 -0
  313. package/dist/es5/xlsx/xform/style/color-xform.js.map +1 -0
  314. package/dist/es5/xlsx/xform/style/dxf-xform.js +106 -0
  315. package/dist/es5/xlsx/xform/style/dxf-xform.js.map +1 -0
  316. package/dist/es5/xlsx/xform/style/fill-xform.js +307 -0
  317. package/dist/es5/xlsx/xform/style/fill-xform.js.map +1 -0
  318. package/dist/es5/xlsx/xform/style/font-xform.js +175 -0
  319. package/dist/es5/xlsx/xform/style/font-xform.js.map +1 -0
  320. package/dist/es5/xlsx/xform/style/numfmt-xform.js +58 -0
  321. package/dist/es5/xlsx/xform/style/numfmt-xform.js.map +1 -0
  322. package/dist/es5/xlsx/xform/style/protection-xform.js +53 -0
  323. package/dist/es5/xlsx/xform/style/protection-xform.js.map +1 -0
  324. package/dist/es5/xlsx/xform/style/style-xform.js +118 -0
  325. package/dist/es5/xlsx/xform/style/style-xform.js.map +1 -0
  326. package/dist/es5/xlsx/xform/style/styles-xform.js +611 -0
  327. package/dist/es5/xlsx/xform/style/styles-xform.js.map +1 -0
  328. package/dist/es5/xlsx/xform/style/underline-xform.js +46 -0
  329. package/dist/es5/xlsx/xform/style/underline-xform.js.map +1 -0
  330. package/dist/es5/xlsx/xform/table/auto-filter-xform.js +75 -0
  331. package/dist/es5/xlsx/xform/table/auto-filter-xform.js.map +1 -0
  332. package/dist/es5/xlsx/xform/table/custom-filter-xform.js +30 -0
  333. package/dist/es5/xlsx/xform/table/custom-filter-xform.js.map +1 -0
  334. package/dist/es5/xlsx/xform/table/filter-column-xform.js +89 -0
  335. package/dist/es5/xlsx/xform/table/filter-column-xform.js.map +1 -0
  336. package/dist/es5/xlsx/xform/table/filter-xform.js +28 -0
  337. package/dist/es5/xlsx/xform/table/filter-xform.js.map +1 -0
  338. package/dist/es5/xlsx/xform/table/table-column-xform.js +42 -0
  339. package/dist/es5/xlsx/xform/table/table-column-xform.js.map +1 -0
  340. package/dist/es5/xlsx/xform/table/table-style-info-xform.js +40 -0
  341. package/dist/es5/xlsx/xform/table/table-style-info-xform.js.map +1 -0
  342. package/dist/es5/xlsx/xform/table/table-xform.js +122 -0
  343. package/dist/es5/xlsx/xform/table/table-xform.js.map +1 -0
  344. package/dist/es5/xlsx/xlsx.js +775 -0
  345. package/dist/es5/xlsx/xlsx.js.map +1 -0
  346. package/dist/es5/xlsx/xml/theme1.js +5 -0
  347. package/dist/es5/xlsx/xml/theme1.js.map +1 -0
  348. package/dist/exceljs.bare.js +57759 -0
  349. package/dist/exceljs.bare.js.map +777 -0
  350. package/dist/exceljs.bare.min.js +45 -0
  351. package/dist/exceljs.bare.min.js.map +1 -0
  352. package/dist/exceljs.js +62398 -0
  353. package/dist/exceljs.js.map +1095 -0
  354. package/dist/exceljs.min.js +45 -0
  355. package/dist/exceljs.min.js.map +1 -0
  356. package/excel.js +13 -0
  357. package/index.d.ts +2040 -0
  358. package/index.ts +2 -0
  359. package/lib/csv/csv.js +191 -0
  360. package/lib/csv/line-buffer.js +74 -0
  361. package/lib/csv/stream-converter.js +135 -0
  362. package/lib/doc/anchor.js +91 -0
  363. package/lib/doc/cell.js +1124 -0
  364. package/lib/doc/column.js +320 -0
  365. package/lib/doc/data/theme1.json +234 -0
  366. package/lib/doc/data-validations.js +19 -0
  367. package/lib/doc/defined-names.js +196 -0
  368. package/lib/doc/enums.js +48 -0
  369. package/lib/doc/image.js +59 -0
  370. package/lib/doc/modelcontainer.js +18 -0
  371. package/lib/doc/note.js +65 -0
  372. package/lib/doc/pivot-table.js +132 -0
  373. package/lib/doc/range.js +257 -0
  374. package/lib/doc/row.js +415 -0
  375. package/lib/doc/table.js +465 -0
  376. package/lib/doc/workbook.js +224 -0
  377. package/lib/doc/worksheet.js +949 -0
  378. package/lib/exceljs.bare.js +13 -0
  379. package/lib/exceljs.browser.js +36 -0
  380. package/lib/exceljs.nodejs.js +14 -0
  381. package/lib/stream/xlsx/hyperlink-reader.js +83 -0
  382. package/lib/stream/xlsx/sheet-comments-writer.js +121 -0
  383. package/lib/stream/xlsx/sheet-rels-writer.js +119 -0
  384. package/lib/stream/xlsx/workbook-reader.js +337 -0
  385. package/lib/stream/xlsx/workbook-writer.js +347 -0
  386. package/lib/stream/xlsx/worksheet-reader.js +374 -0
  387. package/lib/stream/xlsx/worksheet-writer.js +717 -0
  388. package/lib/utils/auto-drain.js +15 -0
  389. package/lib/utils/browser-buffer-decode.js +14 -0
  390. package/lib/utils/browser-buffer-encode.js +15 -0
  391. package/lib/utils/cell-matrix.js +165 -0
  392. package/lib/utils/col-cache.js +287 -0
  393. package/lib/utils/copy-style.js +43 -0
  394. package/lib/utils/encryptor.js +55 -0
  395. package/lib/utils/iterate-stream.js +48 -0
  396. package/lib/utils/parse-sax.js +30 -0
  397. package/lib/utils/shared-formula.js +44 -0
  398. package/lib/utils/shared-strings.js +35 -0
  399. package/lib/utils/stream-base64.js +72 -0
  400. package/lib/utils/stream-buf.js +364 -0
  401. package/lib/utils/string-buf.js +82 -0
  402. package/lib/utils/string-builder.js +35 -0
  403. package/lib/utils/stuttered-pipe.js +67 -0
  404. package/lib/utils/typed-stack.js +24 -0
  405. package/lib/utils/under-dash.js +184 -0
  406. package/lib/utils/utils.js +205 -0
  407. package/lib/utils/xml-stream.js +169 -0
  408. package/lib/utils/zip-stream.js +87 -0
  409. package/lib/xlsx/.rels +11 -0
  410. package/lib/xlsx/calcChain.xml +6 -0
  411. package/lib/xlsx/core.xml +7 -0
  412. package/lib/xlsx/defaultnumformats.js +153 -0
  413. package/lib/xlsx/rel-type.js +20 -0
  414. package/lib/xlsx/styles.xml +41 -0
  415. package/lib/xlsx/workbook.xml +16 -0
  416. package/lib/xlsx/xform/base-xform.js +145 -0
  417. package/lib/xlsx/xform/book/defined-name-xform.js +91 -0
  418. package/lib/xlsx/xform/book/sheet-xform.js +34 -0
  419. package/lib/xlsx/xform/book/workbook-calc-properties-xform.js +26 -0
  420. package/lib/xlsx/xform/book/workbook-pivot-cache-xform.js +29 -0
  421. package/lib/xlsx/xform/book/workbook-properties-xform.js +29 -0
  422. package/lib/xlsx/xform/book/workbook-view-xform.js +53 -0
  423. package/lib/xlsx/xform/book/workbook-xform.js +259 -0
  424. package/lib/xlsx/xform/comment/comment-xform.js +105 -0
  425. package/lib/xlsx/xform/comment/comments-xform.js +82 -0
  426. package/lib/xlsx/xform/comment/style/vml-position-xform.js +39 -0
  427. package/lib/xlsx/xform/comment/style/vml-protection-xform.js +36 -0
  428. package/lib/xlsx/xform/comment/vml-anchor-xform.js +60 -0
  429. package/lib/xlsx/xform/comment/vml-client-data-xform.js +95 -0
  430. package/lib/xlsx/xform/comment/vml-notes-xform.js +107 -0
  431. package/lib/xlsx/xform/comment/vml-shape-xform.js +95 -0
  432. package/lib/xlsx/xform/comment/vml-textbox-xform.js +64 -0
  433. package/lib/xlsx/xform/composite-xform.js +56 -0
  434. package/lib/xlsx/xform/core/app-heading-pairs-xform.js +32 -0
  435. package/lib/xlsx/xform/core/app-titles-of-parts-xform.js +28 -0
  436. package/lib/xlsx/xform/core/app-xform.js +100 -0
  437. package/lib/xlsx/xform/core/content-types-xform.js +135 -0
  438. package/lib/xlsx/xform/core/core-xform.js +136 -0
  439. package/lib/xlsx/xform/core/relationship-xform.js +25 -0
  440. package/lib/xlsx/xform/core/relationships-xform.js +73 -0
  441. package/lib/xlsx/xform/drawing/base-cell-anchor-xform.js +48 -0
  442. package/lib/xlsx/xform/drawing/blip-fill-xform.js +71 -0
  443. package/lib/xlsx/xform/drawing/blip-xform.js +42 -0
  444. package/lib/xlsx/xform/drawing/c-nv-pic-pr-xform.js +38 -0
  445. package/lib/xlsx/xform/drawing/c-nv-pr-xform.js +68 -0
  446. package/lib/xlsx/xform/drawing/cell-position-xform.js +77 -0
  447. package/lib/xlsx/xform/drawing/drawing-xform.js +109 -0
  448. package/lib/xlsx/xform/drawing/ext-lst-xform.js +43 -0
  449. package/lib/xlsx/xform/drawing/ext-xform.js +44 -0
  450. package/lib/xlsx/xform/drawing/hlink-click-xform.js +41 -0
  451. package/lib/xlsx/xform/drawing/nv-pic-pr-xform.js +65 -0
  452. package/lib/xlsx/xform/drawing/one-cell-anchor-xform.js +63 -0
  453. package/lib/xlsx/xform/drawing/pic-xform.js +77 -0
  454. package/lib/xlsx/xform/drawing/sp-pr.js +17 -0
  455. package/lib/xlsx/xform/drawing/two-cell-anchor-xform.js +62 -0
  456. package/lib/xlsx/xform/list-xform.js +95 -0
  457. package/lib/xlsx/xform/pivot-table/cache-field.js +43 -0
  458. package/lib/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +77 -0
  459. package/lib/xlsx/xform/pivot-table/pivot-cache-records-xform.js +103 -0
  460. package/lib/xlsx/xform/pivot-table/pivot-table-xform.js +189 -0
  461. package/lib/xlsx/xform/sheet/auto-filter-xform.js +38 -0
  462. package/lib/xlsx/xform/sheet/cell-xform.js +498 -0
  463. package/lib/xlsx/xform/sheet/cf/cf-rule-xform.js +301 -0
  464. package/lib/xlsx/xform/sheet/cf/cfvo-xform.js +27 -0
  465. package/lib/xlsx/xform/sheet/cf/color-scale-xform.js +45 -0
  466. package/lib/xlsx/xform/sheet/cf/conditional-formatting-xform.js +48 -0
  467. package/lib/xlsx/xform/sheet/cf/conditional-formattings-xform.js +92 -0
  468. package/lib/xlsx/xform/sheet/cf/databar-xform.js +49 -0
  469. package/lib/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +87 -0
  470. package/lib/xlsx/xform/sheet/cf/formula-xform.js +25 -0
  471. package/lib/xlsx/xform/sheet/cf/icon-set-xform.js +47 -0
  472. package/lib/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +27 -0
  473. package/lib/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +98 -0
  474. package/lib/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +43 -0
  475. package/lib/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +62 -0
  476. package/lib/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +50 -0
  477. package/lib/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +98 -0
  478. package/lib/xlsx/xform/sheet/cf-ext/f-ext-xform.js +25 -0
  479. package/lib/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +73 -0
  480. package/lib/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +25 -0
  481. package/lib/xlsx/xform/sheet/col-xform.js +86 -0
  482. package/lib/xlsx/xform/sheet/data-validations-xform.js +257 -0
  483. package/lib/xlsx/xform/sheet/dimension-xform.js +29 -0
  484. package/lib/xlsx/xform/sheet/drawing-xform.js +33 -0
  485. package/lib/xlsx/xform/sheet/ext-lst-xform.js +86 -0
  486. package/lib/xlsx/xform/sheet/header-footer-xform.js +146 -0
  487. package/lib/xlsx/xform/sheet/hyperlink-xform.js +54 -0
  488. package/lib/xlsx/xform/sheet/merge-cell-xform.js +27 -0
  489. package/lib/xlsx/xform/sheet/merges.js +56 -0
  490. package/lib/xlsx/xform/sheet/outline-properties-xform.js +43 -0
  491. package/lib/xlsx/xform/sheet/page-breaks-xform.js +27 -0
  492. package/lib/xlsx/xform/sheet/page-margins-xform.js +49 -0
  493. package/lib/xlsx/xform/sheet/page-setup-properties-xform.js +35 -0
  494. package/lib/xlsx/xform/sheet/page-setup-xform.js +103 -0
  495. package/lib/xlsx/xform/sheet/picture-xform.js +33 -0
  496. package/lib/xlsx/xform/sheet/print-options-xform.js +49 -0
  497. package/lib/xlsx/xform/sheet/row-breaks-xform.js +39 -0
  498. package/lib/xlsx/xform/sheet/row-xform.js +142 -0
  499. package/lib/xlsx/xform/sheet/sheet-format-properties-xform.js +55 -0
  500. package/lib/xlsx/xform/sheet/sheet-properties-xform.js +90 -0
  501. package/lib/xlsx/xform/sheet/sheet-protection-xform.js +89 -0
  502. package/lib/xlsx/xform/sheet/sheet-view-xform.js +202 -0
  503. package/lib/xlsx/xform/sheet/table-part-xform.js +33 -0
  504. package/lib/xlsx/xform/sheet/worksheet-xform.js +548 -0
  505. package/lib/xlsx/xform/simple/boolean-xform.js +31 -0
  506. package/lib/xlsx/xform/simple/date-xform.js +66 -0
  507. package/lib/xlsx/xform/simple/float-xform.js +51 -0
  508. package/lib/xlsx/xform/simple/integer-xform.js +57 -0
  509. package/lib/xlsx/xform/simple/string-xform.js +51 -0
  510. package/lib/xlsx/xform/static-xform.js +64 -0
  511. package/lib/xlsx/xform/strings/phonetic-text-xform.js +98 -0
  512. package/lib/xlsx/xform/strings/rich-text-xform.js +101 -0
  513. package/lib/xlsx/xform/strings/shared-string-xform.js +102 -0
  514. package/lib/xlsx/xform/strings/shared-strings-xform.js +127 -0
  515. package/lib/xlsx/xform/strings/text-xform.js +44 -0
  516. package/lib/xlsx/xform/style/alignment-xform.js +172 -0
  517. package/lib/xlsx/xform/style/border-xform.js +207 -0
  518. package/lib/xlsx/xform/style/color-xform.js +63 -0
  519. package/lib/xlsx/xform/style/dxf-xform.js +111 -0
  520. package/lib/xlsx/xform/style/fill-xform.js +364 -0
  521. package/lib/xlsx/xform/style/font-xform.js +102 -0
  522. package/lib/xlsx/xform/style/numfmt-xform.js +63 -0
  523. package/lib/xlsx/xform/style/protection-xform.js +60 -0
  524. package/lib/xlsx/xform/style/style-xform.js +125 -0
  525. package/lib/xlsx/xform/style/styles-xform.js +527 -0
  526. package/lib/xlsx/xform/style/underline-xform.js +47 -0
  527. package/lib/xlsx/xform/table/auto-filter-xform.js +81 -0
  528. package/lib/xlsx/xform/table/custom-filter-xform.js +33 -0
  529. package/lib/xlsx/xform/table/filter-column-xform.js +96 -0
  530. package/lib/xlsx/xform/table/filter-xform.js +31 -0
  531. package/lib/xlsx/xform/table/table-column-xform.js +44 -0
  532. package/lib/xlsx/xform/table/table-style-info-xform.js +41 -0
  533. package/lib/xlsx/xform/table/table-xform.js +131 -0
  534. package/lib/xlsx/xlsx.js +774 -0
  535. package/lib/xlsx/xml/theme1.js +3 -0
  536. package/lib/xlsx/xml/theme1.xml +318 -0
  537. package/package.json +149 -0
@@ -0,0 +1,774 @@
1
+ const fs = require('fs');
2
+ const JSZip = require('jszip');
3
+ const {PassThrough} = require('readable-stream');
4
+ const ZipStream = require('../utils/zip-stream');
5
+ const StreamBuf = require('../utils/stream-buf');
6
+
7
+ const utils = require('../utils/utils');
8
+ const XmlStream = require('../utils/xml-stream');
9
+ const {bufferToString} = require('../utils/browser-buffer-decode');
10
+
11
+ const StylesXform = require('./xform/style/styles-xform');
12
+
13
+ const CoreXform = require('./xform/core/core-xform');
14
+ const SharedStringsXform = require('./xform/strings/shared-strings-xform');
15
+ const RelationshipsXform = require('./xform/core/relationships-xform');
16
+ const ContentTypesXform = require('./xform/core/content-types-xform');
17
+ const AppXform = require('./xform/core/app-xform');
18
+ const WorkbookXform = require('./xform/book/workbook-xform');
19
+ const WorksheetXform = require('./xform/sheet/worksheet-xform');
20
+ const DrawingXform = require('./xform/drawing/drawing-xform');
21
+ const TableXform = require('./xform/table/table-xform');
22
+ const PivotCacheRecordsXform = require('./xform/pivot-table/pivot-cache-records-xform');
23
+ const PivotCacheDefinitionXform = require('./xform/pivot-table/pivot-cache-definition-xform');
24
+ const PivotTableXform = require('./xform/pivot-table/pivot-table-xform');
25
+ const CommentsXform = require('./xform/comment/comments-xform');
26
+ const VmlNotesXform = require('./xform/comment/vml-notes-xform');
27
+
28
+ const theme1Xml = require('./xml/theme1');
29
+
30
+ function fsReadFileAsync(filename, options) {
31
+ return new Promise((resolve, reject) => {
32
+ fs.readFile(filename, options, (error, data) => {
33
+ if (error) {
34
+ reject(error);
35
+ } else {
36
+ resolve(data);
37
+ }
38
+ });
39
+ });
40
+ }
41
+
42
+ class XLSX {
43
+ constructor(workbook) {
44
+ this.workbook = workbook;
45
+ }
46
+
47
+ // ===============================================================================
48
+ // Workbook
49
+ // =========================================================================
50
+ // Read
51
+
52
+ async readFile(filename, options) {
53
+ if (!(await utils.fs.exists(filename))) {
54
+ throw new Error(`File not found: ${filename}`);
55
+ }
56
+ const stream = fs.createReadStream(filename);
57
+ try {
58
+ const workbook = await this.read(stream, options);
59
+ stream.close();
60
+ return workbook;
61
+ } catch (error) {
62
+ stream.close();
63
+ throw error;
64
+ }
65
+ }
66
+
67
+ parseRels(stream) {
68
+ const xform = new RelationshipsXform();
69
+ return xform.parseStream(stream);
70
+ }
71
+
72
+ parseWorkbook(stream) {
73
+ const xform = new WorkbookXform();
74
+ return xform.parseStream(stream);
75
+ }
76
+
77
+ parseSharedStrings(stream) {
78
+ const xform = new SharedStringsXform();
79
+ return xform.parseStream(stream);
80
+ }
81
+
82
+ reconcile(model, options) {
83
+ const workbookXform = new WorkbookXform();
84
+ const worksheetXform = new WorksheetXform(options);
85
+ const drawingXform = new DrawingXform();
86
+ const tableXform = new TableXform();
87
+
88
+ workbookXform.reconcile(model);
89
+
90
+ // reconcile drawings with their rels
91
+ const drawingOptions = {
92
+ media: model.media,
93
+ mediaIndex: model.mediaIndex,
94
+ };
95
+ Object.keys(model.drawings).forEach(name => {
96
+ const drawing = model.drawings[name];
97
+ const drawingRel = model.drawingRels[name];
98
+ if (drawingRel) {
99
+ drawingOptions.rels = drawingRel.reduce((o, rel) => {
100
+ o[rel.Id] = rel;
101
+ return o;
102
+ }, {});
103
+ (drawing.anchors || []).forEach(anchor => {
104
+ const hyperlinks = anchor.picture && anchor.picture.hyperlinks;
105
+ if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {
106
+ hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;
107
+ delete hyperlinks.rId;
108
+ }
109
+ });
110
+ drawingXform.reconcile(drawing, drawingOptions);
111
+ }
112
+ });
113
+
114
+ // reconcile tables with the default styles
115
+ const tableOptions = {
116
+ styles: model.styles,
117
+ };
118
+ Object.values(model.tables).forEach(table => {
119
+ tableXform.reconcile(table, tableOptions);
120
+ });
121
+
122
+ const sheetOptions = {
123
+ styles: model.styles,
124
+ sharedStrings: model.sharedStrings,
125
+ media: model.media,
126
+ mediaIndex: model.mediaIndex,
127
+ date1904: model.properties && model.properties.date1904,
128
+ drawings: model.drawings,
129
+ comments: model.comments,
130
+ tables: model.tables,
131
+ vmlDrawings: model.vmlDrawings,
132
+ };
133
+ model.worksheets.forEach(worksheet => {
134
+ worksheet.relationships = model.worksheetRels[worksheet.sheetNo];
135
+ worksheetXform.reconcile(worksheet, sheetOptions);
136
+ });
137
+
138
+ // delete unnecessary parts
139
+ delete model.worksheetHash;
140
+ delete model.worksheetRels;
141
+ delete model.globalRels;
142
+ delete model.sharedStrings;
143
+ delete model.workbookRels;
144
+ delete model.sheetDefs;
145
+ delete model.styles;
146
+ delete model.mediaIndex;
147
+ delete model.drawings;
148
+ delete model.drawingRels;
149
+ delete model.vmlDrawings;
150
+ }
151
+
152
+ async _processWorksheetEntry(stream, model, sheetNo, options, path) {
153
+ const xform = new WorksheetXform(options);
154
+ const worksheet = await xform.parseStream(stream);
155
+ worksheet.sheetNo = sheetNo;
156
+ model.worksheetHash[path] = worksheet;
157
+ model.worksheets.push(worksheet);
158
+ }
159
+
160
+ async _processCommentEntry(stream, model, name) {
161
+ const xform = new CommentsXform();
162
+ const comments = await xform.parseStream(stream);
163
+ model.comments[`../${name}.xml`] = comments;
164
+ }
165
+
166
+ async _processTableEntry(stream, model, name) {
167
+ const xform = new TableXform();
168
+ const table = await xform.parseStream(stream);
169
+ model.tables[`../tables/${name}.xml`] = table;
170
+ }
171
+
172
+ async _processWorksheetRelsEntry(stream, model, sheetNo) {
173
+ const xform = new RelationshipsXform();
174
+ const relationships = await xform.parseStream(stream);
175
+ model.worksheetRels[sheetNo] = relationships;
176
+ }
177
+
178
+ async _processMediaEntry(entry, model, filename) {
179
+ const lastDot = filename.lastIndexOf('.');
180
+ // if we can't determine extension, ignore it
181
+ if (lastDot >= 1) {
182
+ const extension = filename.substr(lastDot + 1);
183
+ const name = filename.substr(0, lastDot);
184
+ await new Promise((resolve, reject) => {
185
+ const streamBuf = new StreamBuf();
186
+ streamBuf.on('finish', () => {
187
+ model.mediaIndex[filename] = model.media.length;
188
+ model.mediaIndex[name] = model.media.length;
189
+ const medium = {
190
+ type: 'image',
191
+ name,
192
+ extension,
193
+ buffer: streamBuf.toBuffer(),
194
+ };
195
+ model.media.push(medium);
196
+ resolve();
197
+ });
198
+ entry.on('error', error => {
199
+ reject(error);
200
+ });
201
+ entry.pipe(streamBuf);
202
+ });
203
+ }
204
+ }
205
+
206
+ async _processDrawingEntry(entry, model, name) {
207
+ const xform = new DrawingXform();
208
+ const drawing = await xform.parseStream(entry);
209
+ model.drawings[name] = drawing;
210
+ }
211
+
212
+ async _processDrawingRelsEntry(entry, model, name) {
213
+ const xform = new RelationshipsXform();
214
+ const relationships = await xform.parseStream(entry);
215
+ model.drawingRels[name] = relationships;
216
+ }
217
+
218
+ async _processVmlDrawingEntry(entry, model, name) {
219
+ const xform = new VmlNotesXform();
220
+ const vmlDrawing = await xform.parseStream(entry);
221
+ model.vmlDrawings[`../drawings/${name}.vml`] = vmlDrawing;
222
+ }
223
+
224
+ async _processThemeEntry(entry, model, name) {
225
+ await new Promise((resolve, reject) => {
226
+ // TODO: stream entry into buffer and store the xml in the model.themes[]
227
+ const stream = new StreamBuf();
228
+ entry.on('error', reject);
229
+ stream.on('error', reject);
230
+ stream.on('finish', () => {
231
+ model.themes[name] = stream.read().toString();
232
+ resolve();
233
+ });
234
+ entry.pipe(stream);
235
+ });
236
+ }
237
+
238
+ /**
239
+ * @deprecated since version 4.0. You should use `#read` instead. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md
240
+ */
241
+ createInputStream() {
242
+ throw new Error(
243
+ '`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md'
244
+ );
245
+ }
246
+
247
+ async read(stream, options) {
248
+ // TODO: Remove once node v8 is deprecated
249
+ // Detect and upgrade old streams
250
+ if (!stream[Symbol.asyncIterator] && stream.pipe) {
251
+ stream = stream.pipe(new PassThrough());
252
+ }
253
+ const chunks = [];
254
+ for await (const chunk of stream) {
255
+ chunks.push(chunk);
256
+ }
257
+ return this.load(Buffer.concat(chunks), options);
258
+ }
259
+
260
+ async load(data, options) {
261
+ let buffer;
262
+ if (options && options.base64) {
263
+ buffer = Buffer.from(data.toString(), 'base64');
264
+ } else {
265
+ buffer = data;
266
+ }
267
+
268
+ const model = {
269
+ worksheets: [],
270
+ worksheetHash: {},
271
+ worksheetRels: [],
272
+ themes: {},
273
+ media: [],
274
+ mediaIndex: {},
275
+ drawings: {},
276
+ drawingRels: {},
277
+ comments: {},
278
+ tables: {},
279
+ vmlDrawings: {},
280
+ };
281
+
282
+ const zip = await JSZip.loadAsync(buffer);
283
+ for (const entry of Object.values(zip.files)) {
284
+ /* eslint-disable no-await-in-loop */
285
+ if (!entry.dir) {
286
+ let entryName = entry.name;
287
+ if (entryName[0] === '/') {
288
+ entryName = entryName.substr(1);
289
+ }
290
+ let stream;
291
+ if (
292
+ entryName.match(/xl\/media\//) ||
293
+ // themes are not parsed as stream
294
+ entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/)
295
+ ) {
296
+ stream = new PassThrough();
297
+ stream.write(await entry.async('nodebuffer'));
298
+ } else {
299
+ // use object mode to avoid buffer-string convention
300
+ stream = new PassThrough({
301
+ writableObjectMode: true,
302
+ readableObjectMode: true,
303
+ });
304
+ let content;
305
+ // https://www.npmjs.com/package/process
306
+ if (process.browser) {
307
+ // running in browser, use TextDecoder if possible
308
+ content = bufferToString(await entry.async('nodebuffer'));
309
+ } else {
310
+ // running in node.js
311
+ content = await entry.async('string');
312
+ }
313
+ const chunkSize = 16 * 1024;
314
+ for (let i = 0; i < content.length; i += chunkSize) {
315
+ stream.write(content.substring(i, i + chunkSize));
316
+ }
317
+ }
318
+ stream.end();
319
+ switch (entryName) {
320
+ case '_rels/.rels':
321
+ model.globalRels = await this.parseRels(stream);
322
+ break;
323
+
324
+ case 'xl/workbook.xml': {
325
+ const workbook = await this.parseWorkbook(stream);
326
+ model.sheets = workbook.sheets;
327
+ model.definedNames = workbook.definedNames;
328
+ model.views = workbook.views;
329
+ model.properties = workbook.properties;
330
+ model.calcProperties = workbook.calcProperties;
331
+ break;
332
+ }
333
+
334
+ case 'xl/_rels/workbook.xml.rels':
335
+ model.workbookRels = await this.parseRels(stream);
336
+ break;
337
+
338
+ case 'xl/sharedStrings.xml':
339
+ model.sharedStrings = new SharedStringsXform();
340
+ await model.sharedStrings.parseStream(stream);
341
+ break;
342
+
343
+ case 'xl/styles.xml':
344
+ model.styles = new StylesXform();
345
+ await model.styles.parseStream(stream);
346
+ break;
347
+
348
+ case 'docProps/app.xml': {
349
+ const appXform = new AppXform();
350
+ const appProperties = await appXform.parseStream(stream);
351
+ model.company = appProperties.company;
352
+ model.manager = appProperties.manager;
353
+ break;
354
+ }
355
+
356
+ case 'docProps/core.xml': {
357
+ const coreXform = new CoreXform();
358
+ const coreProperties = await coreXform.parseStream(stream);
359
+ Object.assign(model, coreProperties);
360
+ break;
361
+ }
362
+
363
+ default: {
364
+ let match = entryName.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
365
+ if (match) {
366
+ await this._processWorksheetEntry(stream, model, match[1], options, entryName);
367
+ break;
368
+ }
369
+ match = entryName.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/);
370
+ if (match) {
371
+ await this._processWorksheetRelsEntry(stream, model, match[1]);
372
+ break;
373
+ }
374
+ match = entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/);
375
+ if (match) {
376
+ await this._processThemeEntry(stream, model, match[1]);
377
+ break;
378
+ }
379
+ match = entryName.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/);
380
+ if (match) {
381
+ await this._processMediaEntry(stream, model, match[1]);
382
+ break;
383
+ }
384
+ match = entryName.match(/xl\/drawings\/([a-zA-Z0-9]+)[.]xml/);
385
+ if (match) {
386
+ await this._processDrawingEntry(stream, model, match[1]);
387
+ break;
388
+ }
389
+ match = entryName.match(/xl\/(comments\d+)[.]xml/);
390
+ if (match) {
391
+ await this._processCommentEntry(stream, model, match[1]);
392
+ break;
393
+ }
394
+ match = entryName.match(/xl\/tables\/(table\d+)[.]xml/);
395
+ if (match) {
396
+ await this._processTableEntry(stream, model, match[1]);
397
+ break;
398
+ }
399
+ match = entryName.match(/xl\/drawings\/_rels\/([a-zA-Z0-9]+)[.]xml[.]rels/);
400
+ if (match) {
401
+ await this._processDrawingRelsEntry(stream, model, match[1]);
402
+ break;
403
+ }
404
+ match = entryName.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/);
405
+ if (match) {
406
+ await this._processVmlDrawingEntry(stream, model, match[1]);
407
+ break;
408
+ }
409
+ }
410
+ }
411
+ }
412
+ }
413
+
414
+ this.reconcile(model, options);
415
+
416
+ // apply model
417
+ this.workbook.model = model;
418
+ return this.workbook;
419
+ }
420
+
421
+ // =========================================================================
422
+ // Write
423
+
424
+ async addMedia(zip, model) {
425
+ await Promise.all(
426
+ model.media.map(async medium => {
427
+ if (medium.type === 'image') {
428
+ const filename = `xl/media/${medium.name}.${medium.extension}`;
429
+ if (medium.filename) {
430
+ const data = await fsReadFileAsync(medium.filename);
431
+ return zip.append(data, {name: filename});
432
+ }
433
+ if (medium.buffer) {
434
+ return zip.append(medium.buffer, {name: filename});
435
+ }
436
+ if (medium.base64) {
437
+ const dataimg64 = medium.base64;
438
+ const content = dataimg64.substring(dataimg64.indexOf(',') + 1);
439
+ return zip.append(content, {name: filename, base64: true});
440
+ }
441
+ }
442
+ throw new Error('Unsupported media');
443
+ })
444
+ );
445
+ }
446
+
447
+ addDrawings(zip, model) {
448
+ const drawingXform = new DrawingXform();
449
+ const relsXform = new RelationshipsXform();
450
+
451
+ model.worksheets.forEach(worksheet => {
452
+ const {drawing} = worksheet;
453
+ if (drawing) {
454
+ drawingXform.prepare(drawing, {});
455
+ let xml = drawingXform.toXml(drawing);
456
+ zip.append(xml, {name: `xl/drawings/${drawing.name}.xml`});
457
+
458
+ xml = relsXform.toXml(drawing.rels);
459
+ zip.append(xml, {name: `xl/drawings/_rels/${drawing.name}.xml.rels`});
460
+ }
461
+ });
462
+ }
463
+
464
+ addTables(zip, model) {
465
+ const tableXform = new TableXform();
466
+
467
+ model.worksheets.forEach(worksheet => {
468
+ const {tables} = worksheet;
469
+ tables.forEach(table => {
470
+ tableXform.prepare(table, {});
471
+ const tableXml = tableXform.toXml(table);
472
+ zip.append(tableXml, {name: `xl/tables/${table.target}`});
473
+ });
474
+ });
475
+ }
476
+
477
+ addPivotTables(zip, model) {
478
+ if (!model.pivotTables.length) return;
479
+
480
+ const pivotTable = model.pivotTables[0];
481
+
482
+ const pivotCacheRecordsXform = new PivotCacheRecordsXform();
483
+ const pivotCacheDefinitionXform = new PivotCacheDefinitionXform();
484
+ const pivotTableXform = new PivotTableXform();
485
+ const relsXform = new RelationshipsXform();
486
+
487
+ // pivot cache records
488
+ // --------------------------------------------------
489
+ // copy of the source data.
490
+ //
491
+ // Note: cells in the columns of the source data which are part
492
+ // of the "rows" or "columns" of the pivot table configuration are
493
+ // replaced by references to their __cache field__ identifiers.
494
+ // See "pivot cache definition" below.
495
+
496
+ let xml = pivotCacheRecordsXform.toXml(pivotTable);
497
+ zip.append(xml, {name: 'xl/pivotCache/pivotCacheRecords1.xml'});
498
+
499
+ // pivot cache definition
500
+ // --------------------------------------------------
501
+ // cache source (source data):
502
+ // ref="A1:E7" on sheet="Sheet1"
503
+ // cache fields:
504
+ // - 0: "A" (a1, a2, a3)
505
+ // - 1: "B" (b1, b2)
506
+ // - ...
507
+
508
+ xml = pivotCacheDefinitionXform.toXml(pivotTable);
509
+ zip.append(xml, {name: 'xl/pivotCache/pivotCacheDefinition1.xml'});
510
+
511
+ xml = relsXform.toXml([
512
+ {
513
+ Id: 'rId1',
514
+ Type: XLSX.RelType.PivotCacheRecords,
515
+ Target: 'pivotCacheRecords1.xml',
516
+ },
517
+ ]);
518
+ zip.append(xml, {name: 'xl/pivotCache/_rels/pivotCacheDefinition1.xml.rels'});
519
+
520
+ // pivot tables (on destination worksheet)
521
+ // --------------------------------------------------
522
+ // location: ref="A3:E15"
523
+ // pivotFields
524
+ // rowFields and rowItems
525
+ // colFields and colItems
526
+ // dataFields
527
+ // pivotTableStyleInfo
528
+
529
+ xml = pivotTableXform.toXml(pivotTable);
530
+ zip.append(xml, {name: 'xl/pivotTables/pivotTable1.xml'});
531
+
532
+ xml = relsXform.toXml([
533
+ {
534
+ Id: 'rId1',
535
+ Type: XLSX.RelType.PivotCacheDefinition,
536
+ Target: '../pivotCache/pivotCacheDefinition1.xml',
537
+ },
538
+ ]);
539
+ zip.append(xml, {name: 'xl/pivotTables/_rels/pivotTable1.xml.rels'});
540
+ }
541
+
542
+ async addContentTypes(zip, model) {
543
+ const xform = new ContentTypesXform();
544
+ const xml = xform.toXml(model);
545
+ zip.append(xml, {name: '[Content_Types].xml'});
546
+ }
547
+
548
+ async addApp(zip, model) {
549
+ const xform = new AppXform();
550
+ const xml = xform.toXml(model);
551
+ zip.append(xml, {name: 'docProps/app.xml'});
552
+ }
553
+
554
+ async addCore(zip, model) {
555
+ const coreXform = new CoreXform();
556
+ zip.append(coreXform.toXml(model), {name: 'docProps/core.xml'});
557
+ }
558
+
559
+ async addThemes(zip, model) {
560
+ const themes = model.themes || {theme1: theme1Xml};
561
+ Object.keys(themes).forEach(name => {
562
+ const xml = themes[name];
563
+ const path = `xl/theme/${name}.xml`;
564
+ zip.append(xml, {name: path});
565
+ });
566
+ }
567
+
568
+ async addOfficeRels(zip) {
569
+ const xform = new RelationshipsXform();
570
+ const xml = xform.toXml([
571
+ {Id: 'rId1', Type: XLSX.RelType.OfficeDocument, Target: 'xl/workbook.xml'},
572
+ {Id: 'rId2', Type: XLSX.RelType.CoreProperties, Target: 'docProps/core.xml'},
573
+ {Id: 'rId3', Type: XLSX.RelType.ExtenderProperties, Target: 'docProps/app.xml'},
574
+ ]);
575
+ zip.append(xml, {name: '_rels/.rels'});
576
+ }
577
+
578
+ async addWorkbookRels(zip, model) {
579
+ let count = 1;
580
+ const relationships = [
581
+ {Id: `rId${count++}`, Type: XLSX.RelType.Styles, Target: 'styles.xml'},
582
+ {Id: `rId${count++}`, Type: XLSX.RelType.Theme, Target: 'theme/theme1.xml'},
583
+ ];
584
+ if (model.sharedStrings.count) {
585
+ relationships.push({
586
+ Id: `rId${count++}`,
587
+ Type: XLSX.RelType.SharedStrings,
588
+ Target: 'sharedStrings.xml',
589
+ });
590
+ }
591
+ if ((model.pivotTables || []).length) {
592
+ const pivotTable = model.pivotTables[0];
593
+ pivotTable.rId = `rId${count++}`;
594
+ relationships.push({
595
+ Id: pivotTable.rId,
596
+ Type: XLSX.RelType.PivotCacheDefinition,
597
+ Target: 'pivotCache/pivotCacheDefinition1.xml',
598
+ });
599
+ }
600
+ model.worksheets.forEach(worksheet => {
601
+ worksheet.rId = `rId${count++}`;
602
+ relationships.push({
603
+ Id: worksheet.rId,
604
+ Type: XLSX.RelType.Worksheet,
605
+ Target: `worksheets/sheet${worksheet.id}.xml`,
606
+ });
607
+ });
608
+ const xform = new RelationshipsXform();
609
+ const xml = xform.toXml(relationships);
610
+ zip.append(xml, {name: 'xl/_rels/workbook.xml.rels'});
611
+ }
612
+
613
+ async addSharedStrings(zip, model) {
614
+ if (model.sharedStrings && model.sharedStrings.count) {
615
+ zip.append(model.sharedStrings.xml, {name: 'xl/sharedStrings.xml'});
616
+ }
617
+ }
618
+
619
+ async addStyles(zip, model) {
620
+ const {xml} = model.styles;
621
+ if (xml) {
622
+ zip.append(xml, {name: 'xl/styles.xml'});
623
+ }
624
+ }
625
+
626
+ async addWorkbook(zip, model) {
627
+ const xform = new WorkbookXform();
628
+ zip.append(xform.toXml(model), {name: 'xl/workbook.xml'});
629
+ }
630
+
631
+ async addWorksheets(zip, model) {
632
+ // preparation phase
633
+ const worksheetXform = new WorksheetXform();
634
+ const relationshipsXform = new RelationshipsXform();
635
+ const commentsXform = new CommentsXform();
636
+ const vmlNotesXform = new VmlNotesXform();
637
+
638
+ // write sheets
639
+ model.worksheets.forEach(worksheet => {
640
+ let xmlStream = new XmlStream();
641
+ worksheetXform.render(xmlStream, worksheet);
642
+ zip.append(xmlStream.xml, {name: `xl/worksheets/sheet${worksheet.id}.xml`});
643
+
644
+ if (worksheet.rels && worksheet.rels.length) {
645
+ xmlStream = new XmlStream();
646
+ relationshipsXform.render(xmlStream, worksheet.rels);
647
+ zip.append(xmlStream.xml, {name: `xl/worksheets/_rels/sheet${worksheet.id}.xml.rels`});
648
+ }
649
+
650
+ if (worksheet.comments.length > 0) {
651
+ xmlStream = new XmlStream();
652
+ commentsXform.render(xmlStream, worksheet);
653
+ zip.append(xmlStream.xml, {name: `xl/comments${worksheet.id}.xml`});
654
+
655
+ xmlStream = new XmlStream();
656
+ vmlNotesXform.render(xmlStream, worksheet);
657
+ zip.append(xmlStream.xml, {name: `xl/drawings/vmlDrawing${worksheet.id}.vml`});
658
+ }
659
+ });
660
+ }
661
+
662
+ _finalize(zip) {
663
+ return new Promise((resolve, reject) => {
664
+ zip.on('finish', () => {
665
+ resolve(this);
666
+ });
667
+ zip.on('error', reject);
668
+ zip.finalize();
669
+ });
670
+ }
671
+
672
+ prepareModel(model, options) {
673
+ // ensure following properties have sane values
674
+ model.creator = model.creator || 'ExcelJS';
675
+ model.lastModifiedBy = model.lastModifiedBy || 'ExcelJS';
676
+ model.created = model.created || new Date();
677
+ model.modified = model.modified || new Date();
678
+
679
+ model.useSharedStrings = options.useSharedStrings !== undefined ? options.useSharedStrings : true;
680
+ model.useStyles = options.useStyles !== undefined ? options.useStyles : true;
681
+
682
+ // Manage the shared strings
683
+ model.sharedStrings = new SharedStringsXform();
684
+
685
+ // add a style manager to handle cell formats, fonts, etc.
686
+ model.styles = model.useStyles ? new StylesXform(true) : new StylesXform.Mock();
687
+
688
+ // prepare all of the things before the render
689
+ const workbookXform = new WorkbookXform();
690
+ const worksheetXform = new WorksheetXform();
691
+
692
+ workbookXform.prepare(model);
693
+
694
+ const worksheetOptions = {
695
+ sharedStrings: model.sharedStrings,
696
+ styles: model.styles,
697
+ date1904: model.properties.date1904,
698
+ drawingsCount: 0,
699
+ media: model.media,
700
+ };
701
+ worksheetOptions.drawings = model.drawings = [];
702
+ worksheetOptions.commentRefs = model.commentRefs = [];
703
+ let tableCount = 0;
704
+ model.tables = [];
705
+ model.worksheets.forEach(worksheet => {
706
+ // assign unique filenames to tables
707
+ worksheet.tables.forEach(table => {
708
+ tableCount++;
709
+ table.target = `table${tableCount}.xml`;
710
+ table.id = tableCount;
711
+ model.tables.push(table);
712
+ });
713
+
714
+ worksheetXform.prepare(worksheet, worksheetOptions);
715
+ });
716
+
717
+ // TODO: workbook drawing list
718
+ }
719
+
720
+ async write(stream, options) {
721
+ options = options || {};
722
+ const {model} = this.workbook;
723
+ const zip = new ZipStream.ZipWriter(options.zip);
724
+ zip.pipe(stream);
725
+
726
+ this.prepareModel(model, options);
727
+
728
+ // render
729
+ await this.addContentTypes(zip, model);
730
+ await this.addOfficeRels(zip, model);
731
+ await this.addWorkbookRels(zip, model);
732
+ await this.addWorksheets(zip, model);
733
+ await this.addSharedStrings(zip, model); // always after worksheets
734
+ await this.addDrawings(zip, model);
735
+ await this.addTables(zip, model);
736
+ await this.addPivotTables(zip, model);
737
+ await Promise.all([this.addThemes(zip, model), this.addStyles(zip, model)]);
738
+ await this.addMedia(zip, model);
739
+ await Promise.all([this.addApp(zip, model), this.addCore(zip, model)]);
740
+ await this.addWorkbook(zip, model);
741
+ return this._finalize(zip);
742
+ }
743
+
744
+ writeFile(filename, options) {
745
+ const stream = fs.createWriteStream(filename);
746
+
747
+ return new Promise((resolve, reject) => {
748
+ stream.on('finish', () => {
749
+ resolve();
750
+ });
751
+ stream.on('error', error => {
752
+ reject(error);
753
+ });
754
+
755
+ this.write(stream, options)
756
+ .then(() => {
757
+ stream.end();
758
+ })
759
+ .catch(err => {
760
+ reject(err);
761
+ });
762
+ });
763
+ }
764
+
765
+ async writeBuffer(options) {
766
+ const stream = new StreamBuf();
767
+ await this.write(stream, options);
768
+ return stream.read();
769
+ }
770
+ }
771
+
772
+ XLSX.RelType = require('./rel-type');
773
+
774
+ module.exports = XLSX;