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