ooxml-core 1.8.3 → 1.9.0

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 (308) hide show
  1. package/dist/PptxHandler-AT7FVG5Q.mjs +2 -0
  2. package/dist/{PptxHandler-BL4B7CZO.mjs → PptxHandler-EX4WBIQQ.mjs} +2 -2
  3. package/dist/PptxHandler-VFSCECPL.cjs +11 -0
  4. package/dist/automation/index.cjs +7380 -4682
  5. package/dist/automation/index.mjs +7380 -4682
  6. package/dist/chunk-AT66SA5M.cjs +44423 -0
  7. package/dist/{chunk-TTPZITQN.mjs → chunk-FIELY5PI.mjs} +1 -1
  8. package/dist/{chunk-ZAP5WLEN.mjs → chunk-IGOA57LE.mjs} +1 -1
  9. package/dist/chunk-LCS3J3QI.mjs +87604 -0
  10. package/dist/{chunk-NIHPA63A.mjs → chunk-M76PHYRR.mjs} +54 -37
  11. package/dist/chunk-OB277ZGE.mjs +44107 -0
  12. package/dist/{chunk-GAGSCAR3.mjs → chunk-OXHMZS7B.mjs} +552 -178
  13. package/dist/chunk-SWF7KVL5.cjs +87610 -0
  14. package/dist/{chunk-Z7IQR4S4.mjs → chunk-WSO4T2LJ.mjs} +246 -21
  15. package/dist/docx/block-parser.d.ts.map +1 -1
  16. package/dist/docx/cell-blocks.d.ts +4 -0
  17. package/dist/docx/cell-blocks.d.ts.map +1 -0
  18. package/dist/docx/document-paragraphs.d.ts.map +1 -1
  19. package/dist/docx/document-parts.d.ts +2 -0
  20. package/dist/docx/document-parts.d.ts.map +1 -1
  21. package/dist/docx/embedded.cjs +189 -20
  22. package/dist/docx/embedded.mjs +189 -20
  23. package/dist/docx/index.cjs +219 -24
  24. package/dist/docx/index.mjs +219 -24
  25. package/dist/docx/layout/adapt-table.d.ts.map +1 -1
  26. package/dist/docx/layout/adapter.d.ts.map +1 -1
  27. package/dist/docx/layout/flow-paragraph.d.ts +5 -0
  28. package/dist/docx/layout/flow-paragraph.d.ts.map +1 -1
  29. package/dist/docx/layout/flow-table.d.ts +2 -1
  30. package/dist/docx/layout/flow-table.d.ts.map +1 -1
  31. package/dist/docx/layout/footnote-columns.d.ts +22 -0
  32. package/dist/docx/layout/footnote-columns.d.ts.map +1 -0
  33. package/dist/docx/layout/footnote-flow.d.ts +27 -0
  34. package/dist/docx/layout/footnote-flow.d.ts.map +1 -0
  35. package/dist/docx/layout/footnote-split.d.ts +7 -0
  36. package/dist/docx/layout/footnote-split.d.ts.map +1 -0
  37. package/dist/docx/layout/index.cjs +1099 -92
  38. package/dist/docx/layout/index.mjs +1099 -92
  39. package/dist/docx/layout/input.d.ts +17 -1
  40. package/dist/docx/layout/input.d.ts.map +1 -1
  41. package/dist/docx/layout/legacy-footnote-flow.d.ts +18 -0
  42. package/dist/docx/layout/legacy-footnote-flow.d.ts.map +1 -0
  43. package/dist/docx/layout/line-metrics.d.ts.map +1 -1
  44. package/dist/docx/layout/page-cursor.d.ts +13 -8
  45. package/dist/docx/layout/page-cursor.d.ts.map +1 -1
  46. package/dist/docx/layout/page-flow.d.ts.map +1 -1
  47. package/dist/docx/layout/paragraph-layout.d.ts.map +1 -1
  48. package/dist/docx/layout/paragraph-tokens.d.ts +2 -0
  49. package/dist/docx/layout/paragraph-tokens.d.ts.map +1 -1
  50. package/dist/docx/layout/reference-footnotes.d.ts +7 -0
  51. package/dist/docx/layout/reference-footnotes.d.ts.map +1 -0
  52. package/dist/docx/layout/result.d.ts +31 -0
  53. package/dist/docx/layout/result.d.ts.map +1 -1
  54. package/dist/docx/layout/section-flow.d.ts +2 -0
  55. package/dist/docx/layout/section-flow.d.ts.map +1 -1
  56. package/dist/docx/layout/table-cell-layout.d.ts +11 -0
  57. package/dist/docx/layout/table-cell-layout.d.ts.map +1 -0
  58. package/dist/docx/layout/table-footnotes.d.ts +27 -0
  59. package/dist/docx/layout/table-footnotes.d.ts.map +1 -0
  60. package/dist/docx/layout/table-layout.d.ts +10 -4
  61. package/dist/docx/layout/table-layout.d.ts.map +1 -1
  62. package/dist/docx/load/index.cjs +194 -25
  63. package/dist/docx/load/index.mjs +194 -25
  64. package/dist/docx/model-run.d.ts +2 -0
  65. package/dist/docx/model-run.d.ts.map +1 -1
  66. package/dist/docx/model.d.ts +7 -0
  67. package/dist/docx/model.d.ts.map +1 -1
  68. package/dist/docx/notes.d.ts +5 -0
  69. package/dist/docx/notes.d.ts.map +1 -1
  70. package/dist/docx/parse-table.d.ts.map +1 -1
  71. package/dist/docx/parse.d.ts.map +1 -1
  72. package/dist/docx/save.d.ts.map +1 -1
  73. package/dist/docx/section-model.d.ts +2 -0
  74. package/dist/docx/section-model.d.ts.map +1 -1
  75. package/dist/docx/sections.d.ts.map +1 -1
  76. package/dist/docx/settings.d.ts +2 -0
  77. package/dist/docx/settings.d.ts.map +1 -1
  78. package/dist/docx/table-model.d.ts +3 -1
  79. package/dist/docx/table-model.d.ts.map +1 -1
  80. package/dist/docx/ui/index.cjs +55 -0
  81. package/dist/docx/ui/index.d.ts +1 -0
  82. package/dist/docx/ui/index.d.ts.map +1 -1
  83. package/dist/docx/ui/index.mjs +55 -1
  84. package/dist/docx/ui/table-structure-guard.d.ts +4 -0
  85. package/dist/docx/ui/table-structure-guard.d.ts.map +1 -0
  86. package/dist/docx/write-footnote-columns.d.ts +3 -0
  87. package/dist/docx/write-footnote-columns.d.ts.map +1 -0
  88. package/dist/docx/write-notes.d.ts.map +1 -1
  89. package/dist/docx/write-run.d.ts.map +1 -1
  90. package/dist/docx/write-sections.d.ts.map +1 -1
  91. package/dist/index.cjs +8 -5
  92. package/dist/index.mjs +8 -5
  93. package/dist/opc/clone-part-graph.d.ts +4 -0
  94. package/dist/opc/clone-part-graph.d.ts.map +1 -1
  95. package/dist/opc/index.cjs +8 -5
  96. package/dist/opc/index.mjs +8 -5
  97. package/dist/pptx/automation/index.cjs +621 -207
  98. package/dist/pptx/automation/index.d.ts +3 -3
  99. package/dist/pptx/automation/index.mjs +5 -5
  100. package/dist/pptx/chunks/{index-Cn-GzYGp.d.ts → index-B4cnSPNz.d.ts} +33 -4
  101. package/dist/pptx/chunks/index-B4cnSPNz.d.ts.map +1 -0
  102. package/dist/pptx/chunks/{index-CKIUurnd.d.ts → index-BZh-IMkN.d.ts} +14 -9
  103. package/dist/pptx/chunks/{index-CKIUurnd.d.ts.map → index-BZh-IMkN.d.ts.map} +1 -1
  104. package/dist/pptx/chunks/{text-operations-BHfAm5K9.d.ts → text-operations-BLodkuXE.d.ts} +29 -12
  105. package/dist/pptx/chunks/text-operations-BLodkuXE.d.ts.map +1 -0
  106. package/dist/pptx/cli/index.cjs +622 -213
  107. package/dist/pptx/cli/index.d.ts +1 -1
  108. package/dist/pptx/cli/index.mjs +4 -4
  109. package/dist/pptx/converter/index.cjs +53 -36
  110. package/dist/pptx/converter/index.d.ts +1 -1
  111. package/dist/pptx/converter/index.mjs +2 -2
  112. package/dist/pptx/editor/render/find-replace.cjs +416 -45
  113. package/dist/pptx/editor/render/find-replace.d.ts +35 -4
  114. package/dist/pptx/editor/render/find-replace.d.ts.map +1 -1
  115. package/dist/pptx/editor/render/find-replace.mjs +416 -46
  116. package/dist/pptx/editor/render/slide-operations.cjs +87 -0
  117. package/dist/pptx/editor/render/slide-operations.d.ts +17 -1
  118. package/dist/pptx/editor/render/slide-operations.d.ts.map +1 -1
  119. package/dist/pptx/editor/render/slide-operations.mjs +83 -1
  120. package/dist/pptx/editor/render/slide-search.cjs +6 -10
  121. package/dist/pptx/editor/render/slide-search.d.ts +1 -1
  122. package/dist/pptx/editor/render/slide-search.mjs +6 -10
  123. package/dist/pptx/editor/render/template-editing.d.ts +1 -1
  124. package/dist/pptx/editor/render/template-editing.d.ts.map +1 -1
  125. package/dist/pptx/index.cjs +889 -237
  126. package/dist/pptx/index.d.ts +4 -4
  127. package/dist/pptx/index.mjs +5 -5
  128. package/dist/teams/index.cjs +672 -37
  129. package/dist/teams/index.mjs +672 -37
  130. package/dist/visio/accessibility.d.ts +10 -0
  131. package/dist/visio/accessibility.d.ts.map +1 -0
  132. package/dist/visio/cell-formula.d.ts +2 -0
  133. package/dist/visio/cell-formula.d.ts.map +1 -1
  134. package/dist/visio/connector-curve-aligned.d.ts +5 -0
  135. package/dist/visio/connector-curve-aligned.d.ts.map +1 -0
  136. package/dist/visio/connector-curve-spans.d.ts +14 -0
  137. package/dist/visio/connector-curve-spans.d.ts.map +1 -0
  138. package/dist/visio/connector-jumps.d.ts +5 -0
  139. package/dist/visio/connector-jumps.d.ts.map +1 -0
  140. package/dist/visio/connector-route-walk.d.ts +2 -1
  141. package/dist/visio/connector-route-walk.d.ts.map +1 -1
  142. package/dist/visio/edit-alt-text-scope.d.ts +5 -0
  143. package/dist/visio/edit-alt-text-scope.d.ts.map +1 -0
  144. package/dist/visio/edit-alt-text.d.ts +3 -0
  145. package/dist/visio/edit-alt-text.d.ts.map +1 -0
  146. package/dist/visio/edit-commands.d.ts +7 -2
  147. package/dist/visio/edit-commands.d.ts.map +1 -1
  148. package/dist/visio/edit-formatting-commands.d.ts +5 -0
  149. package/dist/visio/edit-formatting-commands.d.ts.map +1 -1
  150. package/dist/visio/edit-formatting-paint.d.ts.map +1 -1
  151. package/dist/visio/edit-formatting-scope.d.ts.map +1 -1
  152. package/dist/visio/edit-line-jump-cache.d.ts +4 -0
  153. package/dist/visio/edit-line-jump-cache.d.ts.map +1 -0
  154. package/dist/visio/edit-master-index.d.ts.map +1 -1
  155. package/dist/visio/edit-metadata-commands.d.ts +10 -2
  156. package/dist/visio/edit-metadata-commands.d.ts.map +1 -1
  157. package/dist/visio/edit-metadata.d.ts +3 -1
  158. package/dist/visio/edit-metadata.d.ts.map +1 -1
  159. package/dist/visio/edit-page-alt-text.d.ts +4 -0
  160. package/dist/visio/edit-page-alt-text.d.ts.map +1 -0
  161. package/dist/visio/edit-page-layout.d.ts.map +1 -1
  162. package/dist/visio/edit-page-rename.d.ts.map +1 -1
  163. package/dist/visio/edit-page-setup-commands.d.ts +7 -1
  164. package/dist/visio/edit-page-setup-commands.d.ts.map +1 -1
  165. package/dist/visio/edit-page-size.d.ts.map +1 -1
  166. package/dist/visio/edit-pages.d.ts.map +1 -1
  167. package/dist/visio/edit-recalculate-index.d.ts.map +1 -1
  168. package/dist/visio/edit-scope.d.ts.map +1 -1
  169. package/dist/visio/edit-shape-create.d.ts.map +1 -1
  170. package/dist/visio/edit-stencil-connector-write.d.ts.map +1 -1
  171. package/dist/visio/edit-style-admission.d.ts.map +1 -1
  172. package/dist/visio/edit-text.d.ts.map +1 -1
  173. package/dist/visio/edit.d.ts +1 -1
  174. package/dist/visio/edit.d.ts.map +1 -1
  175. package/dist/visio/index.cjs +1091 -233
  176. package/dist/visio/index.d.ts +2 -1
  177. package/dist/visio/index.d.ts.map +1 -1
  178. package/dist/visio/index.mjs +1091 -234
  179. package/dist/visio/line-jumps.d.ts +1 -5
  180. package/dist/visio/line-jumps.d.ts.map +1 -1
  181. package/dist/visio/model.d.ts +13 -0
  182. package/dist/visio/model.d.ts.map +1 -1
  183. package/dist/visio/page-layout.d.ts +11 -2
  184. package/dist/visio/page-layout.d.ts.map +1 -1
  185. package/dist/visio/parser.d.ts.map +1 -1
  186. package/dist/visio/shape-metadata.d.ts +6 -0
  187. package/dist/visio/shape-metadata.d.ts.map +1 -1
  188. package/dist/visio/shapes.d.ts.map +1 -1
  189. package/dist/visio/text-field-case.d.ts +2 -0
  190. package/dist/visio/text-field-case.d.ts.map +1 -0
  191. package/dist/visio/text-field-display.d.ts.map +1 -1
  192. package/dist/visio/text-field-numeric.d.ts +4 -0
  193. package/dist/visio/text-field-numeric.d.ts.map +1 -0
  194. package/dist/visio/ui/connector-preview.d.ts +1 -1
  195. package/dist/visio/ui/connector-preview.d.ts.map +1 -1
  196. package/dist/visio/ui/data-graphic-rules.d.ts +2 -0
  197. package/dist/visio/ui/data-graphic-rules.d.ts.map +1 -1
  198. package/dist/visio/ui/data-graphics.d.ts +3 -2
  199. package/dist/visio/ui/data-graphics.d.ts.map +1 -1
  200. package/dist/visio/ui/edit-commands.d.ts.map +1 -1
  201. package/dist/visio/ui/index.cjs +16898 -15855
  202. package/dist/visio/ui/index.mjs +16898 -15856
  203. package/dist/visio/ui/scene-details.d.ts.map +1 -1
  204. package/dist/visio/ui/scene-validation.d.ts.map +1 -1
  205. package/dist/visio/ui/snapshot-scene.d.ts +2 -1
  206. package/dist/visio/ui/snapshot-scene.d.ts.map +1 -1
  207. package/dist/visio/xml-attribute-whitespace.d.ts +5 -0
  208. package/dist/visio/xml-attribute-whitespace.d.ts.map +1 -0
  209. package/dist/xlsx/edit/index.d.ts +1 -0
  210. package/dist/xlsx/edit/index.d.ts.map +1 -1
  211. package/dist/xlsx/edit/insert-guard.d.ts.map +1 -1
  212. package/dist/xlsx/edit/merge.d.ts.map +1 -1
  213. package/dist/xlsx/edit/page-breaks.d.ts +5 -0
  214. package/dist/xlsx/edit/page-breaks.d.ts.map +1 -0
  215. package/dist/xlsx/edit/pivots.d.ts +8 -0
  216. package/dist/xlsx/edit/pivots.d.ts.map +1 -0
  217. package/dist/xlsx/edit/print-titles.d.ts +7 -0
  218. package/dist/xlsx/edit/print-titles.d.ts.map +1 -0
  219. package/dist/xlsx/edit/session.d.ts.map +1 -1
  220. package/dist/xlsx/edit/sheets.d.ts.map +1 -1
  221. package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
  222. package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
  223. package/dist/xlsx/edit/sparkline-ranges.d.ts +11 -0
  224. package/dist/xlsx/edit/sparkline-ranges.d.ts.map +1 -0
  225. package/dist/xlsx/edit/sparkline-xml.d.ts +13 -0
  226. package/dist/xlsx/edit/sparkline-xml.d.ts.map +1 -0
  227. package/dist/xlsx/edit/sparklines.d.ts +16 -0
  228. package/dist/xlsx/edit/sparklines.d.ts.map +1 -0
  229. package/dist/xlsx/edit/table-edits.d.ts.map +1 -1
  230. package/dist/xlsx/edit/tables.d.ts.map +1 -1
  231. package/dist/xlsx/edit/types.d.ts +22 -1
  232. package/dist/xlsx/edit/types.d.ts.map +1 -1
  233. package/dist/xlsx/formula/functions/text-regex.d.ts.map +1 -1
  234. package/dist/xlsx/index.cjs +3415 -1374
  235. package/dist/xlsx/index.d.ts +1 -0
  236. package/dist/xlsx/index.d.ts.map +1 -1
  237. package/dist/xlsx/index.mjs +3396 -1375
  238. package/dist/xlsx/layout/cell-view.d.ts +2 -0
  239. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  240. package/dist/xlsx/layout/header-footer.d.ts +58 -0
  241. package/dist/xlsx/layout/header-footer.d.ts.map +1 -0
  242. package/dist/xlsx/layout/index.d.ts +5 -0
  243. package/dist/xlsx/layout/index.d.ts.map +1 -1
  244. package/dist/xlsx/layout/print-breaks.d.ts +11 -0
  245. package/dist/xlsx/layout/print-breaks.d.ts.map +1 -0
  246. package/dist/xlsx/layout/print-layout.d.ts +34 -0
  247. package/dist/xlsx/layout/print-layout.d.ts.map +1 -0
  248. package/dist/xlsx/layout/print-merges.d.ts +18 -0
  249. package/dist/xlsx/layout/print-merges.d.ts.map +1 -0
  250. package/dist/xlsx/layout/print-repeat.d.ts +12 -0
  251. package/dist/xlsx/layout/print-repeat.d.ts.map +1 -0
  252. package/dist/xlsx/layout/print-titles.d.ts +20 -0
  253. package/dist/xlsx/layout/print-titles.d.ts.map +1 -0
  254. package/dist/xlsx/layout/sparkline-data.d.ts.map +1 -1
  255. package/dist/xlsx/layout/sparkline-view.d.ts.map +1 -1
  256. package/dist/xlsx/load/index.cjs +7831 -6961
  257. package/dist/xlsx/load/index.mjs +7831 -6961
  258. package/dist/xlsx/model-pivots.d.ts +46 -0
  259. package/dist/xlsx/model-pivots.d.ts.map +1 -0
  260. package/dist/xlsx/model.d.ts +5 -0
  261. package/dist/xlsx/model.d.ts.map +1 -1
  262. package/dist/xlsx/pivot/admission.d.ts +5 -0
  263. package/dist/xlsx/pivot/admission.d.ts.map +1 -0
  264. package/dist/xlsx/pivot/aggregate.d.ts +19 -0
  265. package/dist/xlsx/pivot/aggregate.d.ts.map +1 -0
  266. package/dist/xlsx/pivot/cache-xml.d.ts +9 -0
  267. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -0
  268. package/dist/xlsx/pivot/data.d.ts +12 -0
  269. package/dist/xlsx/pivot/data.d.ts.map +1 -0
  270. package/dist/xlsx/pivot/hierarchy.d.ts +7 -0
  271. package/dist/xlsx/pivot/hierarchy.d.ts.map +1 -0
  272. package/dist/xlsx/pivot/index.d.ts +3 -0
  273. package/dist/xlsx/pivot/index.d.ts.map +1 -0
  274. package/dist/xlsx/pivot/read.d.ts +5 -0
  275. package/dist/xlsx/pivot/read.d.ts.map +1 -0
  276. package/dist/xlsx/pivot/table-xml.d.ts +5 -0
  277. package/dist/xlsx/pivot/table-xml.d.ts.map +1 -0
  278. package/dist/xlsx/pivot/write.d.ts +11 -0
  279. package/dist/xlsx/pivot/write.d.ts.map +1 -0
  280. package/dist/xlsx/read/load.d.ts.map +1 -1
  281. package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
  282. package/dist/xlsx/ui/commands/i18n/index.d.ts.map +1 -1
  283. package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
  284. package/dist/xlsx/ui/commands/i18n/pivots.d.ts +3 -0
  285. package/dist/xlsx/ui/commands/i18n/pivots.d.ts.map +1 -0
  286. package/dist/xlsx/ui/commands/i18n/print-layout.d.ts +3 -0
  287. package/dist/xlsx/ui/commands/i18n/print-layout.d.ts.map +1 -0
  288. package/dist/xlsx/ui/commands/i18n/sparklines.d.ts +3 -0
  289. package/dist/xlsx/ui/commands/i18n/sparklines.d.ts.map +1 -0
  290. package/dist/xlsx/ui/commands/i18n/tools.d.ts.map +1 -1
  291. package/dist/xlsx/ui/commands/page-breaks.d.ts +3 -0
  292. package/dist/xlsx/ui/commands/page-breaks.d.ts.map +1 -0
  293. package/dist/xlsx/ui/index.cjs +2451 -737
  294. package/dist/xlsx/ui/index.d.ts +1 -0
  295. package/dist/xlsx/ui/index.d.ts.map +1 -1
  296. package/dist/xlsx/ui/index.mjs +2451 -738
  297. package/dist/xlsx/write/chart-cache.d.ts +8 -0
  298. package/dist/xlsx/write/chart-cache.d.ts.map +1 -0
  299. package/dist/xlsx/write/page-setup.d.ts.map +1 -1
  300. package/dist/xlsx/write/save.d.ts.map +1 -1
  301. package/dist/xlsx/write/sheet-parts.d.ts +1 -0
  302. package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
  303. package/dist/xlsx/write/workbook-part.d.ts +1 -1
  304. package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
  305. package/dist/xlsx/write/worksheet.d.ts.map +1 -1
  306. package/package.json +1 -1
  307. package/dist/pptx/chunks/index-Cn-GzYGp.d.ts.map +0 -1
  308. package/dist/pptx/chunks/text-operations-BHfAm5K9.d.ts.map +0 -1
@@ -288,9 +288,9 @@ var init_namespaces = __esm({
288
288
  }
289
289
  });
290
290
  function parseXml(xml, options = {}) {
291
- const label2 = options.label ?? "OOXML";
291
+ const label3 = options.label ?? "OOXML";
292
292
  if (/<!DOCTYPE|<!ENTITY/i.test(xml))
293
- throw new Error(`${label2} XML with DTD or entity declarations is not supported`);
293
+ throw new Error(`${label3} XML with DTD or entity declarations is not supported`);
294
294
  let parseError = "";
295
295
  let parsed;
296
296
  try {
@@ -301,12 +301,12 @@ function parseXml(xml, options = {}) {
301
301
  }).parseFromString(xml, "application/xml");
302
302
  } catch (error) {
303
303
  throw new Error(
304
- `Invalid ${label2} XML: ${error instanceof Error ? error.message : String(error)}`,
304
+ `Invalid ${label3} XML: ${error instanceof Error ? error.message : String(error)}`,
305
305
  { cause: error }
306
306
  );
307
307
  }
308
308
  if (parseError || !parsed.documentElement)
309
- throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
309
+ throw new Error(`Invalid ${label3} XML: ${parseError || "missing root element"}`);
310
310
  return parsed;
311
311
  }
312
312
  function named(element2, local, ns, lenient = true) {
@@ -940,19 +940,19 @@ var init_opc = __esm({
940
940
 
941
941
  // xlsx/address.ts
942
942
  function columnLabel(col) {
943
- let label2 = "";
943
+ let label3 = "";
944
944
  let n = col + 1;
945
945
  while (n > 0) {
946
946
  const rem = (n - 1) % 26;
947
- label2 = String.fromCharCode(65 + rem) + label2;
947
+ label3 = String.fromCharCode(65 + rem) + label3;
948
948
  n = Math.floor((n - 1) / 26);
949
949
  }
950
- return label2;
950
+ return label3;
951
951
  }
952
- function columnIndex(label2) {
953
- if (!/^[A-Za-z]{1,3}$/.test(label2)) return -1;
952
+ function columnIndex(label3) {
953
+ if (!/^[A-Za-z]{1,3}$/.test(label3)) return -1;
954
954
  let n = 0;
955
- for (const ch of label2.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64);
955
+ for (const ch of label3.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64);
956
956
  return n - 1;
957
957
  }
958
958
  function parseAddress(ref) {
@@ -1006,12 +1006,13 @@ function formatRange(range) {
1006
1006
  function quoteSheetName(name) {
1007
1007
  return /^[A-Za-z_][A-Za-z0-9_.]*$/.test(name) && !parseAddress(name) ? name : `'${name.replace(/'/g, "''")}'`;
1008
1008
  }
1009
- var MAX_ROW, MAX_COL, formatAddress, cellKey;
1009
+ var MAX_ROW, MAX_COL, formatAddress, rangeSize, cellKey;
1010
1010
  var init_address = __esm({
1011
1011
  "xlsx/address.ts"() {
1012
1012
  MAX_ROW = 1048575;
1013
1013
  MAX_COL = 16383;
1014
1014
  formatAddress = (address2) => `${columnLabel(address2.col)}${address2.row + 1}`;
1015
+ rangeSize = (range) => (range.end.row - range.start.row + 1) * (range.end.col - range.start.col + 1);
1015
1016
  cellKey = (row2, col) => row2 * (MAX_COL + 1) + col;
1016
1017
  }
1017
1018
  });
@@ -2617,10 +2618,10 @@ function titleXml(context, title) {
2617
2618
  function labelOptionsXml(context, options) {
2618
2619
  return numberFormatXml(options.numberFormat) + shapePropertiesXml(context, options.spPr) + textBodyXml(context, options.txPr) + valXml("dLblPos", options.position) + valXml("showLegendKey", options.showLegendKey) + valXml("showVal", options.showValue) + valXml("showCatName", options.showCategoryName) + valXml("showSerName", options.showSeriesName) + valXml("showPercent", options.showPercent) + valXml("showBubbleSize", options.showBubbleSize) + (options.separator === void 0 ? "" : textElement("separator", options.separator));
2619
2620
  }
2620
- function labelXml(context, label2) {
2621
+ function labelXml(context, label3) {
2621
2622
  return elementXml(
2622
2623
  "dLbl",
2623
- valXml("idx", label2.index) + valXml("delete", label2.deleted) + layoutXml(context, label2.layout) + chartTextXml(context, label2.tx, false) + labelOptionsXml(context, label2) + raw(context, label2.extLst)
2624
+ valXml("idx", label3.index) + valXml("delete", label3.deleted) + layoutXml(context, label3.layout) + chartTextXml(context, label3.tx, false) + labelOptionsXml(context, label3) + raw(context, label3.extLst)
2624
2625
  );
2625
2626
  }
2626
2627
  function dataLabelsXml(context, labels) {
@@ -2628,7 +2629,7 @@ function dataLabelsXml(context, labels) {
2628
2629
  const leaderLines = labels.leaderLines ? elementXml("leaderLines", shapePropertiesXml(context, labels.leaderLines.spPr)) : "";
2629
2630
  return elementXml(
2630
2631
  "dLbls",
2631
- labels.labels.map((label2) => labelXml(context, label2)).join("") + valXml("delete", labels.deleted) + labelOptionsXml(context, labels) + valXml("showLeaderLines", labels.showLeaderLines) + leaderLines + raw(context, labels.extLst)
2632
+ labels.labels.map((label3) => labelXml(context, label3)).join("") + valXml("delete", labels.deleted) + labelOptionsXml(context, labels) + valXml("showLeaderLines", labels.showLeaderLines) + leaderLines + raw(context, labels.extLst)
2632
2633
  );
2633
2634
  }
2634
2635
  var textElement, dataSourceXml;
@@ -2659,12 +2660,12 @@ function dataTableXml(context, table2) {
2659
2660
  }
2660
2661
  function displayUnitsXml(context, units) {
2661
2662
  if (!units) return "";
2662
- const label2 = units.label;
2663
+ const label3 = units.label;
2663
2664
  return elementXml(
2664
2665
  "dispUnits",
2665
- valXml("custUnit", units.customUnit) + (units.customUnit === void 0 ? valXml("builtInUnit", units.builtInUnit) : "") + (label2 ? elementXml(
2666
+ valXml("custUnit", units.customUnit) + (units.customUnit === void 0 ? valXml("builtInUnit", units.builtInUnit) : "") + (label3 ? elementXml(
2666
2667
  "dispUnitsLbl",
2667
- layoutXml(context, label2.layout) + chartTextXml(context, label2.tx, false) + shapePropertiesXml(context, label2.spPr) + textBodyXml(context, label2.txPr)
2668
+ layoutXml(context, label3.layout) + chartTextXml(context, label3.tx, false) + shapePropertiesXml(context, label3.spPr) + textBodyXml(context, label3.txPr)
2668
2669
  ) : "") + raw(context, units.extLst)
2669
2670
  );
2670
2671
  }
@@ -2875,10 +2876,10 @@ function parseDisplayUnits(context, element2) {
2875
2876
  if (!element2) return void 0;
2876
2877
  reportUnmodelled(context, element2, DISPLAY_UNITS);
2877
2878
  const labelElement = cChild(element2, "dispUnitsLbl");
2878
- let label2;
2879
+ let label3;
2879
2880
  if (labelElement) {
2880
2881
  reportUnmodelled(context, labelElement, DISPLAY_UNITS_LABEL);
2881
- label2 = assignDefined(
2882
+ label3 = assignDefined(
2882
2883
  {},
2883
2884
  {
2884
2885
  layout: manualLayout(labelElement),
@@ -2893,7 +2894,7 @@ function parseDisplayUnits(context, element2) {
2893
2894
  {
2894
2895
  builtInUnit: cVal(element2, "builtInUnit"),
2895
2896
  customUnit: cNumber(context, element2, "custUnit"),
2896
- label: label2,
2897
+ label: label3,
2897
2898
  extLst: extensionList(element2)
2898
2899
  }
2899
2900
  );
@@ -7292,10 +7293,11 @@ function usedRange(sheet) {
7292
7293
  if (maxRow < 0) return void 0;
7293
7294
  return { start: { row: minRow, col: minCol }, end: { row: maxRow, col: maxCol } };
7294
7295
  }
7295
- var getCell;
7296
+ var getCell, getValue;
7296
7297
  var init_cells = __esm({
7297
7298
  "xlsx/cells.ts"() {
7298
7299
  getCell = (sheet, row2, col) => sheet.rows.get(row2)?.get(col);
7300
+ getValue = (sheet, row2, col) => getCell(sheet, row2, col)?.value ?? null;
7299
7301
  }
7300
7302
  });
7301
7303
 
@@ -15839,13 +15841,27 @@ var init_text_regex = __esm({
15839
15841
  "REGEXEXTRACT",
15840
15842
  C36,
15841
15843
  "REGEXEXTRACT(text, pattern, [return_mode], [case_sensitivity])",
15842
- "The first part of the text that matches the pattern.",
15844
+ "Extracts the first match (0), all matches (1), or the first match\u2019s capture groups (2).",
15843
15845
  2,
15844
15846
  4,
15845
15847
  (args) => {
15846
- if (optNum(args, 2, 0) !== 0) fail(ERR.VALUE);
15847
- const match2 = compile(str(args[1]), caseMode(args, 3), false).exec(str(args[0]));
15848
- return match2 ? match2[0] : fail(ERR.NA);
15848
+ const mode = optNum(args, 2, 0);
15849
+ if (mode !== 0 && mode !== 1 && mode !== 2) fail(ERR.VALUE);
15850
+ const regex = compile(str(args[1]), caseMode(args, 3), mode === 1);
15851
+ const text = str(args[0]);
15852
+ if (mode === 1) {
15853
+ const matches2 = [];
15854
+ for (const match3 of text.matchAll(regex)) {
15855
+ checkArraySize(matches2.length + 1, 1);
15856
+ matches2.push(match3[0]);
15857
+ }
15858
+ return matches2.length ? new Matrix(matches2.map((match3) => [match3])) : fail(ERR.NA);
15859
+ }
15860
+ const match2 = regex.exec(text);
15861
+ if (!match2) fail(ERR.NA);
15862
+ if (mode === 0) return match2[0];
15863
+ if (match2.length === 1) fail(ERR.VALUE);
15864
+ return new Matrix([match2.slice(1).map((group) => group ?? "")]);
15849
15865
  }
15850
15866
  ),
15851
15867
  spec(
@@ -17524,7 +17540,7 @@ function definedNamesOf(workbook) {
17524
17540
  });
17525
17541
  return names2;
17526
17542
  }
17527
- function workbookXml(workbook, sheets, activeTab, sourceXml) {
17543
+ function workbookXml(workbook, sheets, activeTab, sourceXml, pivotCachesXml) {
17528
17544
  const kept = /* @__PURE__ */ new Map();
17529
17545
  if (sourceXml) {
17530
17546
  try {
@@ -17568,7 +17584,7 @@ function workbookXml(workbook, sheets, activeTab, sourceXml) {
17568
17584
  const iterate = workbook.iterate ? ` iterate="1" iterateCount="${workbook.iterate.count}" iterateDelta="${workbook.iterate.delta}"` : "";
17569
17585
  const owned = ["fullCalcOnLoad", "calcId", "calcMode", "iterate", "iterateCount", "iterateDelta"];
17570
17586
  out += `<calcPr${copyAttrs(calc, owned)} calcId="191029"${mode}${iterate} fullCalcOnLoad="1"/>`;
17571
- out += raw2(KEPT_TAIL);
17587
+ out += pivotCachesXml === void 0 ? raw2(KEPT_TAIL) : raw2(KEPT_TAIL.slice(0, 2)) + pivotCachesXml + raw2(KEPT_TAIL.slice(3));
17572
17588
  return `${out}</workbook>`;
17573
17589
  }
17574
17590
  var KEPT_BEFORE_SHEETS, KEPT_AFTER_SHEETS, KEPT_TAIL, copyAttrs;
@@ -17996,6 +18012,11 @@ function readHeaderFooter(node) {
17996
18012
  function readPageSetup(margins, setup, headerFooter, fitToPage) {
17997
18013
  const page = {};
17998
18014
  if (setup) {
18015
+ if (/^(1|true)$/.test(att(setup, "useFirstPageNumber") ?? "")) {
18016
+ page.firstPageNumber = numAttr(setup, "firstPageNumber") ?? 1;
18017
+ }
18018
+ const order = att(setup, "pageOrder");
18019
+ if (order === "downThenOver" || order === "overThenDown") page.pageOrder = order;
17999
18020
  const orientation = att(setup, "orientation");
18000
18021
  if (orientation && ORIENTATIONS.has(orientation))
18001
18022
  page.orientation = orientation;
@@ -18493,9 +18514,9 @@ var init_gradient_preset_data = __esm({
18493
18514
  var init_gradient_presets = __esm({
18494
18515
  "drawingml/gradient-presets.ts"() {
18495
18516
  init_gradient_preset_data();
18496
- OFFICE_GRADIENT_PRESET_DATA.map(([label2], index2) => ({
18517
+ OFFICE_GRADIENT_PRESET_DATA.map(([label3], index2) => ({
18497
18518
  id: index2 + 1,
18498
- label: label2
18519
+ label: label3
18499
18520
  }));
18500
18521
  }
18501
18522
  });
@@ -18731,8 +18752,8 @@ function parseTable(xml, partName) {
18731
18752
  if (id !== void 0 && Number.isInteger(id) && id >= 0) column.sourceId = id;
18732
18753
  const fn = att(node, "totalsRowFunction");
18733
18754
  if (fn && fn !== "none") column.totalsRowFunction = fn;
18734
- const label2 = att(node, "totalsRowLabel");
18735
- if (label2 !== void 0) column.totalsRowLabel = label2;
18755
+ const label3 = att(node, "totalsRowLabel");
18756
+ if (label3 !== void 0) column.totalsRowLabel = label3;
18736
18757
  const calculated = xFirst(node, "calculatedColumnFormula");
18737
18758
  if (calculated) column.calculatedColumnFormula = stripFuturePrefixes(xText(calculated));
18738
18759
  return column;
@@ -18814,20 +18835,28 @@ function setupXml(sheet, page) {
18814
18835
  const source2 = snapshotElement(sheet, "pageSetup");
18815
18836
  const fit = page.fitToWidth !== void 0 || page.fitToHeight !== void 0;
18816
18837
  const pick2 = (p) => ({
18838
+ firstPageNumber: p.firstPageNumber,
18839
+ pageOrder: p.pageOrder,
18817
18840
  orientation: p.orientation,
18818
18841
  paperSize: p.paperSize,
18819
18842
  scale: p.scale,
18820
18843
  fitToWidth: p.fitToWidth,
18821
18844
  fitToHeight: p.fitToHeight
18822
18845
  });
18823
- const modelled = fit || page.orientation !== void 0 || page.paperSize !== void 0 || page.scale !== void 0;
18846
+ const modelled = page.firstPageNumber !== void 0 || page.pageOrder !== void 0 || fit || page.orientation !== void 0 || page.paperSize !== void 0 || page.scale !== void 0;
18824
18847
  if (!source2 && !modelled) return "";
18825
18848
  if (source2) {
18826
18849
  const before = readPageSetup(void 0, source2, void 0, fit) ?? {};
18827
18850
  if (sameModel(pick2(before), pick2(page))) return snapshotXml(sheet, "pageSetup") ?? "";
18828
18851
  }
18829
18852
  const fitValues = fit ? { fitToWidth: page.fitToWidth, fitToHeight: page.fitToHeight } : {};
18853
+ const numbering = page.firstPageNumber !== void 0 || !source2 || readPageSetup(void 0, source2, void 0, fit)?.firstPageNumber !== void 0 ? {
18854
+ firstPageNumber: page.firstPageNumber,
18855
+ useFirstPageNumber: page.firstPageNumber !== void 0 ? true : void 0
18856
+ } : {};
18830
18857
  return `<pageSetup${mergedAttrs(source2, {
18858
+ ...numbering,
18859
+ pageOrder: page.pageOrder,
18831
18860
  paperSize: page.paperSize,
18832
18861
  scale: page.scale,
18833
18862
  ...fitValues,
@@ -18983,6 +19012,76 @@ var init_sheet_data = __esm({
18983
19012
  }
18984
19013
  });
18985
19014
 
19015
+ // xlsx/layout/sparkline-data.ts
19016
+ function resolveSparklineRange(workbook, sheet, formula) {
19017
+ const ref = formula.trim().replace(/^=/, "");
19018
+ const bang = ref.lastIndexOf("!");
19019
+ let target = sheet;
19020
+ if (bang >= 0) {
19021
+ const raw2 = ref.slice(0, bang);
19022
+ const name = /^'.*'$/.test(raw2) ? raw2.slice(1, -1).replace(/''/g, "'") : raw2;
19023
+ target = sheetByName(workbook, name);
19024
+ }
19025
+ const range = parseRange(ref.slice(bang + 1).replace(/\$/g, ""));
19026
+ return target && range ? { sheet: target, range: normalizeRange(range) } : void 0;
19027
+ }
19028
+ var init_sparkline_data = __esm({
19029
+ "xlsx/layout/sparkline-data.ts"() {
19030
+ init_address();
19031
+ init_workbook();
19032
+ }
19033
+ });
19034
+
19035
+ // xlsx/write/chart-cache.ts
19036
+ function referenceValues(workbook, sheet, ref, maxCells = MAX_CHART_CACHE_CELLS) {
19037
+ if (!ref) return void 0;
19038
+ const target = resolveSparklineRange(workbook, sheet, ref);
19039
+ if (!target) return void 0;
19040
+ const { range } = target;
19041
+ const count2 = rangeSize(range);
19042
+ if (!Number.isSafeInteger(count2) || count2 < 1 || count2 > maxCells || range.end.row > MAX_ROW || range.end.col > MAX_COL)
19043
+ return void 0;
19044
+ const values2 = [];
19045
+ for (let row2 = range.start.row; row2 <= range.end.row; row2++)
19046
+ for (let col = range.start.col; col <= range.end.col; col++)
19047
+ values2.push(getValue(target.sheet, row2, col));
19048
+ return values2;
19049
+ }
19050
+ function categoryValue(value) {
19051
+ if (value === null) return "";
19052
+ if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
19053
+ if (typeof value === "object") return value.error;
19054
+ if (typeof value === "number" && !Number.isFinite(value)) return "";
19055
+ return value;
19056
+ }
19057
+ function chartWithCurrentCaches(workbook, sheet, chart) {
19058
+ return {
19059
+ ...chart,
19060
+ series: chart.series.map((series) => {
19061
+ const values2 = referenceValues(workbook, sheet, series.valuesRef);
19062
+ const categories = referenceValues(workbook, sheet, series.categoriesRef);
19063
+ const name = referenceValues(workbook, sheet, series.nameRef, 1);
19064
+ return {
19065
+ ...series,
19066
+ ...name === void 0 ? {} : { name: String(categoryValue(name[0] ?? null)) },
19067
+ values: values2?.map(
19068
+ (value) => typeof value === "number" && Number.isFinite(value) ? value : null
19069
+ ) ?? series.values,
19070
+ categories: categories?.map(categoryValue) ?? series.categories
19071
+ };
19072
+ })
19073
+ };
19074
+ }
19075
+ var MAX_CHART_CACHE_CELLS;
19076
+ var init_chart_cache = __esm({
19077
+ "xlsx/write/chart-cache.ts"() {
19078
+ init_address();
19079
+ init_cells();
19080
+ init_sparkline_data();
19081
+ MAX_CHART_CACHE_CELLS = 1e4;
19082
+ }
19083
+ });
19084
+
18986
19085
  // xlsx/write/vml-ids.ts
18987
19086
  function vmlIdmapBlocks(xml) {
18988
19087
  const blocks = [];
@@ -19474,7 +19573,10 @@ function writeSheetDrawing(ctx, sheet, partName, rels, sourceDrawing) {
19474
19573
  }
19475
19574
  }
19476
19575
  const target = sourceDrawing && !writer.has(sourceDrawing) ? sourceDrawing : writer.uniqueName((n) => `xl/drawings/drawing${n}.xml`, ctx.reserved);
19477
- if (!writeDrawing(writer, target, sheet.drawings, sourceDrawing)) return "";
19576
+ const drawings = sheet.drawings.map(
19577
+ (object) => object.kind === "chart" && (!object.partName || !source2?.has(object.partName)) ? chartWithCurrentCaches(ctx.workbook, sheet, object) : object
19578
+ );
19579
+ if (!writeDrawing(writer, target, drawings, sourceDrawing)) return "";
19478
19580
  return `<drawing r:id="${rels.add(RELATIONSHIP_TYPES.drawing, relativeTarget(partName, target))}"/>`;
19479
19581
  }
19480
19582
  var init_sheet_parts = __esm({
@@ -19484,6 +19586,7 @@ var init_sheet_parts = __esm({
19484
19586
  init_drawing3();
19485
19587
  init_package2();
19486
19588
  init_tables();
19589
+ init_chart_cache();
19487
19590
  init_comments2();
19488
19591
  init_drawing();
19489
19592
  init_snapshot();
@@ -19703,6 +19806,8 @@ function writeWorksheet(ctx, sheet, index2, partName) {
19703
19806
  const ids = sourceRelIds(source2, sheet.partName);
19704
19807
  for (const [id, rel] of source2.rels(sheet.partName)) {
19705
19808
  const target = source2.target(sheet.partName, rel);
19809
+ if (rel.type === RELATIONSHIP_TYPES.pivotTable && target && sheet.preserved.get("source:pivotTables")?.includes(target))
19810
+ continue;
19706
19811
  if (rel.type === RELATIONSHIP_TYPES.drawing && id === ids.drawing) sourceDrawing = target;
19707
19812
  if (REGENERATED.has(rel.type) || rel.type === RELATIONSHIP_TYPES.vmlDrawing && id === ids.legacy)
19708
19813
  continue;
@@ -19757,6 +19862,7 @@ function writeWorksheet(ctx, sheet, index2, partName) {
19757
19862
  blocks.set("drawing", writeSheetDrawing(ctx, sheet, partName, rels, sourceDrawing));
19758
19863
  blocks.set("legacyDrawing", writeComments(ctx, sheet, index2, partName, rels));
19759
19864
  blocks.set("tableParts", tableParts);
19865
+ ctx.pivots?.writeSheet(writer, sheet, partName, rels);
19760
19866
  blocks.set("extLst", conditionalExtensionsXml(sheet));
19761
19867
  for (const [key, list] of sheet.preserved) {
19762
19868
  if (key.startsWith("source:") || !ORDER2.includes(key) || (blocks.get(key) ?? "") !== "")
@@ -19842,6 +19948,532 @@ var init_worksheet2 = __esm({
19842
19948
  }
19843
19949
  });
19844
19950
 
19951
+ // xlsx/edit/sparkline-ranges.ts
19952
+ function checkedSparklineRange(raw2) {
19953
+ const range = normalizeRange(raw2);
19954
+ for (const point of [range.start, range.end])
19955
+ if (!Number.isInteger(point.row) || !Number.isInteger(point.col) || point.row < 0 || point.col < 0 || point.row > MAX_ROW || point.col > MAX_COL)
19956
+ throw new RangeError("The reference is not valid.");
19957
+ return range;
19958
+ }
19959
+ function sparklineDataRange(workbook, sheet, source2) {
19960
+ let ast;
19961
+ try {
19962
+ ast = parseFormula(source2.trim().replace(/^=/, ""));
19963
+ } catch {
19964
+ throw new Error("The reference is not valid.");
19965
+ }
19966
+ if (ast.type !== "ref" || !ast.ref || !["cell", "area"].includes(ast.ref.kind) || ast.prefix?.book || ast.prefix?.sheet2 || ast.spill)
19967
+ throw new Error("The reference is not valid.");
19968
+ const index2 = ast.prefix ? workbook.sheets.findIndex((ws) => ws.name.toLowerCase() === ast.prefix.sheet.toLowerCase()) : sheet;
19969
+ if (!workbook.sheets[index2]) throw new Error("The reference is not valid.");
19970
+ return { sheet: index2, range: checkedSparklineRange({ start: ast.ref.start, end: ast.ref.end }) };
19971
+ }
19972
+ var init_sparkline_ranges = __esm({
19973
+ "xlsx/edit/sparkline-ranges.ts"() {
19974
+ init_address();
19975
+ init_parser();
19976
+ }
19977
+ });
19978
+
19979
+ // xlsx/pivot/data.ts
19980
+ function pivotValueKey(value) {
19981
+ return value === null || value === "" ? "blank" : isCellError(value) ? `error:${value.error}` : `${typeof value}:${String(value).toLowerCase()}`;
19982
+ }
19983
+ function pivotItems(pivot, field) {
19984
+ const index2 = pivot.fields.indexOf(field);
19985
+ const items = /* @__PURE__ */ new Map();
19986
+ for (const record of pivot.records) {
19987
+ const value = record[index2] ?? null;
19988
+ const key = pivotValueKey(value);
19989
+ if (!items.has(key)) items.set(key, value);
19990
+ }
19991
+ const rank3 = (value) => value === null || value === "" ? 4 : isCellError(value) ? 3 : typeof value === "boolean" ? 2 : typeof value === "string" ? 1 : 0;
19992
+ return [...items.values()].sort(
19993
+ (a2, b) => rank3(a2) - rank3(b) || (typeof a2 === "number" && typeof b === "number" ? a2 - b : String(pivotItemLabel(a2)).localeCompare(String(pivotItemLabel(b)), "en", {
19994
+ sensitivity: "base",
19995
+ numeric: true
19996
+ }))
19997
+ );
19998
+ }
19999
+ function pivotItemLabel(value) {
20000
+ if (value === null || value === "") return "(blank)";
20001
+ if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
20002
+ return isCellError(value) ? value.error : value;
20003
+ }
20004
+ function validatePivotFields(pivot) {
20005
+ const used = [
20006
+ pivot.rowField,
20007
+ ...pivot.secondRowField ? [pivot.secondRowField] : [],
20008
+ ...pivot.columnField ? [pivot.columnField] : [],
20009
+ pivot.valueField
20010
+ ];
20011
+ if (pivot.layout !== void 0 && !["tabular", "compact", "outline"].includes(pivot.layout) || pivot.subtotalPosition !== void 0 && !["top", "bottom"].includes(pivot.subtotalPosition) || !PIVOT_AGGREGATES.includes(pivot.aggregate) || used.some((field) => !pivot.fields.includes(field)) || new Set([pivot.rowField, pivot.secondRowField, pivot.columnField].filter(Boolean)).size !== [pivot.rowField, pivot.secondRowField, pivot.columnField].filter(Boolean).length || pivot.subtotals !== void 0 && typeof pivot.subtotals !== "boolean" || pivot.repeatLabels !== void 0 && typeof pivot.repeatLabels !== "boolean")
20012
+ throw new Error("Choose valid PivotTable fields; row and column fields must differ.");
20013
+ }
20014
+ var PIVOT_AGGREGATES;
20015
+ var init_data = __esm({
20016
+ "xlsx/pivot/data.ts"() {
20017
+ init_model();
20018
+ PIVOT_AGGREGATES = ["sum", "count", "average", "min", "max"];
20019
+ }
20020
+ });
20021
+
20022
+ // xlsx/pivot/cache-xml.ts
20023
+ function pivotCacheData(pivot) {
20024
+ const items = pivot.fields.map(() => []);
20025
+ const indices = pivot.fields.map(() => /* @__PURE__ */ new Map());
20026
+ for (const record of pivot.records)
20027
+ pivot.fields.forEach((_field, index2) => {
20028
+ const value = record[index2] ?? null;
20029
+ const key = pivotValueKey(value);
20030
+ if (!indices[index2].has(key)) {
20031
+ indices[index2].set(key, items[index2].length);
20032
+ items[index2].push(value);
20033
+ }
20034
+ });
20035
+ return { items, indices };
20036
+ }
20037
+ function valueXml(value) {
20038
+ if (value === null || value === "") return "<m/>";
20039
+ if (isCellError(value)) return `<e${attrs({ v: value.error })}/>`;
20040
+ if (typeof value === "string") return `<s${attrs({ v: encodeEscapes(value) })}/>`;
20041
+ if (typeof value === "boolean") return `<b v="${value ? 1 : 0}"/>`;
20042
+ if (!Number.isFinite(value)) throw new Error("The PivotTable cache contains an invalid value.");
20043
+ return `<n v="${value}"/>`;
20044
+ }
20045
+ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
20046
+ const source2 = sparklineDataRange(workbook, 0, pivot.source);
20047
+ const fields = pivot.fields.map((name, index2) => {
20048
+ const items = data.items[index2];
20049
+ const types = new Set(
20050
+ items.map((value) => value === null || value === "" ? "blank" : typeof value)
20051
+ );
20052
+ const nums = items.filter((value) => typeof value === "number");
20053
+ const text = items.some((item) => item !== null && item !== "" && typeof item !== "number");
20054
+ return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 0 })}><sharedItems${attrs({ count: items.length, containsString: !nums.length || text, containsNumber: !!nums.length, containsInteger: nums.length > 0 && nums.every(Number.isInteger), containsBlank: types.has("blank"), containsMixedTypes: nums.length > 0 && text, containsSemiMixedTypes: !nums.length || types.size > 1 })}>${items.map(valueXml).join("")}</sharedItems></cacheField>`;
20055
+ }).join("");
20056
+ return `${XML_HEADER}<pivotCacheDefinition xmlns="${NS.x}" xmlns:r="${NS.r}" r:id="${recordRel}" createdVersion="6" refreshedVersion="6" minRefreshableVersion="3" recordCount="${pivot.records.length}"><cacheSource type="worksheet"><worksheetSource${attrs({ ref: formatRange(source2.range), sheet: workbook.sheets[source2.sheet].name })}/></cacheSource><cacheFields count="${pivot.fields.length}">${fields}</cacheFields></pivotCacheDefinition>`;
20057
+ }
20058
+ function pivotCacheRecordsXml(pivot, data) {
20059
+ const records = pivot.records.map(
20060
+ (record) => `<r>${pivot.fields.map((_field, index2) => `<x v="${data.indices[index2].get(pivotValueKey(record[index2] ?? null))}"/>`).join("")}</r>`
20061
+ ).join("");
20062
+ return `${XML_HEADER}<pivotCacheRecords xmlns="${NS.x}" count="${pivot.records.length}">${records}</pivotCacheRecords>`;
20063
+ }
20064
+ var init_cache_xml = __esm({
20065
+ "xlsx/pivot/cache-xml.ts"() {
20066
+ init_xml2();
20067
+ init_model();
20068
+ init_address();
20069
+ init_sparkline_ranges();
20070
+ init_xml_out();
20071
+ init_data();
20072
+ }
20073
+ });
20074
+
20075
+ // xlsx/pivot/hierarchy.ts
20076
+ function hierarchicalPivotGrid(pivot, aggregate3) {
20077
+ const rowItems = pivotItems(pivot, pivot.rowField);
20078
+ const secondRowItems = pivotItems(pivot, pivot.secondRowField);
20079
+ const columnItems = pivot.columnField ? pivotItems(pivot, pivot.columnField) : [];
20080
+ const outerField = pivot.fields.indexOf(pivot.rowField);
20081
+ const innerField = pivot.fields.indexOf(pivot.secondRowField);
20082
+ const columnField = pivot.columnField ? pivot.fields.indexOf(pivot.columnField) : -1;
20083
+ const valueField = pivot.fields.indexOf(pivot.valueField);
20084
+ const layout2 = pivot.layout ?? "tabular";
20085
+ const compact = layout2 === "compact";
20086
+ const top = layout2 !== "tabular" && pivot.subtotals !== false && (pivot.subtotalPosition ?? "top") === "top";
20087
+ const bottom = pivot.subtotals !== false && !top;
20088
+ const rowLabelColumns = compact ? 1 : 2;
20089
+ const groups = /* @__PURE__ */ new Map();
20090
+ const details = /* @__PURE__ */ new Map();
20091
+ const children2 = /* @__PURE__ */ new Map();
20092
+ const innerIndices = new Map(secondRowItems.map((item, index2) => [pivotValueKey(item), index2]));
20093
+ const buckets = /* @__PURE__ */ new Map();
20094
+ const collect = (map, key, record) => {
20095
+ const list = map.get(key);
20096
+ if (list) list.push(record);
20097
+ else map.set(key, [record]);
20098
+ };
20099
+ for (const record of pivot.records) {
20100
+ const outer = pivotValueKey(record[outerField] ?? null);
20101
+ const inner = pivotValueKey(record[innerField] ?? null);
20102
+ collect(groups, outer, record);
20103
+ collect(details, JSON.stringify([outer, inner]), record);
20104
+ if (!children2.has(outer)) children2.set(outer, /* @__PURE__ */ new Set());
20105
+ children2.get(outer).add(inner);
20106
+ if (pivot.columnField) {
20107
+ const column = pivotValueKey(record[columnField] ?? null);
20108
+ for (const key of [[], [outer], [outer, inner]])
20109
+ collect(buckets, JSON.stringify([...key, column]), record);
20110
+ }
20111
+ }
20112
+ const rows = details.size + rowItems.length * (Number(layout2 !== "tabular") + Number(bottom)) + 3;
20113
+ if (rows * (columnItems.length + 3) > 1e6)
20114
+ throw new Error("The PivotTable result is too large.");
20115
+ const labels = compact ? ["Row Labels"] : [pivot.rowField, pivot.secondRowField];
20116
+ const values2 = pivot.columnField ? [
20117
+ [
20118
+ pivot.valueCaption,
20119
+ ...compact ? [] : [null],
20120
+ compact ? "Column Labels" : pivot.columnField,
20121
+ ...columnItems.slice(1).map(() => null),
20122
+ null
20123
+ ],
20124
+ [...labels, ...columnItems.map(label2), "Grand Total"]
20125
+ ] : [[...labels, pivot.valueCaption]];
20126
+ const indents = values2.map(() => 0);
20127
+ const rowEntries = [];
20128
+ const append = (labels2, numbers4, entry3, indent = 0) => {
20129
+ values2.push([...labels2, ...numbers4]);
20130
+ rowEntries.push(entry3);
20131
+ indents.push(indent);
20132
+ };
20133
+ const numbers3 = (keys, records) => [
20134
+ ...columnItems.map(
20135
+ (column) => aggregate3(
20136
+ buckets.get(JSON.stringify([...keys, pivotValueKey(column)])) ?? [],
20137
+ valueField,
20138
+ pivot.aggregate
20139
+ )
20140
+ ),
20141
+ aggregate3(records, valueField, pivot.aggregate)
20142
+ ];
20143
+ rowItems.forEach((outer, outerIndex) => {
20144
+ const key = pivotValueKey(outer);
20145
+ if (layout2 !== "tabular")
20146
+ append(
20147
+ [label2(outer), ...compact ? [] : [null]],
20148
+ top ? numbers3([key], groups.get(key) ?? []) : Array(columnItems.length + 1).fill(null),
20149
+ { indices: [outerIndex] }
20150
+ );
20151
+ let first2 = true;
20152
+ [...children2.get(key)].sort((a2, b) => innerIndices.get(a2) - innerIndices.get(b)).forEach((innerKey) => {
20153
+ const innerIndex = innerIndices.get(innerKey);
20154
+ const inner = secondRowItems[innerIndex];
20155
+ const keys = [key, innerKey];
20156
+ const records = details.get(JSON.stringify(keys));
20157
+ if (!records) return;
20158
+ append(
20159
+ compact ? [label2(inner)] : [
20160
+ pivot.repeatLabels || layout2 === "tabular" && first2 ? label2(outer) : null,
20161
+ label2(inner)
20162
+ ],
20163
+ numbers3(keys, records),
20164
+ { indices: [outerIndex, innerIndex] },
20165
+ compact ? 1 : 0
20166
+ );
20167
+ first2 = false;
20168
+ });
20169
+ if (bottom) {
20170
+ const caption = String(label2(outer));
20171
+ append(
20172
+ [`${caption} Total`, ...compact ? [] : [null]],
20173
+ numbers3([key], groups.get(key) ?? []),
20174
+ { indices: [outerIndex], type: "default" }
20175
+ );
20176
+ }
20177
+ });
20178
+ append(["Grand Total", ...compact ? [] : [null]], numbers3([], pivot.records), {
20179
+ indices: [0],
20180
+ type: "grand"
20181
+ });
20182
+ return {
20183
+ values: values2,
20184
+ rowItems,
20185
+ secondRowItems,
20186
+ columnItems,
20187
+ rowEntries,
20188
+ firstDataRow: pivot.columnField ? 2 : 1,
20189
+ rowLabelColumns,
20190
+ indents
20191
+ };
20192
+ }
20193
+ var label2;
20194
+ var init_hierarchy2 = __esm({
20195
+ "xlsx/pivot/hierarchy.ts"() {
20196
+ init_data();
20197
+ label2 = pivotItemLabel;
20198
+ }
20199
+ });
20200
+
20201
+ // xlsx/pivot/aggregate.ts
20202
+ function aggregate2(records, field, type) {
20203
+ if (!records.length) return null;
20204
+ const values2 = records.map((record) => record[field] ?? null);
20205
+ if (type === "count") return values2.filter((value) => value !== null && value !== "").length;
20206
+ const error = values2.find(isCellError);
20207
+ if (error) return error;
20208
+ const numbers3 = values2.filter((value) => typeof value === "number");
20209
+ if (!numbers3.length) return type === "average" ? { error: "#DIV/0!" } : 0;
20210
+ if (type === "min") return numbers3.reduce((a2, b) => Math.min(a2, b));
20211
+ if (type === "max") return numbers3.reduce((a2, b) => Math.max(a2, b));
20212
+ const sum2 = numbers3.reduce((total2, value) => total2 + value, 0);
20213
+ return type === "average" ? sum2 / numbers3.length : sum2;
20214
+ }
20215
+ function pivotGrid(pivot) {
20216
+ validatePivotFields(pivot);
20217
+ if (pivot.secondRowField) return hierarchicalPivotGrid(pivot, aggregate2);
20218
+ const rowItems = pivotItems(pivot, pivot.rowField);
20219
+ const columnItems = pivot.columnField ? pivotItems(pivot, pivot.columnField) : [];
20220
+ if ((rowItems.length + 3) * (columnItems.length + 2) > 1e6)
20221
+ throw new Error("The PivotTable result is too large.");
20222
+ const rowField = pivot.fields.indexOf(pivot.rowField);
20223
+ const colField = pivot.columnField ? pivot.fields.indexOf(pivot.columnField) : -1;
20224
+ const valueField = pivot.fields.indexOf(pivot.valueField);
20225
+ const groups = /* @__PURE__ */ new Map();
20226
+ const cells2 = /* @__PURE__ */ new Map();
20227
+ const columns = /* @__PURE__ */ new Map();
20228
+ const collect = (map, key, record) => {
20229
+ const found = map.get(key);
20230
+ if (found) found.push(record);
20231
+ else map.set(key, [record]);
20232
+ };
20233
+ for (const record of pivot.records) {
20234
+ const key = pivotValueKey(record[rowField] ?? null);
20235
+ collect(groups, key, record);
20236
+ if (pivot.columnField) {
20237
+ const col = pivotValueKey(record[colField] ?? null);
20238
+ collect(columns, col, record);
20239
+ collect(cells2, JSON.stringify([key, col]), record);
20240
+ }
20241
+ }
20242
+ const label3 = pivotItemLabel;
20243
+ const values2 = pivot.columnField ? [
20244
+ [
20245
+ pivot.valueCaption,
20246
+ pivot.layout === "compact" ? "Column Labels" : pivot.columnField,
20247
+ ...columnItems.slice(1).map(() => null),
20248
+ null
20249
+ ],
20250
+ [
20251
+ pivot.layout === "compact" ? "Row Labels" : pivot.rowField,
20252
+ ...columnItems.map(label3),
20253
+ "Grand Total"
20254
+ ]
20255
+ ] : [[pivot.layout === "compact" ? "Row Labels" : pivot.rowField, pivot.valueCaption]];
20256
+ for (const row2 of rowItems) {
20257
+ const records = groups.get(pivotValueKey(row2)) ?? [];
20258
+ values2.push([
20259
+ label3(row2),
20260
+ ...columnItems.map(
20261
+ (col) => aggregate2(
20262
+ cells2.get(JSON.stringify([pivotValueKey(row2), pivotValueKey(col)])) ?? [],
20263
+ valueField,
20264
+ pivot.aggregate
20265
+ )
20266
+ ),
20267
+ aggregate2(records, valueField, pivot.aggregate)
20268
+ ]);
20269
+ }
20270
+ values2.push([
20271
+ "Grand Total",
20272
+ ...columnItems.map(
20273
+ (col) => aggregate2(columns.get(pivotValueKey(col)) ?? [], valueField, pivot.aggregate)
20274
+ ),
20275
+ aggregate2(pivot.records, valueField, pivot.aggregate)
20276
+ ]);
20277
+ return { values: values2, rowItems, columnItems, firstDataRow: pivot.columnField ? 2 : 1 };
20278
+ }
20279
+ var init_aggregate = __esm({
20280
+ "xlsx/pivot/aggregate.ts"() {
20281
+ init_model();
20282
+ init_data();
20283
+ init_hierarchy2();
20284
+ }
20285
+ });
20286
+
20287
+ // xlsx/pivot/table-xml.ts
20288
+ function pivotTableXml(pivot, cacheId, cache2) {
20289
+ const grid = pivotGrid(pivot);
20290
+ const row2 = pivot.fields.indexOf(pivot.rowField);
20291
+ const second = pivot.secondRowField ? pivot.fields.indexOf(pivot.secondRowField) : -1;
20292
+ const col = pivot.columnField ? pivot.fields.indexOf(pivot.columnField) : -1;
20293
+ const value = pivot.fields.indexOf(pivot.valueField);
20294
+ const compact = pivot.layout === "compact";
20295
+ const outline = pivot.layout === "compact" || pivot.layout === "outline";
20296
+ const top = (pivot.subtotalPosition ?? (outline ? "top" : "bottom")) === "top";
20297
+ const fields = pivot.fields.map((_field, index2) => {
20298
+ const items2 = index2 === row2 ? grid.rowItems : index2 === second ? grid.secondRowItems : index2 === col ? grid.columnItems : void 0;
20299
+ const subtotal = !(index2 === row2 && pivot.subtotals === false);
20300
+ const repeated = pivot.repeatLabels && (index2 === row2 || index2 === second) ? '<extLst><ext uri="{2946ED86-A175-432a-8AC1-64E0C546D7DE}"><x14:pivotField xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" fillDownLabels="1"/></ext></extLst>' : "";
20301
+ return `<pivotField${attrs({ axis: index2 === row2 || index2 === second ? "axisRow" : index2 === col ? "axisCol" : void 0, dataField: index2 === value ? true : void 0, compact, outline, showAll: false, subtotalTop: index2 === row2 ? top : void 0, defaultSubtotal: subtotal ? void 0 : false })}>${items2 ? `<items count="${items2.length + Number(subtotal)}">${items2.map((item) => `<item x="${cache2.indices[index2].get(pivotValueKey(item))}"/>`).join("")}${subtotal ? '<item t="default"/>' : ""}</items>` : ""}${repeated}</pivotField>`;
20302
+ }).join("");
20303
+ const items = (count2) => Array.from({ length: count2 }, (_v, i) => `<i><x v="${i}"/></i>`).join("") + '<i t="grand"><x/></i>';
20304
+ const header = grid.firstDataRow - 1;
20305
+ const rowIndices = [row2, ...second >= 0 ? [second] : []];
20306
+ let previous = [];
20307
+ const rowItems = grid.rowEntries?.map((entry3) => {
20308
+ let prefix = 0;
20309
+ if (!entry3.type)
20310
+ while (prefix < entry3.indices.length - 1 && entry3.indices[prefix] === previous[prefix])
20311
+ prefix++;
20312
+ previous = entry3.type ? [] : entry3.indices;
20313
+ return `<i${attrs({ t: entry3.type, r: prefix || void 0 })}>${entry3.indices.slice(prefix).map((index2) => `<x${attrs({ v: index2 || void 0 })}/>`).join("")}</i>`;
20314
+ }).join("") ?? items(grid.rowItems.length);
20315
+ let body = `<location${attrs({ ref: formatRange(pivot.location), firstHeaderRow: header, firstDataRow: grid.firstDataRow, firstDataCol: grid.rowLabelColumns ?? 1 })}/><pivotFields count="${pivot.fields.length}">${fields}</pivotFields><rowFields count="${rowIndices.length}">${rowIndices.map((index2) => `<field x="${index2}"/>`).join("")}</rowFields><rowItems count="${grid.rowEntries?.length ?? grid.rowItems.length + 1}">${rowItems}</rowItems>`;
20316
+ if (col >= 0)
20317
+ body += `<colFields count="1"><field x="${col}"/></colFields><colItems count="${grid.columnItems.length + 1}">${items(grid.columnItems.length)}</colItems>`;
20318
+ else body += '<colItems count="1"><i><x/></i></colItems>';
20319
+ body += `<dataFields count="1"><dataField${attrs({ name: encodeEscapes(pivot.valueCaption), fld: value, subtotal: pivot.aggregate, baseField: 0, baseItem: 0 })}/></dataFields>`;
20320
+ const doc = parseXml(
20321
+ pivot.sourceXml ?? `<pivotTableDefinition xmlns="${NS.x}" dataCaption="Values" updatedVersion="6" minRefreshableVersion="3" createdVersion="6"><pivotTableStyleInfo name="PivotStyleLight16" showRowHeaders="1" showColHeaders="1" showRowStripes="0" showColStripes="0" showLastColumn="1"/></pivotTableDefinition>`
20322
+ );
20323
+ const root = doc.documentElement;
20324
+ root.setAttribute("name", pivot.name);
20325
+ root.setAttribute("cacheId", String(cacheId));
20326
+ root.setAttribute("compact", compact ? "1" : "0");
20327
+ root.setAttribute("compactData", compact ? "1" : "0");
20328
+ root.setAttribute("outline", outline ? "1" : "0");
20329
+ root.setAttribute("outlineData", outline ? "1" : "0");
20330
+ if (compact) root.setAttribute("indent", "0");
20331
+ root.setAttribute("rowGrandTotals", "1");
20332
+ root.setAttribute("colGrandTotals", "1");
20333
+ for (const extension of elements(
20334
+ first(root, "extLst", NS.x) ?? parseXml("<root/>").documentElement
20335
+ )) {
20336
+ const definition = first(
20337
+ extension,
20338
+ "pivotTableDefinition",
20339
+ "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
20340
+ );
20341
+ if (definition?.hasAttribute("fillDownLabelsDefault"))
20342
+ definition.setAttribute("fillDownLabelsDefault", pivot.repeatLabels ? "1" : "0");
20343
+ }
20344
+ const replaced = /* @__PURE__ */ new Set([
20345
+ "location",
20346
+ "pivotFields",
20347
+ "rowFields",
20348
+ "rowItems",
20349
+ "colFields",
20350
+ "colItems",
20351
+ "dataFields"
20352
+ ]);
20353
+ for (const child3 of elements(root)) if (replaced.has(child3.localName)) root.removeChild(child3);
20354
+ const replacement = parseXml(`<root xmlns="${NS.x}">${body}</root>`).documentElement;
20355
+ const before = root.firstChild;
20356
+ for (const child3 of elements(replacement)) root.insertBefore(doc.importNode(child3, true), before);
20357
+ return XML_HEADER + buildXml(root);
20358
+ }
20359
+ var init_table_xml = __esm({
20360
+ "xlsx/pivot/table-xml.ts"() {
20361
+ init_xml2();
20362
+ init_address();
20363
+ init_xml_out();
20364
+ init_aggregate();
20365
+ init_data();
20366
+ }
20367
+ });
20368
+
20369
+ // xlsx/pivot/write.ts
20370
+ var TYPES, PivotWritePlan;
20371
+ var init_write = __esm({
20372
+ "xlsx/pivot/write.ts"() {
20373
+ init_opc();
20374
+ init_xml2();
20375
+ init_xml_util();
20376
+ init_package_writer();
20377
+ init_drawing();
20378
+ init_cache_xml();
20379
+ init_table_xml();
20380
+ TYPES = {
20381
+ table: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml",
20382
+ definition: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml",
20383
+ records: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
20384
+ };
20385
+ PivotWritePlan = class {
20386
+ tableParts = /* @__PURE__ */ new Map();
20387
+ cachesXml;
20388
+ constructor(writer, workbook, source2, bookPart, bookRels, reserved) {
20389
+ const sourceCaches = source2?.text(bookPart) ? children(
20390
+ first(parseXml(source2.text(bookPart)).documentElement, "pivotCaches", NS.x) ?? parseXml("<root/>").documentElement,
20391
+ "pivotCache",
20392
+ NS.x
20393
+ ) : [];
20394
+ const retained = /* @__PURE__ */ new Set();
20395
+ const owns = workbook.sheets.some((sheet) => sheet.pivotTables !== void 0);
20396
+ for (const sheet of workbook.sheets)
20397
+ if (source2 && sheet.partName)
20398
+ for (const rel of source2.rels(sheet.partName).values()) {
20399
+ if (rel.type !== RELATIONSHIP_TYPES.pivotTable) continue;
20400
+ const part = source2.target(sheet.partName, rel);
20401
+ if (!part) continue;
20402
+ const pivot = sheet.pivotTables?.find((entry3) => entry3.partName === part);
20403
+ if (pivot?.dirty || !pivot && sheet.preserved.get("source:pivotTables")?.includes(part))
20404
+ continue;
20405
+ const xml = source2.text(part);
20406
+ if (xml) retained.add(Number(parseXml(xml).documentElement.getAttribute("cacheId")));
20407
+ }
20408
+ const entries = [];
20409
+ for (const node of sourceCaches) {
20410
+ const id = Number(node.getAttribute("cacheId"));
20411
+ if (owns && !retained.has(id)) continue;
20412
+ const rid = relAttr(node, "id");
20413
+ const rel = rid && source2?.rels(bookPart).get(rid);
20414
+ const part = rel && source2?.target(bookPart, rel);
20415
+ if (rel && rid && part) {
20416
+ bookRels.keep(rid, rel);
20417
+ writer.carry(part);
20418
+ entries.push(selfContainedXml(node));
20419
+ }
20420
+ }
20421
+ let cacheId = Math.max(
20422
+ -1,
20423
+ ...sourceCaches.map((node) => Number(node.getAttribute("cacheId"))).filter((id) => Number.isInteger(id) && id >= 0)
20424
+ ) + 1;
20425
+ for (const sheet of workbook.sheets)
20426
+ for (const pivot of sheet.pivotTables ?? []) {
20427
+ if (pivot.partName && !pivot.dirty) {
20428
+ this.tableParts.set(pivot, pivot.partName);
20429
+ continue;
20430
+ }
20431
+ const table2 = pivot.partName ?? writer.uniqueName((n) => `xl/pivotTables/pivotTable${n}.xml`, reserved);
20432
+ const definition = writer.uniqueName(
20433
+ (n) => `xl/pivotCache/pivotCacheDefinition${n}.xml`,
20434
+ reserved
20435
+ );
20436
+ const records = writer.uniqueName(
20437
+ (n) => `xl/pivotCache/pivotCacheRecords${n}.xml`,
20438
+ reserved
20439
+ );
20440
+ const cache2 = pivotCacheData(pivot);
20441
+ const cacheRels = new RelationshipSet();
20442
+ const recordRel = cacheRels.add(
20443
+ `${NS.r}/pivotCacheRecords`,
20444
+ relativeTarget(definition, records)
20445
+ );
20446
+ writer.add(records, pivotCacheRecordsXml(pivot, cache2), TYPES.records);
20447
+ writer.add(
20448
+ definition,
20449
+ pivotCacheDefinitionXml(pivot, workbook, cache2, recordRel),
20450
+ TYPES.definition
20451
+ );
20452
+ writer.rels(definition, cacheRels);
20453
+ writer.add(table2, pivotTableXml(pivot, cacheId, cache2), TYPES.table);
20454
+ const tableRels = new RelationshipSet();
20455
+ tableRels.add(RELATIONSHIP_TYPES.pivotCacheDefinition, relativeTarget(table2, definition));
20456
+ writer.rels(table2, tableRels);
20457
+ const rid = bookRels.add(
20458
+ RELATIONSHIP_TYPES.pivotCacheDefinition,
20459
+ relativeTarget(bookPart, definition)
20460
+ );
20461
+ entries.push(`<pivotCache cacheId="${cacheId++}" r:id="${rid}"/>`);
20462
+ this.tableParts.set(pivot, table2);
20463
+ }
20464
+ this.cachesXml = owns ? entries.length ? `<pivotCaches>${entries.join("")}</pivotCaches>` : "" : void 0;
20465
+ }
20466
+ writeSheet(writer, sheet, part, rels) {
20467
+ for (const pivot of sheet.pivotTables ?? []) {
20468
+ const table2 = this.tableParts.get(pivot);
20469
+ writer.carry(table2);
20470
+ rels.add(RELATIONSHIP_TYPES.pivotTable, relativeTarget(part, table2));
20471
+ }
20472
+ }
20473
+ };
20474
+ }
20475
+ });
20476
+
19845
20477
  // xlsx/write/save.ts
19846
20478
  async function saveXlsx(workbook) {
19847
20479
  if (!workbook.sheets.length) throw new Error("A workbook needs at least one sheet");
@@ -19884,6 +20516,7 @@ async function saveXlsx(workbook) {
19884
20516
  if (target) writer.carry(target);
19885
20517
  }
19886
20518
  }
20519
+ ctx.pivots = new PivotWritePlan(writer, workbook, source2, bookPart, rels, reserved);
19887
20520
  const states = workbook.sheets.map((sheet) => sheet.state);
19888
20521
  if (!states.includes("visible")) states[0] = "visible";
19889
20522
  let activeTab = Math.min(Math.max(0, workbook.activeSheet), workbook.sheets.length - 1);
@@ -19949,7 +20582,7 @@ async function saveXlsx(workbook) {
19949
20582
  const sourceXml = sourceBook ? source2?.text(sourceBook) : void 0;
19950
20583
  writer.add(
19951
20584
  bookPart,
19952
- workbookXml(workbook, sheetRefs, Math.max(0, activeTab), sourceXml),
20585
+ workbookXml(workbook, sheetRefs, Math.max(0, activeTab), sourceXml, ctx.pivots.cachesXml),
19953
20586
  keptVba ? CONTENT_TYPES.workbookMacro : CONTENT_TYPES.workbook
19954
20587
  );
19955
20588
  writer.rels(bookPart, rels);
@@ -19992,6 +20625,7 @@ var init_save = __esm({
19992
20625
  init_doc_props();
19993
20626
  init_workbook_part2();
19994
20627
  init_worksheet2();
20628
+ init_write();
19995
20629
  REGENERATED2 = /* @__PURE__ */ new Set([
19996
20630
  RELATIONSHIP_TYPES.worksheet,
19997
20631
  RELATIONSHIP_TYPES.chartsheet,
@@ -20002,7 +20636,8 @@ var init_save = __esm({
20002
20636
  RELATIONSHIP_TYPES.theme,
20003
20637
  RELATIONSHIP_TYPES.calcChain,
20004
20638
  RELATIONSHIP_TYPES.person,
20005
- RELATIONSHIP_TYPES.sheetMetadata
20639
+ RELATIONSHIP_TYPES.sheetMetadata,
20640
+ RELATIONSHIP_TYPES.pivotCacheDefinition
20006
20641
  ]);
20007
20642
  SHEET_TYPES = {
20008
20643
  [CONTENT_TYPES.chartsheet]: RELATIONSHIP_TYPES.chartsheet,
@@ -20022,7 +20657,7 @@ var write_exports = {};
20022
20657
  __export(write_exports, {
20023
20658
  saveXlsx: () => saveXlsx
20024
20659
  });
20025
- var init_write = __esm({
20660
+ var init_write2 = __esm({
20026
20661
  "xlsx/write/index.ts"() {
20027
20662
  init_save();
20028
20663
  }
@@ -21537,7 +22172,7 @@ function createFileActions(context) {
21537
22172
  checkFileAbort(options?.signal);
21538
22173
  const [{ createWorkbook: createWorkbook2 }, { saveXlsx: saveXlsx2 }] = await Promise.all([
21539
22174
  Promise.resolve().then(() => (init_workbook(), workbook_exports)),
21540
- Promise.resolve().then(() => (init_write(), write_exports))
22175
+ Promise.resolve().then(() => (init_write2(), write_exports))
21541
22176
  ]);
21542
22177
  checkFileAbort(options?.signal);
21543
22178
  const bytes = await withFileAbort(() => saveXlsx2(createWorkbook2()), options?.signal);