@cj-tech-master/excelts 1.6.3 → 2.0.0-canary.20251228013952.4f2c3c6

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 (400) hide show
  1. package/README.md +139 -24
  2. package/README_zh.md +140 -26
  3. package/dist/browser/excelts.esm.js +18468 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +125 -0
  6. package/dist/browser/excelts.iife.js +13107 -47146
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +24 -106
  9. package/dist/cjs/csv/csv-core.js +701 -0
  10. package/dist/cjs/csv/csv-stream.js +646 -0
  11. package/dist/cjs/csv/csv.base.js +137 -0
  12. package/dist/cjs/csv/csv.browser.js +68 -0
  13. package/dist/cjs/csv/csv.js +218 -162
  14. package/dist/cjs/doc/anchor.js +2 -2
  15. package/dist/cjs/doc/cell.js +22 -22
  16. package/dist/cjs/doc/column.js +28 -7
  17. package/dist/cjs/doc/data-validations.js +3 -3
  18. package/dist/cjs/doc/defined-names.js +13 -13
  19. package/dist/cjs/doc/image.js +7 -7
  20. package/dist/cjs/doc/modelcontainer.js +2 -2
  21. package/dist/cjs/doc/note.js +2 -2
  22. package/dist/cjs/doc/pivot-table.js +5 -5
  23. package/dist/cjs/doc/range.js +11 -11
  24. package/dist/cjs/doc/row.js +16 -16
  25. package/dist/cjs/doc/table.js +5 -5
  26. package/dist/cjs/doc/workbook.base.js +211 -0
  27. package/dist/cjs/doc/workbook.browser.js +62 -0
  28. package/dist/cjs/doc/workbook.js +68 -179
  29. package/dist/cjs/doc/worksheet.js +45 -41
  30. package/dist/cjs/index.js +49 -32
  31. package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
  32. package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
  33. package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
  34. package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
  35. package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
  36. package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
  37. package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
  38. package/dist/cjs/utils/browser-buffer.js +75 -0
  39. package/dist/cjs/utils/cell-format.js +2 -2
  40. package/dist/cjs/utils/cell-matrix.js +5 -5
  41. package/dist/cjs/utils/datetime.js +499 -0
  42. package/dist/cjs/utils/encryptor.browser.js +240 -0
  43. package/dist/cjs/utils/parse-sax.js +1191 -13
  44. package/dist/cjs/utils/shared-formula.js +5 -5
  45. package/dist/cjs/utils/sheet-utils.js +13 -13
  46. package/dist/cjs/utils/stream-buf.browser.js +355 -0
  47. package/dist/cjs/utils/stream-buf.js +5 -5
  48. package/dist/cjs/utils/unzip/extract.js +11 -11
  49. package/dist/cjs/utils/unzip/index.js +21 -21
  50. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  51. package/dist/cjs/utils/unzip/parse.js +16 -16
  52. package/dist/cjs/utils/unzip/zip-parser.js +14 -3
  53. package/dist/cjs/utils/utils.base.js +161 -0
  54. package/dist/cjs/utils/utils.browser.js +89 -0
  55. package/dist/cjs/utils/utils.js +46 -154
  56. package/dist/cjs/utils/xml-stream.js +3 -3
  57. package/dist/cjs/utils/zip/compress.base.js +88 -0
  58. package/dist/cjs/utils/zip/compress.browser.js +127 -0
  59. package/dist/cjs/utils/zip/compress.js +18 -198
  60. package/dist/cjs/utils/zip/crc32.browser.js +88 -0
  61. package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
  62. package/dist/cjs/utils/zip/index.js +17 -17
  63. package/dist/cjs/utils/zip/streaming-zip.js +264 -0
  64. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  65. package/dist/cjs/utils/zip-stream.browser.js +135 -0
  66. package/dist/cjs/utils/zip-stream.js +4 -4
  67. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  68. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  69. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  70. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  71. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  72. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  73. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  74. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  75. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  76. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  77. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  78. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  79. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  80. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  81. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  82. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  83. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  84. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  85. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  86. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  87. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  88. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  89. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  90. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  91. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  92. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  93. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  94. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  95. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  96. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  97. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  98. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  99. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  100. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  101. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  102. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  103. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  104. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  105. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  106. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  107. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  108. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  109. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  110. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  111. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
  112. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  113. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  114. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  115. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  116. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  117. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  118. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  119. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  120. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  121. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  122. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  123. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  124. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
  125. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  126. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  127. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  128. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  129. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  130. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  131. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
  133. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  134. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  135. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  138. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  141. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  142. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  143. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
  144. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  145. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  146. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  147. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  148. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  149. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
  150. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  151. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  152. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  153. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  155. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  156. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
  157. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  158. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  159. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  160. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  161. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  162. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  163. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  164. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  165. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  166. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  167. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  168. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  169. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  170. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  171. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  172. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  173. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  174. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  175. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  176. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  177. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  178. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  179. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  180. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  181. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  182. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  183. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  184. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  185. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  186. package/dist/cjs/xlsx/xlsx.base.js +742 -0
  187. package/dist/cjs/xlsx/xlsx.browser.js +162 -0
  188. package/dist/cjs/xlsx/xlsx.js +118 -892
  189. package/dist/esm/csv/csv-core.js +694 -0
  190. package/dist/esm/csv/csv-stream.js +638 -0
  191. package/dist/esm/csv/csv.base.js +127 -0
  192. package/dist/esm/csv/csv.browser.js +65 -0
  193. package/dist/esm/csv/csv.js +181 -159
  194. package/dist/esm/doc/column.js +21 -0
  195. package/dist/esm/doc/workbook.base.js +207 -0
  196. package/dist/esm/doc/workbook.browser.js +59 -0
  197. package/dist/esm/doc/workbook.js +64 -175
  198. package/dist/esm/doc/worksheet.js +4 -0
  199. package/dist/esm/index.browser.js +33 -1
  200. package/dist/esm/index.js +23 -8
  201. package/dist/esm/local.js +0 -1
  202. package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
  203. package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
  204. package/dist/esm/utils/browser-buffer.js +67 -0
  205. package/dist/esm/utils/datetime.js +493 -0
  206. package/dist/esm/utils/encryptor.browser.js +237 -0
  207. package/dist/esm/utils/parse-sax.js +1188 -12
  208. package/dist/esm/utils/stream-buf.browser.js +352 -0
  209. package/dist/esm/utils/unzip/zip-parser.js +11 -0
  210. package/dist/esm/utils/utils.base.js +142 -0
  211. package/dist/esm/utils/utils.browser.js +68 -0
  212. package/dist/esm/utils/utils.js +15 -123
  213. package/dist/esm/utils/zip/compress.base.js +83 -0
  214. package/dist/esm/utils/zip/compress.browser.js +121 -0
  215. package/dist/esm/utils/zip/compress.js +16 -164
  216. package/dist/esm/utils/zip/crc32.browser.js +82 -0
  217. package/dist/esm/utils/zip/deflate-fallback.js +570 -0
  218. package/dist/esm/utils/zip/streaming-zip.js +259 -0
  219. package/dist/esm/utils/zip-stream.browser.js +132 -0
  220. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
  221. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  222. package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
  223. package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
  224. package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
  225. package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
  226. package/dist/esm/xlsx/xlsx.base.js +739 -0
  227. package/dist/esm/xlsx/xlsx.browser.js +159 -0
  228. package/dist/esm/xlsx/xlsx.js +114 -888
  229. package/dist/types/csv/csv-core.d.ts +207 -0
  230. package/dist/types/csv/csv-stream.d.ts +114 -0
  231. package/dist/types/csv/csv.base.d.ts +62 -0
  232. package/dist/types/csv/csv.browser.d.ts +33 -0
  233. package/dist/types/csv/csv.d.ts +97 -71
  234. package/dist/types/doc/anchor.d.ts +1 -1
  235. package/dist/types/doc/cell.d.ts +7 -7
  236. package/dist/types/doc/column.d.ts +9 -3
  237. package/dist/types/doc/defined-names.d.ts +4 -4
  238. package/dist/types/doc/image.d.ts +2 -2
  239. package/dist/types/doc/modelcontainer.d.ts +1 -1
  240. package/dist/types/doc/pivot-table.d.ts +1 -1
  241. package/dist/types/doc/range.d.ts +1 -1
  242. package/dist/types/doc/row.d.ts +3 -3
  243. package/dist/types/doc/table.d.ts +2 -2
  244. package/dist/types/doc/workbook.base.d.ts +111 -0
  245. package/dist/types/doc/workbook.browser.d.ts +38 -0
  246. package/dist/types/doc/workbook.d.ts +62 -92
  247. package/dist/types/doc/worksheet.d.ts +12 -10
  248. package/dist/types/index.browser.d.ts +19 -5
  249. package/dist/types/index.d.ts +24 -23
  250. package/dist/types/local.d.ts +0 -1
  251. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  252. package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
  253. package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
  254. package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
  255. package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
  256. package/dist/types/types.d.ts +6 -0
  257. package/dist/types/utils/browser-buffer.d.ts +28 -0
  258. package/dist/types/utils/col-cache.d.ts +1 -1
  259. package/dist/types/utils/datetime.d.ts +56 -0
  260. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  261. package/dist/types/utils/parse-sax.d.ts +108 -1
  262. package/dist/types/utils/sheet-utils.d.ts +3 -3
  263. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  264. package/dist/types/utils/unzip/extract.d.ts +6 -6
  265. package/dist/types/utils/unzip/index.d.ts +8 -8
  266. package/dist/types/utils/unzip/parse.d.ts +3 -3
  267. package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
  268. package/dist/types/utils/utils.base.d.ts +29 -0
  269. package/dist/types/utils/utils.browser.d.ts +29 -0
  270. package/dist/types/utils/utils.d.ts +6 -25
  271. package/dist/types/utils/zip/compress.base.d.ts +45 -0
  272. package/dist/types/utils/zip/compress.browser.d.ts +63 -0
  273. package/dist/types/utils/zip/compress.d.ts +13 -45
  274. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  275. package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
  276. package/dist/types/utils/zip/index.d.ts +5 -5
  277. package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
  278. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  279. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  280. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  288. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  289. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  305. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  307. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  308. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  311. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  312. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  315. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  322. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  323. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  324. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  326. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  327. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  328. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  329. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  330. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  331. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  332. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  333. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  335. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  336. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  337. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  338. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  339. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  340. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  341. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  342. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  343. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  344. package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
  345. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  346. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
  355. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  356. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  358. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  360. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
  361. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  362. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  363. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  366. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  370. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  371. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  373. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  375. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  376. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  377. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  378. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  379. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  380. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  381. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  382. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  383. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  384. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  385. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  386. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  387. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  388. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  389. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  390. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  391. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  392. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  393. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  394. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  395. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  396. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  397. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  398. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  399. package/dist/types/xlsx/xlsx.d.ts +20 -80
  400. package/package.json +16 -39
@@ -0,0 +1,127 @@
1
+ /**
2
+ * CSV Base class - Shared functionality for Node.js and Browser
3
+ *
4
+ * Uses native CSV parser (RFC 4180 compliant) with zero external dependencies.
5
+ * Date parsing uses native high-performance datetime utilities.
6
+ */
7
+ import { DateParser, DateFormatter } from "../utils/datetime.js";
8
+ import { parseCsv, formatCsv } from "./csv-core.js";
9
+ // Special Excel values mapping
10
+ const SpecialValues = {
11
+ true: true,
12
+ false: false,
13
+ "#N/A": { error: "#N/A" },
14
+ "#REF!": { error: "#REF!" },
15
+ "#NAME?": { error: "#NAME?" },
16
+ "#DIV/0!": { error: "#DIV/0!" },
17
+ "#NULL!": { error: "#NULL!" },
18
+ "#VALUE!": { error: "#VALUE!" },
19
+ "#NUM!": { error: "#NUM!" }
20
+ };
21
+ /**
22
+ * Create the default value mapper for CSV parsing
23
+ */
24
+ export function createDefaultValueMapper(dateFormats) {
25
+ const dateParser = DateParser.create(dateFormats);
26
+ return function mapValue(datum) {
27
+ if (datum === "") {
28
+ return null;
29
+ }
30
+ // Try to parse as number
31
+ const datumNumber = Number(datum);
32
+ if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {
33
+ return datumNumber;
34
+ }
35
+ // Try to parse as date
36
+ const date = dateParser.parse(datum);
37
+ if (date) {
38
+ return date;
39
+ }
40
+ // Check for special values
41
+ const special = SpecialValues[datum];
42
+ if (special !== undefined) {
43
+ return special;
44
+ }
45
+ return datum;
46
+ };
47
+ }
48
+ /**
49
+ * Create the default value mapper for CSV writing
50
+ */
51
+ export function createDefaultWriteMapper(dateFormat, dateUTC) {
52
+ const formatter = dateFormat
53
+ ? DateFormatter.create(dateFormat, { utc: dateUTC })
54
+ : DateFormatter.iso(dateUTC);
55
+ return function mapValue(value) {
56
+ if (value) {
57
+ // Handle hyperlinks
58
+ if (value.text || value.hyperlink) {
59
+ return value.hyperlink || value.text || "";
60
+ }
61
+ // Handle formulas
62
+ if (value.formula || value.result) {
63
+ return value.result || "";
64
+ }
65
+ // Handle dates
66
+ if (value instanceof Date) {
67
+ return formatter.format(value);
68
+ }
69
+ // Handle errors
70
+ if (value.error) {
71
+ return value.error;
72
+ }
73
+ // Handle other objects
74
+ if (typeof value === "object") {
75
+ return JSON.stringify(value);
76
+ }
77
+ }
78
+ return value;
79
+ };
80
+ }
81
+ /**
82
+ * Parse CSV content into a worksheet
83
+ */
84
+ export function parseCsvToWorksheet(content, workbook, options = {}) {
85
+ const worksheet = workbook.addWorksheet(options.sheetName);
86
+ const dateFormats = options.dateFormats || [
87
+ "YYYY-MM-DD[T]HH:mm:ssZ",
88
+ "YYYY-MM-DD[T]HH:mm:ss",
89
+ "YYYY-MM-DD"
90
+ ];
91
+ const map = options.map || createDefaultValueMapper(dateFormats);
92
+ // Parse CSV
93
+ const rows = parseCsv(content, options.parserOptions);
94
+ // Add rows to worksheet
95
+ for (const row of rows) {
96
+ worksheet.addRow(row.map(map));
97
+ }
98
+ return worksheet;
99
+ }
100
+ /**
101
+ * Format worksheet as CSV string
102
+ */
103
+ export function formatWorksheetToCsv(worksheet, options = {}) {
104
+ if (!worksheet) {
105
+ return "";
106
+ }
107
+ const { dateFormat, dateUTC } = options;
108
+ const map = options.map || createDefaultWriteMapper(dateFormat, dateUTC);
109
+ const includeEmptyRows = options.includeEmptyRows !== false;
110
+ const rows = [];
111
+ let lastRow = 1;
112
+ worksheet.eachRow((row, rowNumber) => {
113
+ // Add empty rows if needed
114
+ if (includeEmptyRows) {
115
+ while (lastRow++ < rowNumber - 1) {
116
+ rows.push([]);
117
+ }
118
+ }
119
+ const { values } = row;
120
+ values.shift(); // Remove first empty element (1-indexed)
121
+ rows.push(values.map(map));
122
+ lastRow = rowNumber;
123
+ });
124
+ return formatCsv(rows, options.formatterOptions);
125
+ }
126
+ // Re-export core types
127
+ export { parseCsv, formatCsv, parseCsvStream } from "./csv-core.js";
@@ -0,0 +1,65 @@
1
+ /**
2
+ * CSV class for Browser - No file system dependencies
3
+ *
4
+ * Provides:
5
+ * - load: Load from string or ArrayBuffer
6
+ * - writeString: Write to string
7
+ * - writeBuffer: Write to Uint8Array
8
+ */
9
+ import { parseCsvToWorksheet, formatWorksheetToCsv } from "./csv.base.js";
10
+ class CSV {
11
+ constructor(workbook) {
12
+ this.workbook = workbook;
13
+ }
14
+ /**
15
+ * Load CSV from string or ArrayBuffer
16
+ */
17
+ load(data, options) {
18
+ let content;
19
+ if (typeof data === "string") {
20
+ content = data;
21
+ }
22
+ else if (data instanceof ArrayBuffer) {
23
+ content = new TextDecoder("utf-8").decode(data);
24
+ }
25
+ else if (data instanceof Uint8Array) {
26
+ content = new TextDecoder("utf-8").decode(data);
27
+ }
28
+ else {
29
+ throw new Error("Invalid data type. Expected string, ArrayBuffer, or Uint8Array.");
30
+ }
31
+ return parseCsvToWorksheet(content, this.workbook, options);
32
+ }
33
+ /**
34
+ * Write CSV to string
35
+ */
36
+ writeString(options) {
37
+ const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
38
+ return formatWorksheetToCsv(worksheet, options);
39
+ }
40
+ /**
41
+ * Write CSV to Uint8Array buffer
42
+ */
43
+ writeBuffer(options) {
44
+ const content = this.writeString(options);
45
+ return new TextEncoder().encode(content);
46
+ }
47
+ // Stubs for unsupported methods - throw helpful errors
48
+ async readFile(_filename, _options) {
49
+ throw new Error("CSV.readFile() is not available in browser. " +
50
+ "Use CSV.load() with string or ArrayBuffer instead.");
51
+ }
52
+ async read(_stream, _options) {
53
+ throw new Error("CSV.read() stream is not available in browser. " +
54
+ "Use CSV.load() with string or ArrayBuffer instead.");
55
+ }
56
+ async writeFile(_filename, _options) {
57
+ throw new Error("CSV.writeFile() is not available in browser. " +
58
+ "Use CSV.writeString() or CSV.writeBuffer() and handle download manually.");
59
+ }
60
+ write(_stream, _options) {
61
+ throw new Error("CSV.write() stream is not available in browser. " +
62
+ "Use CSV.writeString() or CSV.writeBuffer() instead.");
63
+ }
64
+ }
65
+ export { CSV };
@@ -1,187 +1,209 @@
1
+ /**
2
+ * CSV class for Node.js - Full streaming and file system support
3
+ *
4
+ * Features:
5
+ * - readFile: Read from file path (streaming)
6
+ * - writeFile: Write to file path (streaming)
7
+ * - read: Read from Node.js stream
8
+ * - write: Write to Node.js stream
9
+ * - createReadStream: Create a readable stream from worksheet
10
+ * - createWriteStream: Create a writable stream that writes to worksheet
11
+ */
1
12
  import fs from "fs";
2
- import { StreamBuf } from "../utils/stream-buf.js";
3
- import { format, parse } from "fast-csv";
4
- import customParseFormat from "dayjs/plugin/customParseFormat.js";
5
- import utc from "dayjs/plugin/utc.js";
6
- import dayjs from "dayjs";
13
+ import {} from "stream";
7
14
  import { fileExists } from "../utils/utils.js";
8
- const SpecialValues = {
9
- true: true,
10
- false: false,
11
- "#N/A": { error: "#N/A" },
12
- "#REF!": { error: "#REF!" },
13
- "#NAME?": { error: "#NAME?" },
14
- "#DIV/0!": { error: "#DIV/0!" },
15
- "#NULL!": { error: "#NULL!" },
16
- "#VALUE!": { error: "#VALUE!" },
17
- "#NUM!": { error: "#NUM!" }
18
- };
19
- dayjs.extend(customParseFormat);
20
- dayjs.extend(utc);
15
+ import { createDefaultValueMapper, createDefaultWriteMapper } from "./csv.base.js";
16
+ import { CsvParserStream, CsvFormatterStream } from "./csv-stream.js";
21
17
  class CSV {
22
18
  constructor(workbook) {
23
19
  this.workbook = workbook;
24
- this.worksheet = null;
25
20
  }
21
+ /**
22
+ * Read CSV from file using streaming
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const worksheet = await workbook.csv.readFile('data.csv');
27
+ * ```
28
+ */
26
29
  async readFile(filename, options) {
27
- options = options || {};
28
30
  if (!(await fileExists(filename))) {
29
31
  throw new Error(`File not found: ${filename}`);
30
32
  }
31
- const stream = fs.createReadStream(filename);
32
- try {
33
- const worksheet = await this.read(stream, options);
34
- stream.close();
35
- return worksheet;
36
- }
37
- catch (error) {
38
- stream.close();
39
- throw error;
40
- }
33
+ const readStream = fs.createReadStream(filename, {
34
+ encoding: "utf8",
35
+ highWaterMark: options?.highWaterMark ?? 64 * 1024
36
+ });
37
+ return this.read(readStream, options);
41
38
  }
42
- read(stream, options) {
43
- options = options || {};
39
+ /**
40
+ * Read CSV from Node.js readable stream
41
+ *
42
+ * Uses true streaming - processes data row by row without loading entire file into memory.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * const stream = fs.createReadStream('data.csv');
47
+ * const worksheet = await workbook.csv.read(stream);
48
+ * ```
49
+ */
50
+ async read(stream, options) {
51
+ const worksheet = this.workbook.addWorksheet(options?.sheetName);
52
+ const dateFormats = options?.dateFormats ??
53
+ ["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"];
54
+ const map = options?.map || createDefaultValueMapper(dateFormats);
55
+ const parser = new CsvParserStream(options?.parserOptions);
44
56
  return new Promise((resolve, reject) => {
45
- const worksheet = this.workbook.addWorksheet(options.sheetName);
46
- const dateFormats = options.dateFormats || [
47
- "YYYY-MM-DD[T]HH:mm:ssZ",
48
- "YYYY-MM-DD[T]HH:mm:ss",
49
- "MM-DD-YYYY",
50
- "YYYY-MM-DD"
51
- ];
52
- const map = options.map ||
53
- function (datum) {
54
- if (datum === "") {
55
- return null;
56
- }
57
- const datumNumber = Number(datum);
58
- if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {
59
- return datumNumber;
60
- }
61
- const dt = dateFormats.reduce((matchingDate, currentDateFormat) => {
62
- if (matchingDate) {
63
- return matchingDate;
64
- }
65
- const dayjsObj = dayjs(datum, currentDateFormat, true);
66
- if (dayjsObj.isValid()) {
67
- return dayjsObj;
68
- }
69
- return null;
70
- }, null);
71
- if (dt) {
72
- return new Date(dt.valueOf());
73
- }
74
- const special = SpecialValues[datum];
75
- if (special !== undefined) {
76
- return special;
77
- }
78
- return datum;
79
- };
80
- const onData = (data) => {
81
- worksheet.addRow(data.map(map));
82
- };
83
- const onEnd = () => {
84
- csvStream.emit("worksheet", worksheet);
85
- };
86
- const cleanup = () => {
87
- csvStream.removeListener("data", onData);
88
- csvStream.removeListener("end", onEnd);
89
- csvStream.removeListener("worksheet", onWorksheet);
90
- csvStream.removeListener("error", onError);
91
- };
92
- const onWorksheet = (ws) => {
93
- cleanup();
94
- resolve(ws);
95
- };
96
- const onError = (err) => {
97
- cleanup();
98
- reject(err);
99
- };
100
- const csvStream = parse(options.parserOptions).on("data", onData).on("end", onEnd);
101
- csvStream.once("worksheet", onWorksheet).on("error", onError);
102
- stream.pipe(csvStream);
57
+ stream.pipe(parser);
58
+ parser.on("data", (row) => {
59
+ worksheet.addRow(row.map(map));
60
+ });
61
+ parser.on("end", () => {
62
+ resolve(worksheet);
63
+ });
64
+ parser.on("error", reject);
65
+ stream.on("error", reject);
103
66
  });
104
67
  }
105
- write(stream, options) {
68
+ /**
69
+ * Write CSV to file using streaming
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * await workbook.csv.writeFile('output.csv');
74
+ * ```
75
+ */
76
+ async writeFile(filename, options) {
77
+ const writeStream = fs.createWriteStream(filename, {
78
+ encoding: (options?.encoding || "utf8"),
79
+ highWaterMark: options?.highWaterMark ?? 64 * 1024
80
+ });
81
+ return this.write(writeStream, options);
82
+ }
83
+ /**
84
+ * Write CSV to Node.js writable stream
85
+ *
86
+ * Uses true streaming - writes data row by row.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const stream = fs.createWriteStream('output.csv');
91
+ * await workbook.csv.write(stream);
92
+ * ```
93
+ */
94
+ async write(stream, options) {
95
+ const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
96
+ if (!worksheet) {
97
+ stream.end();
98
+ return;
99
+ }
100
+ const { dateFormat, dateUTC } = options || {};
101
+ const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);
102
+ const includeEmptyRows = options?.includeEmptyRows !== false;
103
+ const formatterOptions = {
104
+ ...options?.formatterOptions
105
+ };
106
+ const formatter = new CsvFormatterStream(formatterOptions);
107
+ formatter.pipe(stream);
108
+ let lastRow = 1;
109
+ worksheet.eachRow((row, rowNumber) => {
110
+ // Add empty rows if needed
111
+ if (includeEmptyRows) {
112
+ while (lastRow++ < rowNumber - 1) {
113
+ formatter.write([]);
114
+ }
115
+ }
116
+ const { values } = row;
117
+ values.shift(); // Remove first empty element (1-indexed)
118
+ formatter.write(values.map(map));
119
+ lastRow = rowNumber;
120
+ });
106
121
  return new Promise((resolve, reject) => {
107
- options = options || {};
108
- // const encoding = options.encoding || 'utf8';
109
- // const separator = options.separator || ',';
110
- // const quoteChar = options.quoteChar || '\'';
111
- const worksheet = this.workbook.getWorksheet(options.sheetName || options.sheetId);
112
- const csvStream = format(options.formatterOptions);
113
- const cleanup = () => {
114
- stream.removeListener("finish", onFinish);
115
- csvStream.removeListener("error", onError);
116
- };
117
- const onFinish = () => {
118
- cleanup();
119
- resolve();
120
- };
121
- const onError = (err) => {
122
- cleanup();
123
- reject(err);
124
- };
125
- stream.once("finish", onFinish);
126
- csvStream.on("error", onError);
127
- csvStream.pipe(stream);
128
- const { dateFormat, dateUTC } = options;
129
- const map = options.map ||
130
- (value => {
131
- if (value) {
132
- if (value.text || value.hyperlink) {
133
- return value.hyperlink || value.text || "";
134
- }
135
- if (value.formula || value.result) {
136
- return value.result || "";
137
- }
138
- if (value instanceof Date) {
139
- if (dateFormat) {
140
- return dateUTC
141
- ? dayjs.utc(value).format(dateFormat)
142
- : dayjs(value).format(dateFormat);
143
- }
144
- return dateUTC ? dayjs.utc(value).format() : dayjs(value).format();
145
- }
146
- if (value.error) {
147
- return value.error;
148
- }
149
- if (typeof value === "object") {
150
- return JSON.stringify(value);
151
- }
152
- }
153
- return value;
154
- });
155
- const includeEmptyRows = options.includeEmptyRows === undefined || options.includeEmptyRows;
156
- let lastRow = 1;
157
- if (worksheet) {
122
+ formatter.on("error", reject);
123
+ stream.on("error", reject);
124
+ stream.on("finish", () => resolve());
125
+ formatter.end();
126
+ });
127
+ }
128
+ /**
129
+ * Write CSV to buffer
130
+ *
131
+ * Note: This loads the entire CSV into memory. For large files, use write() with a stream.
132
+ */
133
+ async writeBuffer(options) {
134
+ const chunks = [];
135
+ const { Writable } = await import("stream");
136
+ const bufferStream = new Writable({
137
+ write(chunk, encoding, callback) {
138
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding));
139
+ callback();
140
+ }
141
+ });
142
+ await this.write(bufferStream, options);
143
+ return Buffer.concat(chunks);
144
+ }
145
+ /**
146
+ * Create a readable stream that outputs CSV rows from the worksheet
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * const csvStream = workbook.csv.createReadStream();
151
+ * csvStream.pipe(fs.createWriteStream('output.csv'));
152
+ * ```
153
+ */
154
+ createReadStream(options) {
155
+ const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
156
+ const { dateFormat, dateUTC } = options || {};
157
+ const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);
158
+ const includeEmptyRows = options?.includeEmptyRows !== false;
159
+ const formatterOptions = {
160
+ ...options?.formatterOptions
161
+ };
162
+ const formatter = new CsvFormatterStream(formatterOptions);
163
+ if (worksheet) {
164
+ // Use setImmediate to allow piping before data flows
165
+ setImmediate(() => {
166
+ let lastRow = 1;
158
167
  worksheet.eachRow((row, rowNumber) => {
159
168
  if (includeEmptyRows) {
160
169
  while (lastRow++ < rowNumber - 1) {
161
- csvStream.write([]);
170
+ formatter.write([]);
162
171
  }
163
172
  }
164
173
  const { values } = row;
165
174
  values.shift();
166
- csvStream.write(values.map(map));
175
+ formatter.write(values.map(map));
167
176
  lastRow = rowNumber;
168
177
  });
169
- }
170
- csvStream.end();
171
- });
172
- }
173
- writeFile(filename, options) {
174
- options = options || {};
175
- const streamOptions = {
176
- encoding: (options.encoding || "utf8")
177
- };
178
- const stream = fs.createWriteStream(filename, streamOptions);
179
- return this.write(stream, options);
178
+ formatter.end();
179
+ });
180
+ }
181
+ else {
182
+ setImmediate(() => formatter.end());
183
+ }
184
+ return formatter;
180
185
  }
181
- async writeBuffer(options) {
182
- const stream = new StreamBuf();
183
- await this.write(stream, options);
184
- return stream.read();
186
+ /**
187
+ * Create a writable stream that parses CSV and adds rows to a worksheet
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * const csvWriter = workbook.csv.createWriteStream({ sheetName: 'Data' });
192
+ * fs.createReadStream('input.csv').pipe(csvWriter);
193
+ * await new Promise(resolve => csvWriter.on('finish', resolve));
194
+ * ```
195
+ */
196
+ createWriteStream(options) {
197
+ const worksheet = this.workbook.addWorksheet(options?.sheetName);
198
+ const dateFormats = options?.dateFormats ??
199
+ ["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"];
200
+ const map = options?.map || createDefaultValueMapper(dateFormats);
201
+ const parser = new CsvParserStream(options?.parserOptions);
202
+ parser.on("data", (row) => {
203
+ worksheet.addRow(row.map(map));
204
+ });
205
+ return parser;
185
206
  }
186
207
  }
187
208
  export { CSV };
209
+ export { CsvParserStream, CsvFormatterStream } from "./csv-stream.js";
@@ -215,6 +215,27 @@ class Column {
215
215
  });
216
216
  }
217
217
  // =========================================================================
218
+ // Page Breaks
219
+ /**
220
+ * Add a page break after this column.
221
+ * @param top - Optional top row limit for the page break (1-indexed)
222
+ * @param bottom - Optional bottom row limit for the page break (1-indexed)
223
+ */
224
+ addPageBreak(top, bottom) {
225
+ const ws = this._worksheet;
226
+ const topRow = Math.max(0, (top || 0) - 1) || 0;
227
+ const bottomRow = Math.max(0, (bottom || 0) - 1) || 1048575;
228
+ const pb = {
229
+ id: this._number,
230
+ max: bottomRow,
231
+ man: 1
232
+ };
233
+ if (topRow) {
234
+ pb.min = topRow;
235
+ }
236
+ ws.colBreaks.push(pb);
237
+ }
238
+ // =========================================================================
218
239
  // styles
219
240
  get numFmt() {
220
241
  return this.style.numFmt;