@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,949 @@
1
+ const _ = require('../utils/under-dash');
2
+
3
+ const colCache = require('../utils/col-cache');
4
+ const Range = require('./range');
5
+ const Row = require('./row');
6
+ const Column = require('./column');
7
+ const Enums = require('./enums');
8
+ const Image = require('./image');
9
+ const Table = require('./table');
10
+ const DataValidations = require('./data-validations');
11
+ const {makePivotTable} = require('./pivot-table');
12
+ const Encryptor = require('../utils/encryptor');
13
+ const {copyStyle} = require('../utils/copy-style');
14
+
15
+ // Worksheet requirements
16
+ // Operate as sheet inside workbook or standalone
17
+ // Load and Save from file and stream
18
+ // Access/Add/Delete individual cells
19
+ // Manage column widths and row heights
20
+
21
+ class Worksheet {
22
+ constructor(options) {
23
+ options = options || {};
24
+ this._workbook = options.workbook;
25
+
26
+ // in a workbook, each sheet will have a number
27
+ this.id = options.id;
28
+ this.orderNo = options.orderNo;
29
+
30
+ // and a name
31
+ this.name = options.name;
32
+
33
+ // add a state
34
+ this.state = options.state || 'visible';
35
+
36
+ // rows allows access organised by row. Sparse array of arrays indexed by row-1, col
37
+ // Note: _rows is zero based. Must subtract 1 to go from cell.row to index
38
+ this._rows = [];
39
+
40
+ // column definitions
41
+ this._columns = null;
42
+
43
+ // column keys (addRow convenience): key ==> this._collumns index
44
+ this._keys = {};
45
+
46
+ // keep record of all merges
47
+ this._merges = {};
48
+
49
+ // record of all row and column pageBreaks
50
+ this.rowBreaks = [];
51
+
52
+ // for tabColor, default row height, outline levels, etc
53
+ this.properties = Object.assign(
54
+ {},
55
+ {
56
+ defaultRowHeight: 15,
57
+ dyDescent: 55,
58
+ outlineLevelCol: 0,
59
+ outlineLevelRow: 0,
60
+ },
61
+ options.properties
62
+ );
63
+
64
+ // for all things printing
65
+ this.pageSetup = Object.assign(
66
+ {},
67
+ {
68
+ margins: {left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3},
69
+ orientation: 'portrait',
70
+ horizontalDpi: 4294967295,
71
+ verticalDpi: 4294967295,
72
+ fitToPage: !!(
73
+ options.pageSetup &&
74
+ (options.pageSetup.fitToWidth || options.pageSetup.fitToHeight) &&
75
+ !options.pageSetup.scale
76
+ ),
77
+ pageOrder: 'downThenOver',
78
+ blackAndWhite: false,
79
+ draft: false,
80
+ cellComments: 'None',
81
+ errors: 'displayed',
82
+ scale: 100,
83
+ fitToWidth: 1,
84
+ fitToHeight: 1,
85
+ paperSize: undefined,
86
+ showRowColHeaders: false,
87
+ showGridLines: false,
88
+ firstPageNumber: undefined,
89
+ horizontalCentered: false,
90
+ verticalCentered: false,
91
+ rowBreaks: null,
92
+ colBreaks: null,
93
+ },
94
+ options.pageSetup
95
+ );
96
+
97
+ this.headerFooter = Object.assign(
98
+ {},
99
+ {
100
+ differentFirst: false,
101
+ differentOddEven: false,
102
+ oddHeader: null,
103
+ oddFooter: null,
104
+ evenHeader: null,
105
+ evenFooter: null,
106
+ firstHeader: null,
107
+ firstFooter: null,
108
+ },
109
+ options.headerFooter
110
+ );
111
+
112
+ this.dataValidations = new DataValidations();
113
+
114
+ // for freezepanes, split, zoom, gridlines, etc
115
+ this.views = options.views || [];
116
+
117
+ this.autoFilter = options.autoFilter || null;
118
+
119
+ // for images, etc
120
+ this._media = [];
121
+
122
+ // worksheet protection
123
+ this.sheetProtection = null;
124
+
125
+ // for tables
126
+ this.tables = {};
127
+
128
+ this.pivotTables = [];
129
+
130
+ this.conditionalFormattings = [];
131
+ }
132
+
133
+ get name() {
134
+ return this._name;
135
+ }
136
+
137
+ set name(name) {
138
+ if (name === undefined) {
139
+ name = `sheet${this.id}`;
140
+ }
141
+
142
+ if (this._name === name) return;
143
+
144
+ if (typeof name !== 'string') {
145
+ throw new Error('The name has to be a string.');
146
+ }
147
+
148
+ if (name === '') {
149
+ throw new Error('The name can\'t be empty.');
150
+ }
151
+
152
+ if (name === 'History') {
153
+ throw new Error('The name "History" is protected. Please use a different name.');
154
+ }
155
+
156
+ // Illegal character in worksheet name: asterisk (*), question mark (?),
157
+ // colon (:), forward slash (/ \), or bracket ([])
158
+ if (/[*?:/\\[\]]/.test(name)) {
159
+ throw new Error(`Worksheet name ${name} cannot include any of the following characters: * ? : \\ / [ ]`);
160
+ }
161
+
162
+ if (/(^')|('$)/.test(name)) {
163
+ throw new Error(`The first or last character of worksheet name cannot be a single quotation mark: ${name}`);
164
+ }
165
+
166
+ if (name && name.length > 31) {
167
+ // eslint-disable-next-line no-console
168
+ console.warn(`Worksheet name ${name} exceeds 31 chars. This will be truncated`);
169
+ name = name.substring(0, 31);
170
+ }
171
+
172
+ if (this._workbook._worksheets.find(ws => ws && ws.name.toLowerCase() === name.toLowerCase())) {
173
+ throw new Error(`Worksheet name already exists: ${name}`);
174
+ }
175
+
176
+ this._name = name;
177
+ }
178
+
179
+ get workbook() {
180
+ return this._workbook;
181
+ }
182
+
183
+ // when you're done with this worksheet, call this to remove from workbook
184
+ destroy() {
185
+ this._workbook.removeWorksheetEx(this);
186
+ }
187
+
188
+ // Get the bounding range of the cells in this worksheet
189
+ get dimensions() {
190
+ const dimensions = new Range();
191
+ this._rows.forEach(row => {
192
+ if (row) {
193
+ const rowDims = row.dimensions;
194
+ if (rowDims) {
195
+ dimensions.expand(row.number, rowDims.min, row.number, rowDims.max);
196
+ }
197
+ }
198
+ });
199
+ return dimensions;
200
+ }
201
+
202
+ // =========================================================================
203
+ // Columns
204
+
205
+ // get the current columns array.
206
+ get columns() {
207
+ return this._columns;
208
+ }
209
+
210
+ // set the columns from an array of column definitions.
211
+ // Note: any headers defined will overwrite existing values.
212
+ set columns(value) {
213
+ // calculate max header row count
214
+ this._headerRowCount = value.reduce((pv, cv) => {
215
+ const headerCount = (cv.header && 1) || (cv.headers && cv.headers.length) || 0;
216
+ return Math.max(pv, headerCount);
217
+ }, 0);
218
+
219
+ // construct Column objects
220
+ let count = 1;
221
+ const columns = (this._columns = []);
222
+ value.forEach(defn => {
223
+ const column = new Column(this, count++, false);
224
+ columns.push(column);
225
+ column.defn = defn;
226
+ });
227
+ }
228
+
229
+ getColumnKey(key) {
230
+ return this._keys[key];
231
+ }
232
+
233
+ setColumnKey(key, value) {
234
+ this._keys[key] = value;
235
+ }
236
+
237
+ deleteColumnKey(key) {
238
+ delete this._keys[key];
239
+ }
240
+
241
+ eachColumnKey(f) {
242
+ _.each(this._keys, f);
243
+ }
244
+
245
+ // get a single column by col number. If it doesn't exist, create it and any gaps before it
246
+ getColumn(c) {
247
+ if (typeof c === 'string') {
248
+ // if it matches a key'd column, return that
249
+ const col = this._keys[c];
250
+ if (col) return col;
251
+
252
+ // otherwise, assume letter
253
+ c = colCache.l2n(c);
254
+ }
255
+ if (!this._columns) {
256
+ this._columns = [];
257
+ }
258
+ if (c > this._columns.length) {
259
+ let n = this._columns.length + 1;
260
+ while (n <= c) {
261
+ this._columns.push(new Column(this, n++));
262
+ }
263
+ }
264
+ return this._columns[c - 1];
265
+ }
266
+
267
+ spliceColumns(start, count, ...inserts) {
268
+ const rows = this._rows;
269
+ const nRows = rows.length;
270
+ if (inserts.length > 0) {
271
+ // must iterate over all rows whether they exist yet or not
272
+ for (let i = 0; i < nRows; i++) {
273
+ const rowArguments = [start, count];
274
+ // eslint-disable-next-line no-loop-func
275
+ inserts.forEach(insert => {
276
+ rowArguments.push(insert[i] || null);
277
+ });
278
+ const row = this.getRow(i + 1);
279
+ // eslint-disable-next-line prefer-spread
280
+ row.splice.apply(row, rowArguments);
281
+ }
282
+ } else {
283
+ // nothing to insert, so just splice all rows
284
+ this._rows.forEach(r => {
285
+ if (r) {
286
+ r.splice(start, count);
287
+ }
288
+ });
289
+ }
290
+
291
+ // splice column definitions
292
+ const nExpand = inserts.length - count;
293
+ const nKeep = start + count;
294
+ const nEnd = this._columns.length;
295
+ if (nExpand < 0) {
296
+ for (let i = start + inserts.length; i <= nEnd; i++) {
297
+ this.getColumn(i).defn = this.getColumn(i - nExpand).defn;
298
+ }
299
+ } else if (nExpand > 0) {
300
+ for (let i = nEnd; i >= nKeep; i--) {
301
+ this.getColumn(i + nExpand).defn = this.getColumn(i).defn;
302
+ }
303
+ }
304
+ for (let i = start; i < start + inserts.length; i++) {
305
+ this.getColumn(i).defn = null;
306
+ }
307
+
308
+ // account for defined names
309
+ this.workbook.definedNames.spliceColumns(this.name, start, count, inserts.length);
310
+ }
311
+
312
+ get lastColumn() {
313
+ return this.getColumn(this.columnCount);
314
+ }
315
+
316
+ get columnCount() {
317
+ let maxCount = 0;
318
+ this.eachRow(row => {
319
+ maxCount = Math.max(maxCount, row.cellCount);
320
+ });
321
+ return maxCount;
322
+ }
323
+
324
+ get actualColumnCount() {
325
+ // performance nightmare - for each row, counts all the columns used
326
+ const counts = [];
327
+ let count = 0;
328
+ this.eachRow(row => {
329
+ row.eachCell(({col}) => {
330
+ if (!counts[col]) {
331
+ counts[col] = true;
332
+ count++;
333
+ }
334
+ });
335
+ });
336
+ return count;
337
+ }
338
+
339
+ // =========================================================================
340
+ // Rows
341
+
342
+ _commitRow() {
343
+ // nop - allows streaming reader to fill a document
344
+ }
345
+
346
+ get _lastRowNumber() {
347
+ // need to cope with results of splice
348
+ const rows = this._rows;
349
+ let n = rows.length;
350
+ while (n > 0 && rows[n - 1] === undefined) {
351
+ n--;
352
+ }
353
+ return n;
354
+ }
355
+
356
+ get _nextRow() {
357
+ return this._lastRowNumber + 1;
358
+ }
359
+
360
+ get lastRow() {
361
+ if (this._rows.length) {
362
+ return this._rows[this._rows.length - 1];
363
+ }
364
+ return undefined;
365
+ }
366
+
367
+ // find a row (if exists) by row number
368
+ findRow(r) {
369
+ return this._rows[r - 1];
370
+ }
371
+
372
+ // find multiple rows (if exists) by row number
373
+ findRows(start, length) {
374
+ return this._rows.slice(start - 1, start - 1 + length);
375
+ }
376
+
377
+ get rowCount() {
378
+ return this._lastRowNumber;
379
+ }
380
+
381
+ get actualRowCount() {
382
+ // counts actual rows that have actual data
383
+ let count = 0;
384
+ this.eachRow(() => {
385
+ count++;
386
+ });
387
+ return count;
388
+ }
389
+
390
+ // get a row by row number.
391
+ getRow(r) {
392
+ let row = this._rows[r - 1];
393
+ if (!row) {
394
+ row = this._rows[r - 1] = new Row(this, r);
395
+ }
396
+ return row;
397
+ }
398
+
399
+ // get multiple rows by row number.
400
+ getRows(start, length) {
401
+ if (length < 1) return undefined;
402
+ const rows = [];
403
+ for (let i = start; i < start + length; i++) {
404
+ rows.push(this.getRow(i));
405
+ }
406
+ return rows;
407
+ }
408
+
409
+ addRow(value, style = 'n') {
410
+ const rowNo = this._nextRow;
411
+ const row = this.getRow(rowNo);
412
+ row.values = value;
413
+ this._setStyleOption(rowNo, style[0] === 'i' ? style : 'n');
414
+ return row;
415
+ }
416
+
417
+ addRows(value, style = 'n') {
418
+ const rows = [];
419
+ value.forEach(row => {
420
+ rows.push(this.addRow(row, style));
421
+ });
422
+ return rows;
423
+ }
424
+
425
+ insertRow(pos, value, style = 'n') {
426
+ this.spliceRows(pos, 0, value);
427
+ this._setStyleOption(pos, style);
428
+ return this.getRow(pos);
429
+ }
430
+
431
+ insertRows(pos, values, style = 'n') {
432
+ this.spliceRows(pos, 0, ...values);
433
+ if (style !== 'n') {
434
+ // copy over the styles
435
+ for (let i = 0; i < values.length; i++) {
436
+ if (style[0] === 'o' && this.findRow(values.length + pos + i) !== undefined) {
437
+ this._copyStyle(values.length + pos + i, pos + i, style[1] === '+');
438
+ } else if (style[0] === 'i' && this.findRow(pos - 1) !== undefined) {
439
+ this._copyStyle(pos - 1, pos + i, style[1] === '+');
440
+ }
441
+ }
442
+ }
443
+ return this.getRows(pos, values.length);
444
+ }
445
+
446
+ // set row at position to same style as of either pervious row (option 'i') or next row (option 'o')
447
+ _setStyleOption(pos, style = 'n') {
448
+ if (style[0] === 'o' && this.findRow(pos + 1) !== undefined) {
449
+ this._copyStyle(pos + 1, pos, style[1] === '+');
450
+ } else if (style[0] === 'i' && this.findRow(pos - 1) !== undefined) {
451
+ this._copyStyle(pos - 1, pos, style[1] === '+');
452
+ }
453
+ }
454
+
455
+ _copyStyle(src, dest, styleEmpty = false) {
456
+ const rSrc = this.getRow(src);
457
+ const rDst = this.getRow(dest);
458
+ rDst.style = copyStyle(rSrc.style);
459
+ // eslint-disable-next-line no-loop-func
460
+ rSrc.eachCell({includeEmpty: styleEmpty}, (cell, colNumber) => {
461
+ rDst.getCell(colNumber).style = copyStyle(cell.style);
462
+ });
463
+ rDst.height = rSrc.height;
464
+ }
465
+
466
+ duplicateRow(rowNum, count, insert = false) {
467
+ // create count duplicates of rowNum
468
+ // either inserting new or overwriting existing rows
469
+
470
+ const rSrc = this._rows[rowNum - 1];
471
+ const inserts = new Array(count).fill(rSrc.values);
472
+ this.spliceRows(rowNum + 1, insert ? 0 : count, ...inserts);
473
+
474
+ // now copy styles...
475
+ for (let i = 0; i < count; i++) {
476
+ const rDst = this._rows[rowNum + i];
477
+ rDst.style = rSrc.style;
478
+ rDst.height = rSrc.height;
479
+ // eslint-disable-next-line no-loop-func
480
+ rSrc.eachCell({includeEmpty: true}, (cell, colNumber) => {
481
+ rDst.getCell(colNumber).style = cell.style;
482
+ });
483
+ }
484
+ }
485
+
486
+ spliceRows(start, count, ...inserts) {
487
+ // same problem as row.splice, except worse.
488
+ const nKeep = start + count;
489
+ const nInserts = inserts.length;
490
+ const nExpand = nInserts - count;
491
+ const nEnd = this._rows.length;
492
+ let i;
493
+ let rSrc;
494
+ if (nExpand < 0) {
495
+ // remove rows
496
+ if (start === nEnd) {
497
+ this._rows[nEnd - 1] = undefined;
498
+ }
499
+ for (i = nKeep; i <= nEnd; i++) {
500
+ rSrc = this._rows[i - 1];
501
+ if (rSrc) {
502
+ const rDst = this.getRow(i + nExpand);
503
+ rDst.values = rSrc.values;
504
+ rDst.style = rSrc.style;
505
+ rDst.height = rSrc.height;
506
+ // eslint-disable-next-line no-loop-func
507
+ rSrc.eachCell({includeEmpty: true}, (cell, colNumber) => {
508
+ rDst.getCell(colNumber).style = cell.style;
509
+ });
510
+ this._rows[i - 1] = undefined;
511
+ } else {
512
+ this._rows[i + nExpand - 1] = undefined;
513
+ }
514
+ }
515
+ } else if (nExpand > 0) {
516
+ // insert new cells
517
+ for (i = nEnd; i >= nKeep; i--) {
518
+ rSrc = this._rows[i - 1];
519
+ if (rSrc) {
520
+ const rDst = this.getRow(i + nExpand);
521
+ rDst.values = rSrc.values;
522
+ rDst.style = rSrc.style;
523
+ rDst.height = rSrc.height;
524
+ // eslint-disable-next-line no-loop-func
525
+ rSrc.eachCell({includeEmpty: true}, (cell, colNumber) => {
526
+ rDst.getCell(colNumber).style = cell.style;
527
+
528
+ // remerge cells accounting for insert offset
529
+ if (cell._value.constructor.name === 'MergeValue') {
530
+ const cellToBeMerged = this.getRow(cell._row._number + nInserts).getCell(colNumber);
531
+ const prevMaster = cell._value._master;
532
+ const newMaster = this.getRow(prevMaster._row._number + nInserts).getCell(prevMaster._column._number);
533
+ cellToBeMerged.merge(newMaster);
534
+ }
535
+ });
536
+ } else {
537
+ this._rows[i + nExpand - 1] = undefined;
538
+ }
539
+ }
540
+ }
541
+
542
+ // now copy over the new values
543
+ for (i = 0; i < nInserts; i++) {
544
+ const rDst = this.getRow(start + i);
545
+ rDst.style = {};
546
+ rDst.values = inserts[i];
547
+ }
548
+
549
+ // account for defined names
550
+ this.workbook.definedNames.spliceRows(this.name, start, count, nInserts);
551
+ }
552
+
553
+ // iterate over every row in the worksheet, including maybe empty rows
554
+ eachRow(options, iteratee) {
555
+ if (!iteratee) {
556
+ iteratee = options;
557
+ options = undefined;
558
+ }
559
+ if (options && options.includeEmpty) {
560
+ const n = this._rows.length;
561
+ for (let i = 1; i <= n; i++) {
562
+ iteratee(this.getRow(i), i);
563
+ }
564
+ } else {
565
+ this._rows.forEach(row => {
566
+ if (row && row.hasValues) {
567
+ iteratee(row, row.number);
568
+ }
569
+ });
570
+ }
571
+ }
572
+
573
+ // return all rows as sparse array
574
+ getSheetValues() {
575
+ const rows = [];
576
+ this._rows.forEach(row => {
577
+ if (row) {
578
+ rows[row.number] = row.values;
579
+ }
580
+ });
581
+ return rows;
582
+ }
583
+
584
+ // =========================================================================
585
+ // Cells
586
+
587
+ // returns the cell at [r,c] or address given by r. If not found, return undefined
588
+ findCell(r, c) {
589
+ const address = colCache.getAddress(r, c);
590
+ const row = this._rows[address.row - 1];
591
+ return row ? row.findCell(address.col) : undefined;
592
+ }
593
+
594
+ // return the cell at [r,c] or address given by r. If not found, create a new one.
595
+ getCell(r, c) {
596
+ const address = colCache.getAddress(r, c);
597
+ const row = this.getRow(address.row);
598
+ return row.getCellEx(address);
599
+ }
600
+
601
+ // =========================================================================
602
+ // Merge
603
+
604
+ // convert the range defined by ['tl:br'], [tl,br] or [t,l,b,r] into a single 'merged' cell
605
+ mergeCells(...cells) {
606
+ const dimensions = new Range(cells);
607
+ this._mergeCellsInternal(dimensions);
608
+ }
609
+
610
+ mergeCellsWithoutStyle(...cells) {
611
+ const dimensions = new Range(cells);
612
+ this._mergeCellsInternal(dimensions, true);
613
+ }
614
+
615
+ _mergeCellsInternal(dimensions, ignoreStyle) {
616
+ // check cells aren't already merged
617
+ _.each(this._merges, merge => {
618
+ if (merge.intersects(dimensions)) {
619
+ throw new Error('Cannot merge already merged cells');
620
+ }
621
+ });
622
+
623
+ // apply merge
624
+ const master = this.getCell(dimensions.top, dimensions.left);
625
+ for (let i = dimensions.top; i <= dimensions.bottom; i++) {
626
+ for (let j = dimensions.left; j <= dimensions.right; j++) {
627
+ // merge all but the master cell
628
+ if (i > dimensions.top || j > dimensions.left) {
629
+ this.getCell(i, j).merge(master, ignoreStyle);
630
+ }
631
+ }
632
+ }
633
+
634
+ // index merge
635
+ this._merges[master.address] = dimensions;
636
+ }
637
+
638
+ _unMergeMaster(master) {
639
+ // master is always top left of a rectangle
640
+ const merge = this._merges[master.address];
641
+ if (merge) {
642
+ for (let i = merge.top; i <= merge.bottom; i++) {
643
+ for (let j = merge.left; j <= merge.right; j++) {
644
+ this.getCell(i, j).unmerge();
645
+ }
646
+ }
647
+ delete this._merges[master.address];
648
+ }
649
+ }
650
+
651
+ get hasMerges() {
652
+ // return true if this._merges has a merge object
653
+ return _.some(this._merges, Boolean);
654
+ }
655
+
656
+ // scan the range defined by ['tl:br'], [tl,br] or [t,l,b,r] and if any cell is part of a merge,
657
+ // un-merge the group. Note this function can affect multiple merges and merge-blocks are
658
+ // atomic - either they're all merged or all un-merged.
659
+ unMergeCells(...cells) {
660
+ const dimensions = new Range(cells);
661
+
662
+ // find any cells in that range and unmerge them
663
+ for (let i = dimensions.top; i <= dimensions.bottom; i++) {
664
+ for (let j = dimensions.left; j <= dimensions.right; j++) {
665
+ const cell = this.findCell(i, j);
666
+ if (cell) {
667
+ if (cell.type === Enums.ValueType.Merge) {
668
+ // this cell merges to another master
669
+ this._unMergeMaster(cell.master);
670
+ } else if (this._merges[cell.address]) {
671
+ // this cell is a master
672
+ this._unMergeMaster(cell);
673
+ }
674
+ }
675
+ }
676
+ }
677
+ }
678
+
679
+ // ===========================================================================
680
+ // Shared/Array Formula
681
+ fillFormula(range, formula, results, shareType = 'shared') {
682
+ // Define formula for top-left cell and share to rest
683
+ const decoded = colCache.decode(range);
684
+ const {top, left, bottom, right} = decoded;
685
+ const width = right - left + 1;
686
+ const masterAddress = colCache.encodeAddress(top, left);
687
+ const isShared = shareType === 'shared';
688
+
689
+ // work out result accessor
690
+ let getResult;
691
+ if (typeof results === 'function') {
692
+ getResult = results;
693
+ } else if (Array.isArray(results)) {
694
+ if (Array.isArray(results[0])) {
695
+ getResult = (row, col) => results[row - top][col - left];
696
+ } else {
697
+ // eslint-disable-next-line no-mixed-operators
698
+ getResult = (row, col) => results[(row - top) * width + (col - left)];
699
+ }
700
+ } else {
701
+ getResult = () => undefined;
702
+ }
703
+ let first = true;
704
+ for (let r = top; r <= bottom; r++) {
705
+ for (let c = left; c <= right; c++) {
706
+ if (first) {
707
+ this.getCell(r, c).value = {
708
+ shareType,
709
+ formula,
710
+ ref: range,
711
+ result: getResult(r, c),
712
+ };
713
+ first = false;
714
+ } else {
715
+ this.getCell(r, c).value = isShared
716
+ ? {
717
+ sharedFormula: masterAddress,
718
+ result: getResult(r, c),
719
+ }
720
+ : getResult(r, c);
721
+ }
722
+ }
723
+ }
724
+ }
725
+
726
+ // =========================================================================
727
+ // Images
728
+ addImage(imageId, range) {
729
+ const model = {
730
+ type: 'image',
731
+ imageId,
732
+ range,
733
+ };
734
+ this._media.push(new Image(this, model));
735
+ }
736
+
737
+ getImages() {
738
+ return this._media.filter(m => m.type === 'image');
739
+ }
740
+
741
+ addBackgroundImage(imageId) {
742
+ const model = {
743
+ type: 'background',
744
+ imageId,
745
+ };
746
+ this._media.push(new Image(this, model));
747
+ }
748
+
749
+ getBackgroundImageId() {
750
+ const image = this._media.find(m => m.type === 'background');
751
+ return image && image.imageId;
752
+ }
753
+
754
+ // =========================================================================
755
+ // Worksheet Protection
756
+ protect(password, options) {
757
+ // TODO: make this function truly async
758
+ // perhaps marshal to worker thread or something
759
+ return new Promise(resolve => {
760
+ this.sheetProtection = {
761
+ sheet: true,
762
+ };
763
+ if (options && 'spinCount' in options) {
764
+ // force spinCount to be integer >= 0
765
+ options.spinCount = Number.isFinite(options.spinCount) ? Math.round(Math.max(0, options.spinCount)) : 100000;
766
+ }
767
+ if (password) {
768
+ this.sheetProtection.algorithmName = 'SHA-512';
769
+ this.sheetProtection.saltValue = Encryptor.randomBytes(16).toString('base64');
770
+ this.sheetProtection.spinCount = options && 'spinCount' in options ? options.spinCount : 100000; // allow user specified spinCount
771
+ this.sheetProtection.hashValue = Encryptor.convertPasswordToHash(
772
+ password,
773
+ 'SHA512',
774
+ this.sheetProtection.saltValue,
775
+ this.sheetProtection.spinCount
776
+ );
777
+ }
778
+ if (options) {
779
+ this.sheetProtection = Object.assign(this.sheetProtection, options);
780
+ if (!password && 'spinCount' in options) {
781
+ delete this.sheetProtection.spinCount;
782
+ }
783
+ }
784
+ resolve();
785
+ });
786
+ }
787
+
788
+ unprotect() {
789
+ this.sheetProtection = null;
790
+ }
791
+
792
+ // =========================================================================
793
+ // Tables
794
+ addTable(model) {
795
+ const table = new Table(this, model);
796
+ this.tables[model.name] = table;
797
+ return table;
798
+ }
799
+
800
+ getTable(name) {
801
+ return this.tables[name];
802
+ }
803
+
804
+ removeTable(name) {
805
+ delete this.tables[name];
806
+ }
807
+
808
+ getTables() {
809
+ return Object.values(this.tables);
810
+ }
811
+
812
+ // =========================================================================
813
+ // Pivot Tables
814
+ addPivotTable(model) {
815
+ // eslint-disable-next-line no-console
816
+ console.warn(
817
+ `Warning: Pivot Table support is experimental.
818
+ Please leave feedback at https://github.com/exceljs/exceljs/discussions/2575`
819
+ );
820
+
821
+ const pivotTable = makePivotTable(this, model);
822
+
823
+ this.pivotTables.push(pivotTable);
824
+ this.workbook.pivotTables.push(pivotTable);
825
+
826
+ return pivotTable;
827
+ }
828
+
829
+ // ===========================================================================
830
+ // Conditional Formatting
831
+ addConditionalFormatting(cf) {
832
+ this.conditionalFormattings.push(cf);
833
+ }
834
+
835
+ removeConditionalFormatting(filter) {
836
+ if (typeof filter === 'number') {
837
+ this.conditionalFormattings.splice(filter, 1);
838
+ } else if (filter instanceof Function) {
839
+ this.conditionalFormattings = this.conditionalFormattings.filter(filter);
840
+ } else {
841
+ this.conditionalFormattings = [];
842
+ }
843
+ }
844
+
845
+ // ===========================================================================
846
+ // Deprecated
847
+ get tabColor() {
848
+ // eslint-disable-next-line no-console
849
+ console.trace('worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor');
850
+ return this.properties.tabColor;
851
+ }
852
+
853
+ set tabColor(value) {
854
+ // eslint-disable-next-line no-console
855
+ console.trace('worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor');
856
+ this.properties.tabColor = value;
857
+ }
858
+
859
+ // ===========================================================================
860
+ // Model
861
+
862
+ get model() {
863
+ const model = {
864
+ id: this.id,
865
+ name: this.name,
866
+ dataValidations: this.dataValidations.model,
867
+ properties: this.properties,
868
+ state: this.state,
869
+ pageSetup: this.pageSetup,
870
+ headerFooter: this.headerFooter,
871
+ rowBreaks: this.rowBreaks,
872
+ views: this.views,
873
+ autoFilter: this.autoFilter,
874
+ media: this._media.map(medium => medium.model),
875
+ sheetProtection: this.sheetProtection,
876
+ tables: Object.values(this.tables).map(table => table.model),
877
+ pivotTables: this.pivotTables,
878
+ conditionalFormattings: this.conditionalFormattings,
879
+ };
880
+
881
+ // =================================================
882
+ // columns
883
+ model.cols = Column.toModel(this.columns);
884
+
885
+ // ==========================================================
886
+ // Rows
887
+ const rows = (model.rows = []);
888
+ const dimensions = (model.dimensions = new Range());
889
+ this._rows.forEach(row => {
890
+ const rowModel = row && row.model;
891
+ if (rowModel) {
892
+ dimensions.expand(rowModel.number, rowModel.min, rowModel.number, rowModel.max);
893
+ rows.push(rowModel);
894
+ }
895
+ });
896
+
897
+ // ==========================================================
898
+ // Merges
899
+ model.merges = [];
900
+ _.each(this._merges, merge => {
901
+ model.merges.push(merge.range);
902
+ });
903
+
904
+ return model;
905
+ }
906
+
907
+ _parseRows(model) {
908
+ this._rows = [];
909
+ model.rows.forEach(rowModel => {
910
+ const row = new Row(this, rowModel.number);
911
+ this._rows[row.number - 1] = row;
912
+ row.model = rowModel;
913
+ });
914
+ }
915
+
916
+ _parseMergeCells(model) {
917
+ _.each(model.mergeCells, merge => {
918
+ // Do not merge styles when importing an Excel file
919
+ // since each cell may have different styles intentionally.
920
+ this.mergeCellsWithoutStyle(merge);
921
+ });
922
+ }
923
+
924
+ set model(value) {
925
+ this.name = value.name;
926
+ this._columns = Column.fromModel(this, value.cols);
927
+ this._parseRows(value);
928
+
929
+ this._parseMergeCells(value);
930
+ this.dataValidations = new DataValidations(value.dataValidations);
931
+ this.properties = value.properties;
932
+ this.pageSetup = value.pageSetup;
933
+ this.headerFooter = value.headerFooter;
934
+ this.views = value.views;
935
+ this.autoFilter = value.autoFilter;
936
+ this._media = value.media.map(medium => new Image(this, medium));
937
+ this.sheetProtection = value.sheetProtection;
938
+ this.tables = value.tables.reduce((tables, table) => {
939
+ const t = new Table();
940
+ t.model = table;
941
+ tables[table.name] = t;
942
+ return tables;
943
+ }, {});
944
+ this.pivotTables = value.pivotTables;
945
+ this.conditionalFormattings = value.conditionalFormattings;
946
+ }
947
+ }
948
+
949
+ module.exports = Worksheet;