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

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 (401) hide show
  1. package/README.md +139 -24
  2. package/README_zh.md +140 -26
  3. package/dist/browser/excelts.esm.js +18529 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +128 -0
  6. package/dist/browser/excelts.iife.js +12966 -46944
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +36 -115
  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 +13 -11
  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 +101 -17
  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-cache-definition-xform.js +3 -1
  221. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +93 -9
  222. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  223. package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
  224. package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
  225. package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
  226. package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
  227. package/dist/esm/xlsx/xlsx.base.js +739 -0
  228. package/dist/esm/xlsx/xlsx.browser.js +159 -0
  229. package/dist/esm/xlsx/xlsx.js +114 -888
  230. package/dist/types/csv/csv-core.d.ts +201 -0
  231. package/dist/types/csv/csv-stream.d.ts +114 -0
  232. package/dist/types/csv/csv.base.d.ts +62 -0
  233. package/dist/types/csv/csv.browser.d.ts +33 -0
  234. package/dist/types/csv/csv.d.ts +97 -71
  235. package/dist/types/doc/anchor.d.ts +1 -1
  236. package/dist/types/doc/cell.d.ts +7 -7
  237. package/dist/types/doc/column.d.ts +9 -3
  238. package/dist/types/doc/defined-names.d.ts +4 -4
  239. package/dist/types/doc/image.d.ts +2 -2
  240. package/dist/types/doc/modelcontainer.d.ts +1 -1
  241. package/dist/types/doc/pivot-table.d.ts +1 -1
  242. package/dist/types/doc/range.d.ts +1 -1
  243. package/dist/types/doc/row.d.ts +3 -3
  244. package/dist/types/doc/table.d.ts +2 -2
  245. package/dist/types/doc/workbook.base.d.ts +111 -0
  246. package/dist/types/doc/workbook.browser.d.ts +38 -0
  247. package/dist/types/doc/workbook.d.ts +62 -92
  248. package/dist/types/doc/worksheet.d.ts +12 -10
  249. package/dist/types/index.browser.d.ts +19 -5
  250. package/dist/types/index.d.ts +24 -23
  251. package/dist/types/local.d.ts +0 -1
  252. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  253. package/dist/types/stream/xlsx/workbook-reader.d.ts +5 -5
  254. package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
  255. package/dist/types/stream/xlsx/worksheet-reader.d.ts +6 -6
  256. package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
  257. package/dist/types/types.d.ts +6 -0
  258. package/dist/types/utils/browser-buffer.d.ts +28 -0
  259. package/dist/types/utils/col-cache.d.ts +1 -1
  260. package/dist/types/utils/datetime.d.ts +56 -0
  261. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  262. package/dist/types/utils/parse-sax.d.ts +108 -1
  263. package/dist/types/utils/sheet-utils.d.ts +3 -3
  264. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  265. package/dist/types/utils/unzip/extract.d.ts +6 -6
  266. package/dist/types/utils/unzip/index.d.ts +8 -8
  267. package/dist/types/utils/unzip/parse.d.ts +3 -3
  268. package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
  269. package/dist/types/utils/utils.base.d.ts +29 -0
  270. package/dist/types/utils/utils.browser.d.ts +29 -0
  271. package/dist/types/utils/utils.d.ts +6 -25
  272. package/dist/types/utils/zip/compress.base.d.ts +45 -0
  273. package/dist/types/utils/zip/compress.browser.d.ts +63 -0
  274. package/dist/types/utils/zip/compress.d.ts +13 -45
  275. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  276. package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
  277. package/dist/types/utils/zip/index.d.ts +5 -5
  278. package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
  279. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  280. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  281. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  288. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  289. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  291. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  305. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  307. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  308. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  311. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  312. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  315. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  322. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  323. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  324. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  326. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  327. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  328. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  329. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  330. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  331. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  332. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  333. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  335. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  336. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  337. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  338. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  339. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  340. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  341. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  342. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  343. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  344. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  345. package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
  346. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  355. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
  356. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  358. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  360. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  361. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
  362. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  363. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  366. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  370. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  371. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  373. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  375. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  376. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  377. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  378. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  379. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  380. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  381. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  382. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  383. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  384. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  385. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  386. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  387. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  388. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  389. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  390. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  391. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  392. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  393. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  394. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  395. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  396. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  397. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  398. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  399. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  400. package/dist/types/xlsx/xlsx.d.ts +20 -80
  401. package/package.json +16 -39
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Streaming ZIP creator - fflate-compatible API
3
+ *
4
+ * This module provides a streaming ZIP API compatible with fflate's Zip/ZipDeflate,
5
+ * but uses native zlib compression for better performance.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * const zip = new StreamingZip((err, data, final) => {
10
+ * if (err) handleError(err);
11
+ * else {
12
+ * stream.write(data);
13
+ * if (final) stream.end();
14
+ * }
15
+ * });
16
+ *
17
+ * const file = new ZipDeflateFile("path/file.txt", { level: 6 });
18
+ * zip.add(file);
19
+ * file.push(data1);
20
+ * file.push(data2, true); // true = final chunk
21
+ *
22
+ * zip.end();
23
+ * ```
24
+ */
25
+ import { crc32 } from "./crc32.js";
26
+ import { compressSync } from "./compress.js";
27
+ // ZIP signature constants
28
+ const LOCAL_FILE_HEADER_SIG = 0x04034b50;
29
+ const CENTRAL_DIR_HEADER_SIG = 0x02014b50;
30
+ const END_OF_CENTRAL_DIR_SIG = 0x06054b50;
31
+ // ZIP version constants
32
+ const VERSION_NEEDED = 20; // 2.0 - supports DEFLATE
33
+ const VERSION_MADE_BY = 20; // 2.0
34
+ // Compression methods
35
+ const COMPRESSION_STORE = 0;
36
+ const COMPRESSION_DEFLATE = 8;
37
+ const encoder = new TextEncoder();
38
+ /**
39
+ * Convert Date to DOS time format
40
+ */
41
+ function dateToDos(date) {
42
+ const dosTime = ((date.getHours() & 0x1f) << 11) |
43
+ ((date.getMinutes() & 0x3f) << 5) |
44
+ ((date.getSeconds() >> 1) & 0x1f);
45
+ const dosDate = (((date.getFullYear() - 1980) & 0x7f) << 9) |
46
+ (((date.getMonth() + 1) & 0x0f) << 5) |
47
+ (date.getDate() & 0x1f);
48
+ return [dosTime, dosDate];
49
+ }
50
+ /**
51
+ * ZipDeflate-compatible file stream
52
+ * Collects data chunks, compresses on finalization
53
+ */
54
+ export class ZipDeflateFile {
55
+ constructor(name, options) {
56
+ this.chunks = [];
57
+ this.totalSize = 0;
58
+ this.finalized = false;
59
+ this._ondata = null;
60
+ this.name = name;
61
+ this.level = options?.level ?? 6;
62
+ }
63
+ /**
64
+ * Set data callback (called by StreamingZip)
65
+ */
66
+ set ondata(cb) {
67
+ this._ondata = cb;
68
+ }
69
+ /**
70
+ * Push data to the file
71
+ * @param data - Data chunk
72
+ * @param final - Whether this is the final chunk
73
+ */
74
+ push(data, final = false) {
75
+ if (this.finalized) {
76
+ throw new Error("Cannot push to finalized ZipDeflateFile");
77
+ }
78
+ if (data.length > 0) {
79
+ this.chunks.push(data);
80
+ this.totalSize += data.length;
81
+ }
82
+ if (final) {
83
+ this.finalized = true;
84
+ this._flush();
85
+ }
86
+ }
87
+ /**
88
+ * Flush collected data through compression and emit
89
+ */
90
+ _flush() {
91
+ if (!this._ondata) {
92
+ return;
93
+ }
94
+ // Combine chunks
95
+ let uncompressed;
96
+ if (this.chunks.length === 0) {
97
+ uncompressed = new Uint8Array(0);
98
+ }
99
+ else if (this.chunks.length === 1) {
100
+ uncompressed = this.chunks[0];
101
+ }
102
+ else {
103
+ uncompressed = new Uint8Array(this.totalSize);
104
+ let offset = 0;
105
+ for (const chunk of this.chunks) {
106
+ uncompressed.set(chunk, offset);
107
+ offset += chunk.length;
108
+ }
109
+ }
110
+ // Compress if level > 0 and data is not empty
111
+ const shouldCompress = this.level > 0 && uncompressed.length > 0;
112
+ const compressed = shouldCompress
113
+ ? compressSync(uncompressed, { level: this.level })
114
+ : uncompressed;
115
+ // Build local file header + data
116
+ const nameBytes = encoder.encode(this.name);
117
+ const crcValue = crc32(uncompressed);
118
+ const [dosTime, dosDate] = dateToDos(new Date());
119
+ // Local file header (30 bytes + filename)
120
+ const header = new Uint8Array(30 + nameBytes.length);
121
+ const view = new DataView(header.buffer);
122
+ view.setUint32(0, LOCAL_FILE_HEADER_SIG, true);
123
+ view.setUint16(4, VERSION_NEEDED, true);
124
+ view.setUint16(6, 0x0800, true); // UTF-8 flag
125
+ view.setUint16(8, shouldCompress ? COMPRESSION_DEFLATE : COMPRESSION_STORE, true);
126
+ view.setUint16(10, dosTime, true);
127
+ view.setUint16(12, dosDate, true);
128
+ view.setUint32(14, crcValue, true);
129
+ view.setUint32(18, compressed.length, true);
130
+ view.setUint32(22, uncompressed.length, true);
131
+ view.setUint16(26, nameBytes.length, true);
132
+ view.setUint16(28, 0, true); // Extra field length
133
+ header.set(nameBytes, 30);
134
+ // Store info for central directory BEFORE emitting data
135
+ // (StreamingZip reads this in the final callback)
136
+ this._entryInfo = {
137
+ name: nameBytes,
138
+ crc: crcValue,
139
+ compressedSize: compressed.length,
140
+ uncompressedSize: uncompressed.length,
141
+ compressionMethod: shouldCompress ? COMPRESSION_DEFLATE : COMPRESSION_STORE,
142
+ dosTime,
143
+ dosDate,
144
+ offset: -1 // Will be set by StreamingZip
145
+ };
146
+ // Emit header
147
+ this._ondata(header, false);
148
+ // Emit compressed data (final chunk)
149
+ this._ondata(compressed, true);
150
+ // Clear chunks for GC
151
+ this.chunks.length = 0;
152
+ }
153
+ /**
154
+ * Get entry info (called by StreamingZip after finalization)
155
+ */
156
+ getEntryInfo() {
157
+ return this._entryInfo || null;
158
+ }
159
+ }
160
+ /**
161
+ * Streaming ZIP - fflate Zip-compatible API
162
+ * Creates ZIP files in a streaming manner
163
+ */
164
+ export class StreamingZip {
165
+ /**
166
+ * Create a streaming ZIP
167
+ * @param callback - Called with (err, data, final) as data becomes available
168
+ */
169
+ constructor(callback) {
170
+ this.entries = [];
171
+ this.currentOffset = 0;
172
+ this.ended = false;
173
+ this.callback = callback;
174
+ }
175
+ /**
176
+ * Add a file to the ZIP
177
+ * @param file - ZipDeflateFile instance
178
+ */
179
+ add(file) {
180
+ if (this.ended) {
181
+ throw new Error("Cannot add files after calling end()");
182
+ }
183
+ // Capture offset when first data is written, not when add() is called
184
+ // This is important because streaming files may have data pushed later
185
+ let startOffset = -1;
186
+ file.ondata = (data, final) => {
187
+ // Capture offset on first data chunk
188
+ if (startOffset === -1) {
189
+ startOffset = this.currentOffset;
190
+ }
191
+ this.currentOffset += data.length;
192
+ this.callback(null, data, false);
193
+ if (final) {
194
+ // Get entry info and set offset
195
+ const entryInfo = file.getEntryInfo();
196
+ if (entryInfo) {
197
+ entryInfo.offset = startOffset;
198
+ this.entries.push(entryInfo);
199
+ }
200
+ }
201
+ };
202
+ }
203
+ /**
204
+ * Finalize the ZIP
205
+ * Writes central directory and end-of-central-directory record
206
+ */
207
+ end() {
208
+ if (this.ended) {
209
+ return;
210
+ }
211
+ this.ended = true;
212
+ const centralDirOffset = this.currentOffset;
213
+ const centralDirChunks = [];
214
+ // Build central directory headers
215
+ for (const entry of this.entries) {
216
+ const header = new Uint8Array(46 + entry.name.length);
217
+ const view = new DataView(header.buffer);
218
+ view.setUint32(0, CENTRAL_DIR_HEADER_SIG, true);
219
+ view.setUint16(4, VERSION_MADE_BY, true);
220
+ view.setUint16(6, VERSION_NEEDED, true);
221
+ view.setUint16(8, 0x0800, true); // UTF-8 flag
222
+ view.setUint16(10, entry.compressionMethod, true);
223
+ view.setUint16(12, entry.dosTime, true);
224
+ view.setUint16(14, entry.dosDate, true);
225
+ view.setUint32(16, entry.crc, true);
226
+ view.setUint32(20, entry.compressedSize, true);
227
+ view.setUint32(24, entry.uncompressedSize, true);
228
+ view.setUint16(28, entry.name.length, true);
229
+ view.setUint16(30, 0, true); // Extra field length
230
+ view.setUint16(32, 0, true); // Comment length
231
+ view.setUint16(34, 0, true); // Disk number start
232
+ view.setUint16(36, 0, true); // Internal file attributes
233
+ view.setUint32(38, 0, true); // External file attributes
234
+ view.setUint32(42, entry.offset, true);
235
+ header.set(entry.name, 46);
236
+ centralDirChunks.push(header);
237
+ }
238
+ // Emit central directory
239
+ for (const chunk of centralDirChunks) {
240
+ this.callback(null, chunk, false);
241
+ }
242
+ const centralDirSize = centralDirChunks.reduce((sum, c) => sum + c.length, 0);
243
+ // Build end of central directory
244
+ const eocd = new Uint8Array(22);
245
+ const eocdView = new DataView(eocd.buffer);
246
+ eocdView.setUint32(0, END_OF_CENTRAL_DIR_SIG, true);
247
+ eocdView.setUint16(4, 0, true); // Disk number
248
+ eocdView.setUint16(6, 0, true); // Disk with central dir
249
+ eocdView.setUint16(8, this.entries.length, true);
250
+ eocdView.setUint16(10, this.entries.length, true);
251
+ eocdView.setUint32(12, centralDirSize, true);
252
+ eocdView.setUint32(16, centralDirOffset, true);
253
+ eocdView.setUint16(20, 0, true); // Comment length
254
+ // Emit end of central directory (final chunk)
255
+ this.callback(null, eocd, true);
256
+ }
257
+ }
258
+ // Export aliases for fflate compatibility
259
+ export { StreamingZip as Zip, ZipDeflateFile as ZipDeflate };
@@ -0,0 +1,132 @@
1
+ import { ZipBuilder } from "./zip/zip-builder.js";
2
+ import { StreamBuf } from "./stream-buf.browser.js";
3
+ // Helper function for base64 decoding in browser
4
+ function base64ToUint8Array(base64) {
5
+ const binaryString = atob(base64);
6
+ const bytes = new Uint8Array(binaryString.length);
7
+ for (let i = 0; i < binaryString.length; i++) {
8
+ bytes[i] = binaryString.charCodeAt(i);
9
+ }
10
+ return bytes;
11
+ }
12
+ // =============================================================================
13
+ // The ZipWriter class - Browser version without Node.js events dependency
14
+ // Packs streamed data into an output zip stream
15
+ class ZipWriter {
16
+ constructor(options) {
17
+ this.finalized = false;
18
+ this.pendingWrites = [];
19
+ this.events = new Map();
20
+ const level = options?.compression === "STORE"
21
+ ? 0
22
+ : Math.max(0, Math.min(9, options?.compressionOptions?.level ?? 1));
23
+ this.stream = new StreamBuf();
24
+ this.zipBuilder = new ZipBuilder({ level });
25
+ }
26
+ // Event emitter methods
27
+ on(event, callback) {
28
+ const callbacks = this.events.get(event) || [];
29
+ callbacks.push(callback);
30
+ this.events.set(event, callbacks);
31
+ return this;
32
+ }
33
+ once(event, callback) {
34
+ const onceCallback = (...args) => {
35
+ this.off(event, onceCallback);
36
+ callback(...args);
37
+ };
38
+ return this.on(event, onceCallback);
39
+ }
40
+ off(event, callback) {
41
+ const callbacks = this.events.get(event) || [];
42
+ const index = callbacks.indexOf(callback);
43
+ if (index !== -1) {
44
+ callbacks.splice(index, 1);
45
+ }
46
+ return this;
47
+ }
48
+ emit(event, ...args) {
49
+ const callbacks = this.events.get(event) || [];
50
+ callbacks.forEach(cb => cb(...args));
51
+ return callbacks.length > 0;
52
+ }
53
+ removeListener(event, callback) {
54
+ return this.off(event, callback);
55
+ }
56
+ append(data, options) {
57
+ let buffer;
58
+ if (Object.prototype.hasOwnProperty.call(options, "base64") && options.base64) {
59
+ const base64Data = typeof data === "string" ? data : String(data);
60
+ buffer = base64ToUint8Array(base64Data);
61
+ }
62
+ else if (typeof data === "string") {
63
+ buffer = new TextEncoder().encode(data);
64
+ }
65
+ else if (data instanceof Uint8Array) {
66
+ buffer = data;
67
+ }
68
+ else if (ArrayBuffer.isView(data)) {
69
+ buffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
70
+ }
71
+ else if (data instanceof ArrayBuffer) {
72
+ buffer = new Uint8Array(data);
73
+ }
74
+ else {
75
+ buffer = data;
76
+ }
77
+ const writePromise = this.zipBuilder
78
+ .addFile({ name: options.name, data: buffer })
79
+ .then(chunks => {
80
+ for (const chunk of chunks) {
81
+ this.stream.write(new Uint8Array(chunk));
82
+ }
83
+ });
84
+ this.pendingWrites.push(writePromise);
85
+ }
86
+ push(chunk) {
87
+ return this.stream.push(chunk);
88
+ }
89
+ async finalize() {
90
+ if (this.finalized) {
91
+ return;
92
+ }
93
+ this.finalized = true;
94
+ await Promise.all(this.pendingWrites);
95
+ const finalChunks = this.zipBuilder.finalize();
96
+ for (const chunk of finalChunks) {
97
+ this.stream.write(new Uint8Array(chunk));
98
+ }
99
+ this.stream.end();
100
+ this.emit("finish");
101
+ }
102
+ // ==========================================================================
103
+ // Stream.Readable interface
104
+ read(size) {
105
+ return this.stream.read(size);
106
+ }
107
+ setEncoding(encoding) {
108
+ return this.stream.setEncoding(encoding);
109
+ }
110
+ pause() {
111
+ return this.stream.pause();
112
+ }
113
+ resume() {
114
+ return this.stream.resume();
115
+ }
116
+ isPaused() {
117
+ return this.stream.isPaused();
118
+ }
119
+ pipe(destination) {
120
+ return this.stream.pipe(destination);
121
+ }
122
+ unpipe(destination) {
123
+ return this.stream.unpipe(destination);
124
+ }
125
+ unshift() {
126
+ return this.stream.unshift();
127
+ }
128
+ wrap() {
129
+ return this.stream.wrap();
130
+ }
131
+ }
132
+ export { ZipWriter };
@@ -43,6 +43,8 @@ class PivotCacheDefinitionXform extends BaseXform {
43
43
  */
44
44
  renderNew(xmlStream, model) {
45
45
  const { source, cacheFields } = model;
46
+ // Record count = number of data rows (excluding header row)
47
+ const recordCount = source.getSheetValues().slice(2).length;
46
48
  xmlStream.openXml(XmlStream.StdDocAttributes);
47
49
  xmlStream.openNode(this.tag, {
48
50
  ...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,
@@ -53,7 +55,7 @@ class PivotCacheDefinitionXform extends BaseXform {
53
55
  createdVersion: "8",
54
56
  refreshedVersion: "8",
55
57
  minRefreshableVersion: "3",
56
- recordCount: cacheFields.length + 1
58
+ recordCount
57
59
  });
58
60
  xmlStream.openNode("cacheSource", { type: "worksheet" });
59
61
  xmlStream.leafNode("worksheetSource", {
@@ -1,4 +1,3 @@
1
- import { v4 as uuidv4 } from "uuid";
2
1
  import { XmlStream } from "../../../utils/xml-stream.js";
3
2
  import { xmlEncode, xmlDecode } from "../../../utils/utils.js";
4
3
  import { BaseXform } from "../base-xform.js";
@@ -57,7 +56,23 @@ class PivotTableXform extends BaseXform {
57
56
  renderNew(xmlStream, model) {
58
57
  const { rows, columns, values, cacheFields, cacheId, applyWidthHeightFormats } = model;
59
58
  // Generate unique UID for each pivot table to prevent Excel treating them as identical
60
- const uniqueUid = `{${uuidv4().toUpperCase()}}`;
59
+ const uniqueUid = `{${crypto.randomUUID().toUpperCase()}}`;
60
+ // Build rowItems - need one <i> for each unique value in row fields, plus grand total
61
+ const rowItems = buildRowItems(rows, cacheFields);
62
+ // Build colItems - need one <i> for each unique value in col fields, plus grand total
63
+ const colItems = buildColItems(columns, cacheFields, values.length);
64
+ // Calculate pivot table dimensions
65
+ const rowFieldItemCount = rows.length > 0 ? cacheFields[rows[0]]?.sharedItems?.length || 0 : 0;
66
+ const colFieldItemCount = columns.length > 0 ? cacheFields[columns[0]]?.sharedItems?.length || 0 : 0;
67
+ // Location: A3 is where pivot table starts
68
+ // - firstHeaderRow: 1 (column headers are in first row of pivot table)
69
+ // - firstDataRow: 2 (data starts in second row)
70
+ // - firstDataCol: 1 (data starts in second column, after row labels)
71
+ // Calculate ref based on actual data size
72
+ const endRow = 3 + rowFieldItemCount + 1; // start row + data rows + grand total
73
+ const endCol = 1 + colFieldItemCount + 1; // start col + data cols + grand total
74
+ const endColLetter = String.fromCharCode(64 + endCol);
75
+ const locationRef = `A3:${endColLetter}${endRow}`;
61
76
  xmlStream.openXml(XmlStream.StdDocAttributes);
62
77
  xmlStream.openNode(this.tag, {
63
78
  ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
@@ -82,23 +97,23 @@ class PivotTableXform extends BaseXform {
82
97
  multipleFieldFilters: "0"
83
98
  });
84
99
  xmlStream.writeXml(`
85
- <location ref="A3:E15" firstHeaderRow="1" firstDataRow="2" firstDataCol="1" />
100
+ <location ref="${locationRef}" firstHeaderRow="1" firstDataRow="2" firstDataCol="1" />
86
101
  <pivotFields count="${cacheFields.length}">
87
102
  ${renderPivotFields(model)}
88
103
  </pivotFields>
89
104
  <rowFields count="${rows.length}">
90
105
  ${rows.map(rowIndex => `<field x="${rowIndex}" />`).join("\n ")}
91
106
  </rowFields>
92
- <rowItems count="1">
93
- <i t="grand"><x /></i>
107
+ <rowItems count="${rowItems.count}">
108
+ ${rowItems.xml}
94
109
  </rowItems>
95
110
  <colFields count="${columns.length === 0 ? 1 : columns.length}">
96
111
  ${columns.length === 0
97
112
  ? '<field x="-2" />'
98
113
  : columns.map(columnIndex => `<field x="${columnIndex}" />`).join("\n ")}
99
114
  </colFields>
100
- <colItems count="1">
101
- <i t="grand"><x /></i>
115
+ <colItems count="${colItems.count}">
116
+ ${colItems.xml}
102
117
  </colItems>
103
118
  <dataFields count="${values.length}">
104
119
  ${buildDataFields(cacheFields, values, model.metric)}
@@ -138,7 +153,7 @@ class PivotTableXform extends BaseXform {
138
153
  * Render loaded pivot table (preserving original structure)
139
154
  */
140
155
  renderLoaded(xmlStream, model) {
141
- const uniqueUid = model.uid || `{${uuidv4().toUpperCase()}}`;
156
+ const uniqueUid = model.uid || `{${crypto.randomUUID().toUpperCase()}}`;
142
157
  xmlStream.openXml(XmlStream.StdDocAttributes);
143
158
  xmlStream.openNode(this.tag, {
144
159
  ...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
@@ -461,6 +476,70 @@ PivotTableXform.PIVOT_TABLE_ATTRIBUTES = {
461
476
  "xmlns:xr": "http://schemas.microsoft.com/office/spreadsheetml/2014/revision"
462
477
  };
463
478
  // Helpers
479
+ /**
480
+ * Build rowItems XML - one item for each unique value in row fields, plus grand total.
481
+ * Each <i> represents a row in the pivot table.
482
+ * - Regular items: <i><x v="index"/></i> where index is the position in sharedItems
483
+ * - Grand total: <i t="grand"><x/></i>
484
+ */
485
+ function buildRowItems(rows, cacheFields) {
486
+ if (rows.length === 0) {
487
+ // No row fields - just grand total
488
+ return { count: 1, xml: '<i t="grand"><x /></i>' };
489
+ }
490
+ // Get unique values count from the first row field
491
+ const rowFieldIndex = rows[0];
492
+ const sharedItems = cacheFields[rowFieldIndex]?.sharedItems || [];
493
+ const itemCount = sharedItems.length;
494
+ // Build items: one for each unique value + grand total
495
+ const items = [];
496
+ // Regular items - reference each unique value by index
497
+ for (let i = 0; i < itemCount; i++) {
498
+ items.push(`<i><x v="${i}" /></i>`);
499
+ }
500
+ // Grand total row
501
+ items.push('<i t="grand"><x /></i>');
502
+ return {
503
+ count: items.length,
504
+ xml: items.join("\n ")
505
+ };
506
+ }
507
+ /**
508
+ * Build colItems XML - one item for each unique value in column fields, plus grand total.
509
+ * When there are multiple data fields (values), each column value may have sub-columns.
510
+ */
511
+ function buildColItems(columns, cacheFields, valueCount) {
512
+ if (columns.length === 0) {
513
+ // No column fields - columns are based on data fields (values)
514
+ if (valueCount > 1) {
515
+ // Multiple values: one column per value + grand total
516
+ const items = [];
517
+ for (let i = 0; i < valueCount; i++) {
518
+ items.push(`<i><x v="${i}" /></i>`);
519
+ }
520
+ items.push('<i t="grand"><x /></i>');
521
+ return { count: items.length, xml: items.join("\n ") };
522
+ }
523
+ // Single value: just grand total
524
+ return { count: 1, xml: '<i t="grand"><x /></i>' };
525
+ }
526
+ // Get unique values count from the first column field
527
+ const colFieldIndex = columns[0];
528
+ const sharedItems = cacheFields[colFieldIndex]?.sharedItems || [];
529
+ const itemCount = sharedItems.length;
530
+ // Build items: one for each unique value + grand total
531
+ const items = [];
532
+ // Regular items - reference each unique value by index
533
+ for (let i = 0; i < itemCount; i++) {
534
+ items.push(`<i><x v="${i}" /></i>`);
535
+ }
536
+ // Grand total column
537
+ items.push('<i t="grand"><x /></i>');
538
+ return {
539
+ count: items.length,
540
+ xml: items.join("\n ")
541
+ };
542
+ }
464
543
  /**
465
544
  * Build dataField XML elements for all values in the pivot table.
466
545
  * Supports multiple values when columns is empty.
@@ -501,10 +580,15 @@ function renderPivotField(fieldType, sharedItems) {
501
580
  const defaultAttributes = 'compact="0" outline="0" showAll="0" defaultSubtotal="0"';
502
581
  if (fieldType === "row" || fieldType === "column") {
503
582
  const axis = fieldType === "row" ? "axisRow" : "axisCol";
583
+ // items = one for each shared item + one default item
584
+ const itemsXml = [
585
+ ...sharedItems.map((_item, index) => `<item x="${index}" />`),
586
+ '<item t="default" />' // Required default item for subtotals/grand totals
587
+ ].join("\n ");
504
588
  return `
505
589
  <pivotField axis="${axis}" ${defaultAttributes}>
506
590
  <items count="${sharedItems.length + 1}">
507
- ${sharedItems.map((_item, index) => `<item x="${index}" />`).join("\n ")}
591
+ ${itemsXml}
508
592
  </items>
509
593
  </pivotField>
510
594
  `;
@@ -1,4 +1,3 @@
1
- import { v4 } from "uuid";
2
1
  import { BaseXform } from "../../base-xform.js";
3
2
  import { CompositeXform } from "../../composite-xform.js";
4
3
  import { DatabarExtXform } from "./databar-ext-xform.js";
@@ -33,7 +32,7 @@ class CfRuleExtXform extends CompositeXform {
33
32
  }
34
33
  prepare(model) {
35
34
  if (CfRuleExtXform.isExt(model)) {
36
- model.x14Id = `{${v4()}}`.toUpperCase();
35
+ model.x14Id = `{${crypto.randomUUID()}}`.toUpperCase();
37
36
  }
38
37
  }
39
38
  render(xmlStream, model) {
@@ -61,7 +60,7 @@ class CfRuleExtXform extends CompositeXform {
61
60
  xmlStream.openNode(this.tag, {
62
61
  type: "iconSet",
63
62
  priority: model.priority,
64
- id: model.x14Id || `{${v4()}}`
63
+ id: model.x14Id || `{${crypto.randomUUID()}}`
65
64
  });
66
65
  this.iconSetXform.render(xmlStream, model);
67
66
  xmlStream.closeNode();
@@ -0,0 +1,35 @@
1
+ import { PageBreaksXform } from "./page-breaks-xform.js";
2
+ import { ListXform } from "../list-xform.js";
3
+ /**
4
+ * Xform for column page breaks (colBreaks element in worksheet XML)
5
+ * Used to define manual page breaks between columns when printing.
6
+ *
7
+ * XML structure:
8
+ * <colBreaks count="3" manualBreakCount="3">
9
+ * <brk id="3" max="1048575" man="1"/>
10
+ * <brk id="6" max="1048575" man="1"/>
11
+ * </colBreaks>
12
+ */
13
+ class ColBreaksXform extends ListXform {
14
+ constructor() {
15
+ super({
16
+ tag: "colBreaks",
17
+ count: true,
18
+ childXform: new PageBreaksXform()
19
+ });
20
+ }
21
+ // Override to add manualBreakCount attribute required by Excel
22
+ render(xmlStream, model) {
23
+ if (model && model.length) {
24
+ xmlStream.openNode(this.tag, this.$);
25
+ xmlStream.addAttribute(this.$count, model.length);
26
+ xmlStream.addAttribute("manualBreakCount", model.length);
27
+ const { childXform } = this;
28
+ for (const childModel of model) {
29
+ childXform.render(xmlStream, childModel);
30
+ }
31
+ xmlStream.closeNode();
32
+ }
33
+ }
34
+ }
35
+ export { ColBreaksXform };
@@ -1,4 +1,8 @@
1
1
  import { BaseXform } from "../base-xform.js";
2
+ /**
3
+ * Xform for individual page break (brk element)
4
+ * Used by both RowBreaksXform and ColBreaksXform
5
+ */
2
6
  class PageBreaksXform extends BaseXform {
3
7
  get tag() {
4
8
  return "brk";
@@ -8,7 +12,15 @@ class PageBreaksXform extends BaseXform {
8
12
  }
9
13
  parseOpen(node) {
10
14
  if (node.name === "brk") {
11
- this.model = node.attributes.ref;
15
+ const { id, max, man, min } = node.attributes;
16
+ this.model = {
17
+ id: +id,
18
+ max: +max,
19
+ man: +man
20
+ };
21
+ if (min !== undefined) {
22
+ this.model.min = +min;
23
+ }
12
24
  return true;
13
25
  }
14
26
  return false;