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