ooxml-core 1.9.0 → 1.11.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 (202) hide show
  1. package/dist/PptxHandler-DNZHAHUY.cjs +12 -0
  2. package/dist/PptxHandler-E44KDHMQ.mjs +3 -0
  3. package/dist/{PptxHandler-EX4WBIQQ.mjs → PptxHandler-NROFYT2N.mjs} +2 -2
  4. package/dist/automation/index.cjs +3236 -2258
  5. package/dist/automation/index.mjs +3236 -2258
  6. package/dist/{chunk-SWF7KVL5.cjs → chunk-2UVH6RHI.cjs} +1608 -1163
  7. package/dist/{chunk-M76PHYRR.mjs → chunk-7DSZI7S6.mjs} +1 -1
  8. package/dist/{chunk-AT66SA5M.cjs → chunk-7QZGRB3T.cjs} +28 -10
  9. package/dist/chunk-ANZ4Q6I3.cjs +21 -0
  10. package/dist/{chunk-CPKNMQLX.cjs → chunk-AWIDASUW.cjs} +25 -2
  11. package/dist/{chunk-SVQZXP3F.mjs → chunk-CBNKBVX5.mjs} +25 -2
  12. package/dist/{chunk-FIELY5PI.mjs → chunk-EC2W2MDY.mjs} +30 -2
  13. package/dist/chunk-EGTRL3QJ.mjs +19 -0
  14. package/dist/chunk-GXHKNSZX.mjs +9 -0
  15. package/dist/{chunk-OXHMZS7B.mjs → chunk-HCXUI5UC.mjs} +943 -273
  16. package/dist/chunk-HDQXPSHY.cjs +17 -0
  17. package/dist/chunk-KTYBFGEY.mjs +14 -0
  18. package/dist/chunk-QOO36KG4.cjs +42 -0
  19. package/dist/chunk-R2KZXD6U.mjs +39 -0
  20. package/dist/{chunk-IGOA57LE.mjs → chunk-U2DF3EGK.mjs} +1 -1
  21. package/dist/{chunk-OB277ZGE.mjs → chunk-UAY26XOI.mjs} +27 -9
  22. package/dist/{chunk-WSO4T2LJ.mjs → chunk-W5ARCUJB.mjs} +26 -3
  23. package/dist/chunk-XZPZHXV4.cjs +12 -0
  24. package/dist/{chunk-LCS3J3QI.mjs → chunk-YB5SRNFS.mjs} +717 -272
  25. package/dist/docx/layout/adapt-table.d.ts +2 -2
  26. package/dist/docx/layout/adapt-table.d.ts.map +1 -1
  27. package/dist/docx/layout/flow-table.d.ts.map +1 -1
  28. package/dist/docx/layout/index.cjs +554 -83
  29. package/dist/docx/layout/index.mjs +554 -84
  30. package/dist/docx/layout/nested-fragment-edges.d.ts +9 -0
  31. package/dist/docx/layout/nested-fragment-edges.d.ts.map +1 -0
  32. package/dist/docx/layout/nested-frame-profile.d.ts +9 -0
  33. package/dist/docx/layout/nested-frame-profile.d.ts.map +1 -0
  34. package/dist/docx/layout/page-cursor.d.ts +2 -0
  35. package/dist/docx/layout/page-cursor.d.ts.map +1 -1
  36. package/dist/docx/layout/result.d.ts +20 -0
  37. package/dist/docx/layout/result.d.ts.map +1 -1
  38. package/dist/docx/layout/table-border-layout.d.ts +16 -0
  39. package/dist/docx/layout/table-border-layout.d.ts.map +1 -0
  40. package/dist/docx/layout/table-cell-layout.d.ts +3 -2
  41. package/dist/docx/layout/table-cell-layout.d.ts.map +1 -1
  42. package/dist/docx/layout/table-content.d.ts +4 -0
  43. package/dist/docx/layout/table-content.d.ts.map +1 -0
  44. package/dist/docx/layout/table-footnotes.d.ts +5 -0
  45. package/dist/docx/layout/table-footnotes.d.ts.map +1 -1
  46. package/dist/docx/layout/table-frames.d.ts +4 -0
  47. package/dist/docx/layout/table-frames.d.ts.map +1 -0
  48. package/dist/docx/layout/table-layout.d.ts +8 -3
  49. package/dist/docx/layout/table-layout.d.ts.map +1 -1
  50. package/dist/docx/layout/table-note-completion.d.ts +5 -0
  51. package/dist/docx/layout/table-note-completion.d.ts.map +1 -0
  52. package/dist/docx/layout/table-note-stories.d.ts +6 -0
  53. package/dist/docx/layout/table-note-stories.d.ts.map +1 -0
  54. package/dist/pptx/automation/index.cjs +801 -296
  55. package/dist/pptx/automation/index.d.ts +5 -4
  56. package/dist/pptx/automation/index.d.ts.map +1 -1
  57. package/dist/pptx/automation/index.mjs +5 -5
  58. package/dist/pptx/chunks/{text-operations-BLodkuXE.d.ts → elements-DD3UGOMd.d.ts} +27 -3248
  59. package/dist/pptx/chunks/elements-DD3UGOMd.d.ts.map +1 -0
  60. package/dist/pptx/chunks/{index-B4cnSPNz.d.ts → index-BZrFyNtU.d.ts} +113 -5
  61. package/dist/pptx/chunks/index-BZrFyNtU.d.ts.map +1 -0
  62. package/dist/pptx/chunks/{index-BZh-IMkN.d.ts → index-DdX02BSm.d.ts} +19 -3
  63. package/dist/pptx/chunks/index-DdX02BSm.d.ts.map +1 -0
  64. package/dist/pptx/chunks/smart-art-ENMMEbmW.d.ts +1512 -0
  65. package/dist/pptx/chunks/smart-art-ENMMEbmW.d.ts.map +1 -0
  66. package/dist/pptx/chunks/text-D49FKllA.d.ts +1473 -0
  67. package/dist/pptx/chunks/text-D49FKllA.d.ts.map +1 -0
  68. package/dist/pptx/chunks/text-operations-CyMTMfID.d.ts +3261 -0
  69. package/dist/pptx/chunks/text-operations-CyMTMfID.d.ts.map +1 -0
  70. package/dist/pptx/cli/index.cjs +801 -296
  71. package/dist/pptx/cli/index.d.ts +1 -1
  72. package/dist/pptx/cli/index.mjs +4 -4
  73. package/dist/pptx/converter/index.cjs +1 -0
  74. package/dist/pptx/converter/index.d.ts +1 -1
  75. package/dist/pptx/converter/index.mjs +2 -2
  76. package/dist/pptx/editor/render/collaboration-live-patch-target.cjs +2 -2
  77. package/dist/pptx/editor/render/collaboration-live-patch-target.mjs +1 -1
  78. package/dist/pptx/editor/render/find-replace.cjs +19 -18
  79. package/dist/pptx/editor/render/find-replace.d.ts +2 -2
  80. package/dist/pptx/editor/render/find-replace.mjs +3 -2
  81. package/dist/pptx/editor/render/font-family-update.cjs +14 -0
  82. package/dist/pptx/editor/render/font-family-update.d.ts +17 -0
  83. package/dist/pptx/editor/render/font-family-update.d.ts.map +1 -0
  84. package/dist/pptx/editor/render/font-family-update.mjs +1 -0
  85. package/dist/pptx/editor/render/paragraph-geometry-overrides.cjs +14 -0
  86. package/dist/pptx/editor/render/paragraph-geometry-overrides.d.ts +17 -0
  87. package/dist/pptx/editor/render/paragraph-geometry-overrides.d.ts.map +1 -0
  88. package/dist/pptx/editor/render/paragraph-geometry-overrides.mjs +12 -0
  89. package/dist/pptx/editor/render/remap-text.cjs +2 -2
  90. package/dist/pptx/editor/render/remap-text.d.ts.map +1 -1
  91. package/dist/pptx/editor/render/remap-text.mjs +1 -1
  92. package/dist/pptx/editor/render/slide-operations.cjs +9 -8
  93. package/dist/pptx/editor/render/slide-operations.mjs +3 -2
  94. package/dist/pptx/editor/render/table-data-grid-ops.cjs +1 -1
  95. package/dist/pptx/editor/render/table-data-grid-ops.mjs +1 -1
  96. package/dist/pptx/editor/render/text-content-style.cjs +18 -0
  97. package/dist/pptx/editor/render/text-content-style.d.ts +9 -0
  98. package/dist/pptx/editor/render/text-content-style.d.ts.map +1 -0
  99. package/dist/pptx/editor/render/text-content-style.mjs +5 -0
  100. package/dist/pptx/editor/render/text-runs-style-patch.cjs +17 -0
  101. package/dist/pptx/editor/render/text-runs-style-patch.d.ts +7 -0
  102. package/dist/pptx/editor/render/text-runs-style-patch.d.ts.map +1 -0
  103. package/dist/pptx/editor/render/text-runs-style-patch.mjs +15 -0
  104. package/dist/pptx/editor/render/text-style-scope.cjs +173 -0
  105. package/dist/pptx/editor/render/text-style-scope.d.ts +76 -0
  106. package/dist/pptx/editor/render/text-style-scope.d.ts.map +1 -0
  107. package/dist/pptx/editor/render/text-style-scope.mjs +164 -0
  108. package/dist/pptx/editor/render/theme-editor-model.cjs +1 -1
  109. package/dist/pptx/editor/render/theme-editor-model.mjs +1 -1
  110. package/dist/pptx/editor/render/update-text-segment-style.cjs +11 -0
  111. package/dist/pptx/editor/render/update-text-segment-style.d.ts +14 -0
  112. package/dist/pptx/editor/render/update-text-segment-style.d.ts.map +1 -0
  113. package/dist/pptx/editor/render/update-text-segment-style.mjs +2 -0
  114. package/dist/pptx/index.cjs +1091 -296
  115. package/dist/pptx/index.d.ts +7 -5
  116. package/dist/pptx/index.mjs +5 -5
  117. package/dist/pptx/smartart-layouts/index.d.ts +1 -1
  118. package/dist/teams/index.cjs +590 -122
  119. package/dist/teams/index.mjs +590 -122
  120. package/dist/visio/date-cache.d.ts +3 -0
  121. package/dist/visio/date-cache.d.ts.map +1 -0
  122. package/dist/visio/edit-commands.d.ts +3 -3
  123. package/dist/visio/edit-commands.d.ts.map +1 -1
  124. package/dist/visio/edit-formatting-scope.d.ts.map +1 -1
  125. package/dist/visio/edit-recalculate-index.d.ts.map +1 -1
  126. package/dist/visio/edit-text-field-commands.d.ts +15 -0
  127. package/dist/visio/edit-text-field-commands.d.ts.map +1 -1
  128. package/dist/visio/edit-text-field.d.ts +2 -2
  129. package/dist/visio/edit-text-field.d.ts.map +1 -1
  130. package/dist/visio/edit.d.ts +1 -1
  131. package/dist/visio/edit.d.ts.map +1 -1
  132. package/dist/visio/index.cjs +501 -220
  133. package/dist/visio/index.d.ts +1 -1
  134. package/dist/visio/index.d.ts.map +1 -1
  135. package/dist/visio/index.mjs +501 -220
  136. package/dist/visio/model.d.ts +6 -0
  137. package/dist/visio/model.d.ts.map +1 -1
  138. package/dist/visio/shape-metadata.d.ts.map +1 -1
  139. package/dist/visio/shapes.d.ts.map +1 -1
  140. package/dist/visio/style.d.ts +1 -1
  141. package/dist/visio/style.d.ts.map +1 -1
  142. package/dist/visio/text-field-display.d.ts +3 -0
  143. package/dist/visio/text-field-display.d.ts.map +1 -1
  144. package/dist/visio/text-field-editability.d.ts +6 -0
  145. package/dist/visio/text-field-editability.d.ts.map +1 -0
  146. package/dist/visio/text-field-fraction.d.ts +3 -0
  147. package/dist/visio/text-field-fraction.d.ts.map +1 -0
  148. package/dist/visio/text-field-independent.d.ts +4 -0
  149. package/dist/visio/text-field-independent.d.ts.map +1 -0
  150. package/dist/visio/text-field-numeric.d.ts +1 -1
  151. package/dist/visio/text-field-numeric.d.ts.map +1 -1
  152. package/dist/visio/text-field-source.d.ts +6 -0
  153. package/dist/visio/text-field-source.d.ts.map +1 -0
  154. package/dist/visio/text-field-system-date.d.ts +4 -0
  155. package/dist/visio/text-field-system-date.d.ts.map +1 -0
  156. package/dist/visio/text-fields.d.ts +1 -0
  157. package/dist/visio/text-fields.d.ts.map +1 -1
  158. package/dist/visio/ui/edit-commands.d.ts.map +1 -1
  159. package/dist/visio/ui/index.cjs +514 -221
  160. package/dist/visio/ui/index.mjs +514 -221
  161. package/dist/visio/ui/snapshot-scene.d.ts.map +1 -1
  162. package/dist/visio/ui/text-field-catalog.d.ts.map +1 -1
  163. package/dist/xlsx/edit/pivots.d.ts.map +1 -1
  164. package/dist/xlsx/index.cjs +1362 -659
  165. package/dist/xlsx/index.mjs +1361 -660
  166. package/dist/xlsx/load/index.cjs +1091 -430
  167. package/dist/xlsx/load/index.mjs +1091 -430
  168. package/dist/xlsx/model-pivots.d.ts +31 -2
  169. package/dist/xlsx/model-pivots.d.ts.map +1 -1
  170. package/dist/xlsx/pivot/admission.d.ts.map +1 -1
  171. package/dist/xlsx/pivot/aggregate.d.ts +3 -1
  172. package/dist/xlsx/pivot/aggregate.d.ts.map +1 -1
  173. package/dist/xlsx/pivot/data.d.ts +2 -2
  174. package/dist/xlsx/pivot/data.d.ts.map +1 -1
  175. package/dist/xlsx/pivot/hierarchy-first.d.ts +21 -0
  176. package/dist/xlsx/pivot/hierarchy-first.d.ts.map +1 -0
  177. package/dist/xlsx/pivot/hierarchy.d.ts +2 -4
  178. package/dist/xlsx/pivot/hierarchy.d.ts.map +1 -1
  179. package/dist/xlsx/pivot/index.d.ts +2 -0
  180. package/dist/xlsx/pivot/index.d.ts.map +1 -1
  181. package/dist/xlsx/pivot/measures.d.ts +13 -0
  182. package/dist/xlsx/pivot/measures.d.ts.map +1 -0
  183. package/dist/xlsx/pivot/page-filter-admission.d.ts +5 -0
  184. package/dist/xlsx/pivot/page-filter-admission.d.ts.map +1 -0
  185. package/dist/xlsx/pivot/page-filter.d.ts +11 -0
  186. package/dist/xlsx/pivot/page-filter.d.ts.map +1 -0
  187. package/dist/xlsx/pivot/read.d.ts.map +1 -1
  188. package/dist/xlsx/pivot/table-xml.d.ts.map +1 -1
  189. package/dist/xlsx/pivot/values-axis.d.ts +12 -0
  190. package/dist/xlsx/pivot/values-axis.d.ts.map +1 -0
  191. package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
  192. package/dist/xlsx/ui/commands/i18n/pivots.d.ts.map +1 -1
  193. package/dist/xlsx/ui/index.cjs +640 -137
  194. package/dist/xlsx/ui/index.mjs +640 -137
  195. package/package.json +2 -2
  196. package/dist/PptxHandler-AT7FVG5Q.mjs +0 -2
  197. package/dist/PptxHandler-VFSCECPL.cjs +0 -11
  198. package/dist/pptx/chunks/index-B4cnSPNz.d.ts.map +0 -1
  199. package/dist/pptx/chunks/index-BZh-IMkN.d.ts.map +0 -1
  200. package/dist/pptx/chunks/smart-art-Q2kZQtHh.d.ts +0 -2970
  201. package/dist/pptx/chunks/smart-art-Q2kZQtHh.d.ts.map +0 -1
  202. package/dist/pptx/chunks/text-operations-BLodkuXE.d.ts.map +0 -1
@@ -13780,6 +13780,60 @@ function newSparklines(workbook, sheet, source, locations) {
13780
13780
  return out;
13781
13781
  }
13782
13782
 
13783
+ // xlsx/pivot/page-filter.ts
13784
+ function validatePivotPageFilter(pivot) {
13785
+ const filter2 = pivot.pageFilter;
13786
+ const extras = Array.isArray(pivot.additionalValues) ? pivot.additionalValues : [];
13787
+ if (filter2 === void 0) return;
13788
+ if (!filter2 || typeof filter2 !== "object" || Array.isArray(filter2) || Object.keys(filter2).some((key) => key !== "field" && key !== "item") || typeof filter2.field !== "string" || !pivot.fields.includes(filter2.field) || [
13789
+ pivot.rowField,
13790
+ pivot.secondRowField,
13791
+ pivot.columnField,
13792
+ pivot.valueField,
13793
+ ...extras.map((v) => v?.field)
13794
+ ].includes(filter2.field) || pivot.valuesAxis === "rows")
13795
+ throw new Error("Report filters require Values on columns and a separate source field.");
13796
+ if (filter2.item !== void 0 && !(filter2.item === null || typeof filter2.item === "string" || typeof filter2.item === "boolean" || typeof filter2.item === "number" && Number.isFinite(filter2.item) || isCellError(filter2.item) && isErrorCode(filter2.item.error) && Object.keys(filter2.item).length === 1))
13797
+ throw new Error("Choose a cached literal report filter item.");
13798
+ }
13799
+ function pivotPageProjection(pivot) {
13800
+ const filter2 = pivot.pageFilter;
13801
+ if (!filter2) return pivot;
13802
+ const labels = /* @__PURE__ */ new Map();
13803
+ for (const item of pivotItems(pivot, filter2.field)) {
13804
+ const label3 = String(pivotItemLabel(item)).toLowerCase(), key2 = pivotValueKey(item);
13805
+ if (label3 === "(all)" || labels.has(label3) && labels.get(label3) !== key2)
13806
+ throw new Error("Ambiguous report filter item captions are preserved.");
13807
+ labels.set(label3, key2);
13808
+ }
13809
+ if (filter2.item === void 0) return pivot;
13810
+ const index2 = pivot.fields.indexOf(filter2.field), key = pivotValueKey(filter2.item);
13811
+ const records = pivot.records.filter((record) => pivotValueKey(record[index2] ?? null) === key);
13812
+ if (!records.length) throw new Error("The report filter item is missing from the source.");
13813
+ if (JSON.stringify(records[0][index2] ?? null) !== JSON.stringify(filter2.item))
13814
+ throw new Error("Choose an exact cached literal report filter item.");
13815
+ return { ...pivot, records };
13816
+ }
13817
+ function prependPivotPage(grid6, pivot) {
13818
+ if (!pivot.pageFilter) return grid6;
13819
+ const width = grid6.values[0].length;
13820
+ return {
13821
+ ...grid6,
13822
+ values: [
13823
+ [
13824
+ pivot.pageFilter.field,
13825
+ pivot.pageFilter.item === void 0 ? "(All)" : pivotItemLabel(pivot.pageFilter.item),
13826
+ ...Array(width - 2).fill(null)
13827
+ ],
13828
+ Array(width).fill(null),
13829
+ ...grid6.values
13830
+ ],
13831
+ firstDataRow: grid6.firstDataRow + 2,
13832
+ ...grid6.firstHeaderRow !== void 0 ? { firstHeaderRow: grid6.firstHeaderRow + 2 } : {},
13833
+ ...grid6.indents ? { indents: [0, 0, ...grid6.indents] } : {}
13834
+ };
13835
+ }
13836
+
13783
13837
  // xlsx/pivot/data.ts
13784
13838
  var PIVOT_AGGREGATES = ["sum", "count", "average", "min", "max"];
13785
13839
  function pivotSourceData(workbook, sheet, source) {
@@ -13831,12 +13885,32 @@ function pivotItemLabel(value2) {
13831
13885
  return isCellError(value2) ? value2.error : value2;
13832
13886
  }
13833
13887
  function validatePivotFields(pivot) {
13888
+ validatePivotPageFilter(pivot);
13834
13889
  const used = [
13835
13890
  pivot.rowField,
13836
13891
  ...pivot.secondRowField ? [pivot.secondRowField] : [],
13837
13892
  ...pivot.columnField ? [pivot.columnField] : [],
13838
13893
  pivot.valueField
13839
13894
  ];
13895
+ const extras = pivot.additionalValues ?? [];
13896
+ if (pivot.valuesAxis !== void 0 && !["columns", "rows"].includes(pivot.valuesAxis))
13897
+ throw new Error("Choose a valid Values axis.");
13898
+ if (pivot.valuesPosition !== void 0 && !["last", "between", "first"].includes(pivot.valuesPosition))
13899
+ throw new Error("Choose a valid Values position.");
13900
+ if ((pivot.valuesPosition === "between" || pivot.valuesPosition === "first") && (pivot.valuesAxis !== "rows" || !pivot.secondRowField))
13901
+ throw new Error("Values before or between fields require two row fields and Values on rows.");
13902
+ if (pivot.valuesAxis === "rows" && (!Array.isArray(extras) || !extras.length))
13903
+ throw new Error("Values on rows require multiple measures.");
13904
+ if (extras.length > 0 && pivot.sourceXml && parseXml(pivot.sourceXml).documentElement.getAttribute("dataCaption") !== "Values")
13905
+ throw new Error("This PivotTable uses unsupported Values header captions.");
13906
+ if (!Array.isArray(extras) || extras.length > 15 || extras.some(
13907
+ (measure2) => !measure2 || !pivot.fields.includes(measure2.field) || !PIVOT_AGGREGATES.includes(measure2.aggregate) || typeof measure2.caption !== "string" || !measure2.caption.trim() || measure2.caption.length > 255 || pivot.fields.some((field) => field.toLowerCase() === measure2.caption.toLowerCase())
13908
+ ) || new Set(
13909
+ [pivot.valueCaption, ...extras.map((measure2) => measure2.caption)].map(
13910
+ (caption) => caption?.toLowerCase()
13911
+ )
13912
+ ).size !== extras.length + 1)
13913
+ throw new Error("Choose PivotTable value fields with valid aggregates and unique captions.");
13840
13914
  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")
13841
13915
  throw new Error("Choose valid PivotTable fields; row and column fields must differ.");
13842
13916
  }
@@ -13844,21 +13918,191 @@ function pivotCaption(aggregate3, field) {
13844
13918
  return `${aggregate3[0].toUpperCase()}${aggregate3.slice(1)} of ${field}`;
13845
13919
  }
13846
13920
 
13921
+ // xlsx/pivot/measures.ts
13922
+ var pivotMeasures = (pivot) => [
13923
+ { field: pivot.valueField, aggregate: pivot.aggregate, caption: pivot.valueCaption },
13924
+ ...pivot.additionalValues ?? []
13925
+ ];
13926
+ function normalizedPivotMeasures(values2) {
13927
+ if (!Array.isArray(values2) || values2.length > 15)
13928
+ throw new Error("Choose between one and sixteen PivotTable value fields.");
13929
+ return values2.map((value2) => {
13930
+ if (!value2 || typeof value2.field !== "string")
13931
+ throw new Error("Choose valid PivotTable value fields.");
13932
+ const aggregate3 = value2.aggregate ?? "sum";
13933
+ if (!PIVOT_AGGREGATES.includes(aggregate3))
13934
+ throw new Error("Choose a valid PivotTable aggregate.");
13935
+ return {
13936
+ field: value2.field,
13937
+ aggregate: aggregate3,
13938
+ caption: value2.caption ?? `${aggregate3[0].toUpperCase()}${aggregate3.slice(1)} of ${value2.field}`
13939
+ };
13940
+ });
13941
+ }
13942
+ function aggregate2(records, field, type) {
13943
+ if (!records.length) return null;
13944
+ const values2 = records.map((record) => record[field] ?? null);
13945
+ if (type === "count") return values2.filter((value2) => value2 !== null && value2 !== "").length;
13946
+ const error = values2.find(isCellError);
13947
+ if (error) return error;
13948
+ const numbers3 = values2.filter((value2) => typeof value2 === "number");
13949
+ if (!numbers3.length) return type === "average" ? { error: "#DIV/0!" } : 0;
13950
+ if (type === "min") return numbers3.reduce((a, b) => Math.min(a, b));
13951
+ if (type === "max") return numbers3.reduce((a, b) => Math.max(a, b));
13952
+ const sum2 = numbers3.reduce((total2, value2) => total2 + value2, 0);
13953
+ return type === "average" ? sum2 / numbers3.length : sum2;
13954
+ }
13955
+ var pivotMeasureNumber = (pivot, records, measure2) => aggregate2(records, pivot.fields.indexOf(measure2.field), measure2.aggregate);
13956
+ var pivotNumbers = (pivot, records) => pivotMeasures(pivot).map((measure2) => pivotMeasureNumber(pivot, records, measure2));
13957
+ function pivotHeaderDimensions(pivot, columnItems, rowLabels) {
13958
+ const measures = 1 + (pivot.additionalValues?.length ?? 0);
13959
+ if (pivot.valuesAxis === "rows")
13960
+ return {
13961
+ rows: (pivot.columnField ? 2 : 1) + (pivot.pageFilter ? 2 : 0),
13962
+ width: rowLabels + (pivot.columnField ? columnItems + 1 : 1)
13963
+ };
13964
+ return {
13965
+ rows: (pivot.columnField ? measures > 1 ? 3 : 2 : 1) + (pivot.pageFilter ? 2 : 0),
13966
+ width: rowLabels + (pivot.columnField ? measures === 1 ? Math.max(1, columnItems) + 1 : (columnItems + 1) * measures : measures)
13967
+ };
13968
+ }
13969
+ function pivotHeaders(pivot, columns, labels, label3) {
13970
+ const measures = pivotMeasures(pivot);
13971
+ if (pivot.valuesAxis === "rows") {
13972
+ const rowLabels = pivot.layout === "compact" ? ["Row Labels"] : pivot.valuesPosition === "first" ? ["Values", ...labels] : pivot.valuesPosition === "between" ? [labels[0], "Values", labels[1]] : [...labels, "Values"];
13973
+ return pivot.columnField ? [
13974
+ [
13975
+ ...rowLabels.map(() => null),
13976
+ pivot.layout === "compact" ? "Column Labels" : pivot.columnField,
13977
+ ...columns.map(() => null)
13978
+ ],
13979
+ [...rowLabels, ...columns.map(label3), "Grand Total"]
13980
+ ] : [[...rowLabels, null]];
13981
+ }
13982
+ if (!pivot.columnField) return [[...labels, ...measures.map((measure2) => measure2.caption)]];
13983
+ if (measures.length === 1)
13984
+ return [
13985
+ [
13986
+ pivot.valueCaption,
13987
+ ...labels.slice(1).map(() => null),
13988
+ pivot.layout === "compact" ? "Column Labels" : pivot.columnField,
13989
+ ...columns.slice(1).map(() => null),
13990
+ null
13991
+ ],
13992
+ [...labels, ...columns.map(label3), "Grand Total"]
13993
+ ];
13994
+ const { width } = pivotHeaderDimensions(pivot, columns.length, labels.length);
13995
+ const first2 = Array(width).fill(null);
13996
+ first2[labels.length] = pivot.layout === "compact" ? "Column Labels" : pivot.columnField;
13997
+ if (pivot.layout !== "compact") first2[labels.length + 1] = "Values";
13998
+ return [
13999
+ first2,
14000
+ [
14001
+ ...labels.map(() => null),
14002
+ ...columns.flatMap((column) => [label3(column), ...measures.slice(1).map(() => null)]),
14003
+ ...measures.map((measure2) => `Total ${measure2.caption}`)
14004
+ ],
14005
+ [
14006
+ ...labels,
14007
+ ...columns.flatMap(() => measures.map((measure2) => measure2.caption)),
14008
+ ...measures.map(() => null)
14009
+ ]
14010
+ ];
14011
+ }
14012
+
14013
+ // xlsx/pivot/hierarchy-first.ts
14014
+ function appendFirstPivotValues(pivot, context) {
14015
+ const {
14016
+ rowItems,
14017
+ secondRowItems,
14018
+ columnItems,
14019
+ children: children2,
14020
+ innerIndices,
14021
+ groups,
14022
+ details,
14023
+ buckets,
14024
+ width,
14025
+ rowLabels,
14026
+ top,
14027
+ bottom,
14028
+ append
14029
+ } = context;
14030
+ const compact3 = pivot.layout === "compact";
14031
+ const tabular = !pivot.layout || pivot.layout === "tabular";
14032
+ const blank = () => Array(width - rowLabels).fill(null);
14033
+ pivotMeasures(pivot).forEach((measure2, m) => {
14034
+ const numbers3 = (keys, records) => [
14035
+ ...columnItems.map(
14036
+ (column) => pivotMeasureNumber(
14037
+ pivot,
14038
+ buckets.get(JSON.stringify([...keys, pivotValueKey(column)])) ?? [],
14039
+ measure2
14040
+ )
14041
+ ),
14042
+ pivotMeasureNumber(pivot, records, measure2)
14043
+ ];
14044
+ if (!tabular)
14045
+ append([measure2.caption, ...Array(rowLabels - 1).fill(null)], blank(), {
14046
+ indices: [m],
14047
+ measure: m
14048
+ });
14049
+ let first2 = true;
14050
+ rowItems.forEach((outer, outerIndex) => {
14051
+ const key = pivotValueKey(outer);
14052
+ const group = groups.get(key) ?? [];
14053
+ if (!tabular)
14054
+ append(
14055
+ compact3 ? [pivotItemLabel(outer)] : [null, pivotItemLabel(outer), null],
14056
+ top ? numbers3([key], group) : blank(),
14057
+ { indices: [m, outerIndex], measure: m },
14058
+ compact3 ? 1 : 0
14059
+ );
14060
+ const innerKeys = [...children2.get(key)].sort(
14061
+ (a, b) => innerIndices.get(a) - innerIndices.get(b)
14062
+ );
14063
+ innerKeys.forEach((innerKey, child) => {
14064
+ const innerIndex = innerIndices.get(innerKey);
14065
+ append(
14066
+ compact3 ? [pivotItemLabel(secondRowItems[innerIndex])] : [
14067
+ tabular && first2 ? measure2.caption : null,
14068
+ pivot.repeatLabels || tabular && child === 0 ? pivotItemLabel(outer) : null,
14069
+ pivotItemLabel(secondRowItems[innerIndex])
14070
+ ],
14071
+ numbers3([key, innerKey], details.get(JSON.stringify([key, innerKey]))),
14072
+ { indices: [m, outerIndex, innerIndex], measure: m },
14073
+ compact3 ? 2 : 0
14074
+ );
14075
+ first2 = false;
14076
+ });
14077
+ if (bottom)
14078
+ append(
14079
+ compact3 ? [`${String(pivotItemLabel(outer))} Total`] : [null, `${String(pivotItemLabel(outer))} Total`, null],
14080
+ numbers3([key], group),
14081
+ { indices: [m, outerIndex], measure: m, type: "default" },
14082
+ compact3 ? 1 : 0
14083
+ );
14084
+ });
14085
+ });
14086
+ }
14087
+
13847
14088
  // xlsx/pivot/hierarchy.ts
13848
14089
  var label2 = pivotItemLabel;
13849
- function hierarchicalPivotGrid(pivot, aggregate3) {
14090
+ function hierarchicalPivotGrid(pivot) {
13850
14091
  const rowItems = pivotItems(pivot, pivot.rowField);
13851
14092
  const secondRowItems = pivotItems(pivot, pivot.secondRowField);
13852
14093
  const columnItems = pivot.columnField ? pivotItems(pivot, pivot.columnField) : [];
13853
14094
  const outerField = pivot.fields.indexOf(pivot.rowField);
13854
14095
  const innerField = pivot.fields.indexOf(pivot.secondRowField);
13855
14096
  const columnField = pivot.columnField ? pivot.fields.indexOf(pivot.columnField) : -1;
13856
- const valueField = pivot.fields.indexOf(pivot.valueField);
13857
14097
  const layout2 = pivot.layout ?? "tabular";
13858
14098
  const compact3 = layout2 === "compact";
13859
- const top = layout2 !== "tabular" && pivot.subtotals !== false && (pivot.subtotalPosition ?? "top") === "top";
14099
+ const rowsAxis = pivot.valuesAxis === "rows";
14100
+ const firstValues = rowsAxis && pivot.valuesPosition === "first";
14101
+ const between = rowsAxis && pivot.valuesPosition === "between";
14102
+ const measures = pivotMeasures(pivot);
14103
+ const top = (!rowsAxis || firstValues) && layout2 !== "tabular" && pivot.subtotals !== false && (pivot.subtotalPosition ?? "top") === "top";
13860
14104
  const bottom = pivot.subtotals !== false && !top;
13861
- const rowLabelColumns = compact3 ? 1 : 2;
14105
+ const rowLabelColumns = compact3 ? 1 : rowsAxis ? 3 : 2;
13862
14106
  const groups = /* @__PURE__ */ new Map();
13863
14107
  const details = /* @__PURE__ */ new Map();
13864
14108
  const children2 = /* @__PURE__ */ new Map();
@@ -13882,20 +14126,12 @@ function hierarchicalPivotGrid(pivot, aggregate3) {
13882
14126
  collect(buckets, JSON.stringify([...key, column]), record);
13883
14127
  }
13884
14128
  }
13885
- const rows2 = details.size + rowItems.length * (Number(layout2 !== "tabular") + Number(bottom)) + 3;
13886
- if (rows2 * (columnItems.length + 3) > 1e6)
13887
- throw new Error("The PivotTable result is too large.");
14129
+ const dimensions = pivotHeaderDimensions(pivot, columnItems.length, rowLabelColumns);
14130
+ const rows2 = (details.size + rowItems.length * Number(bottom) + 1) * (rowsAxis ? measures.length : 1) + rowItems.length * Number(layout2 !== "tabular") * (firstValues ? measures.length : 1) + (firstValues ? measures.length : between ? rowItems.length * measures.length : details.size) * Number(rowsAxis && layout2 !== "tabular") + dimensions.rows;
14131
+ if (rows2 * dimensions.width > 1e6) throw new Error("The PivotTable result is too large.");
13888
14132
  const labels = compact3 ? ["Row Labels"] : [pivot.rowField, pivot.secondRowField];
13889
- const values2 = pivot.columnField ? [
13890
- [
13891
- pivot.valueCaption,
13892
- ...compact3 ? [] : [null],
13893
- compact3 ? "Column Labels" : pivot.columnField,
13894
- ...columnItems.slice(1).map(() => null),
13895
- null
13896
- ],
13897
- [...labels, ...columnItems.map(label2), "Grand Total"]
13898
- ] : [[...labels, pivot.valueCaption]];
14133
+ const values2 = pivotHeaders(pivot, columnItems, labels, label2);
14134
+ const firstDataRow = values2.length;
13899
14135
  const indents = values2.map(() => 0);
13900
14136
  const rowEntries = [];
13901
14137
  const append = (labels2, numbers4, entry, indent = 0) => {
@@ -13903,91 +14139,187 @@ function hierarchicalPivotGrid(pivot, aggregate3) {
13903
14139
  rowEntries.push(entry);
13904
14140
  indents.push(indent);
13905
14141
  };
13906
- const numbers3 = (keys, records) => [
14142
+ const bands = (keys, records) => [
13907
14143
  ...columnItems.map(
13908
- (column) => aggregate3(
13909
- buckets.get(JSON.stringify([...keys, pivotValueKey(column)])) ?? [],
13910
- valueField,
13911
- pivot.aggregate
13912
- )
14144
+ (column) => pivotNumbers(pivot, buckets.get(JSON.stringify([...keys, pivotValueKey(column)])) ?? [])
13913
14145
  ),
13914
- aggregate3(records, valueField, pivot.aggregate)
14146
+ pivotNumbers(pivot, records)
13915
14147
  ];
13916
- rowItems.forEach((outer, outerIndex) => {
13917
- const key = pivotValueKey(outer);
13918
- if (layout2 !== "tabular")
13919
- append(
13920
- [label2(outer), ...compact3 ? [] : [null]],
13921
- top ? numbers3([key], groups.get(key) ?? []) : Array(columnItems.length + 1).fill(null),
13922
- { indices: [outerIndex] }
13923
- );
13924
- let first2 = true;
13925
- [...children2.get(key)].sort((a, b) => innerIndices.get(a) - innerIndices.get(b)).forEach((innerKey) => {
13926
- const innerIndex = innerIndices.get(innerKey);
13927
- const inner2 = secondRowItems[innerIndex];
13928
- const keys = [key, innerKey];
13929
- const records = details.get(JSON.stringify(keys));
13930
- if (!records) return;
13931
- append(
13932
- compact3 ? [label2(inner2)] : [
13933
- pivot.repeatLabels || layout2 === "tabular" && first2 ? label2(outer) : null,
13934
- label2(inner2)
14148
+ const numbers3 = (keys, records) => bands(keys, records).flat();
14149
+ const appendMeasures = (labels2, keys, records, indices, type) => {
14150
+ const values3 = bands(keys, records);
14151
+ measures.forEach(
14152
+ (measure2, m) => append(
14153
+ type ? [
14154
+ `${type === "grand" ? "Total" : String(labels2[0])} ${measure2.caption}`,
14155
+ ...Array(rowLabelColumns - 1).fill(null)
14156
+ ] : compact3 ? [measure2.caption] : [
14157
+ ...labels2.map(
14158
+ (label3) => layout2 === "tabular" && m === 0 || pivot.repeatLabels ? label3 : null
14159
+ ),
14160
+ measure2.caption
13935
14161
  ],
13936
- numbers3(keys, records),
13937
- { indices: [outerIndex, innerIndex] },
13938
- compact3 ? 1 : 0
13939
- );
13940
- first2 = false;
14162
+ values3.map((band) => band[m] ?? null),
14163
+ { indices: type ? indices : [...indices, m], measure: m, ...type ? { type } : {} },
14164
+ compact3 && !type ? 2 : 0
14165
+ )
14166
+ );
14167
+ };
14168
+ if (firstValues)
14169
+ appendFirstPivotValues(pivot, {
14170
+ rowItems,
14171
+ secondRowItems,
14172
+ columnItems,
14173
+ children: children2,
14174
+ innerIndices,
14175
+ groups,
14176
+ details,
14177
+ buckets,
14178
+ width: dimensions.width,
14179
+ rowLabels: rowLabelColumns,
14180
+ top,
14181
+ bottom,
14182
+ append
13941
14183
  });
13942
- if (bottom) {
13943
- const caption = String(label2(outer));
13944
- append(
13945
- [`${caption} Total`, ...compact3 ? [] : [null]],
13946
- numbers3([key], groups.get(key) ?? []),
13947
- { indices: [outerIndex], type: "default" }
14184
+ else
14185
+ rowItems.forEach((outer, outerIndex) => {
14186
+ const key = pivotValueKey(outer);
14187
+ if (layout2 !== "tabular")
14188
+ append(
14189
+ [label2(outer), ...Array(rowLabelColumns - 1).fill(null)],
14190
+ top ? numbers3([key], groups.get(key) ?? []) : Array(dimensions.width - rowLabelColumns).fill(null),
14191
+ { indices: [outerIndex] }
14192
+ );
14193
+ let first2 = true;
14194
+ const innerKeys = [...children2.get(key)].sort(
14195
+ (a, b) => innerIndices.get(a) - innerIndices.get(b)
13948
14196
  );
13949
- }
13950
- });
13951
- append(["Grand Total", ...compact3 ? [] : [null]], numbers3([], pivot.records), {
13952
- indices: [0],
13953
- type: "grand"
13954
- });
14197
+ if (between)
14198
+ measures.forEach((measure2, m) => {
14199
+ if (layout2 !== "tabular")
14200
+ append(
14201
+ compact3 ? [measure2.caption] : [pivot.repeatLabels ? label2(outer) : null, measure2.caption, null],
14202
+ Array(dimensions.width - rowLabelColumns).fill(null),
14203
+ { indices: [outerIndex, m], measure: m },
14204
+ compact3 ? 1 : 0
14205
+ );
14206
+ innerKeys.forEach((innerKey, child) => {
14207
+ const innerIndex = innerIndices.get(innerKey);
14208
+ const keys = [key, innerKey];
14209
+ const records = details.get(JSON.stringify(keys));
14210
+ append(
14211
+ compact3 ? [label2(secondRowItems[innerIndex])] : [
14212
+ pivot.repeatLabels || layout2 === "tabular" && m === 0 && child === 0 ? label2(outer) : null,
14213
+ layout2 === "tabular" && child === 0 ? measure2.caption : null,
14214
+ label2(secondRowItems[innerIndex])
14215
+ ],
14216
+ [
14217
+ ...columnItems.map(
14218
+ (column) => pivotMeasureNumber(
14219
+ pivot,
14220
+ buckets.get(JSON.stringify([...keys, pivotValueKey(column)])) ?? [],
14221
+ measure2
14222
+ )
14223
+ ),
14224
+ pivotMeasureNumber(pivot, records, measure2)
14225
+ ],
14226
+ { indices: [outerIndex, m, innerIndex], measure: m },
14227
+ compact3 ? 2 : 0
14228
+ );
14229
+ });
14230
+ });
14231
+ else
14232
+ innerKeys.forEach((innerKey) => {
14233
+ const innerIndex = innerIndices.get(innerKey);
14234
+ const inner2 = secondRowItems[innerIndex];
14235
+ const keys = [key, innerKey];
14236
+ const records = details.get(JSON.stringify(keys));
14237
+ if (!records) return;
14238
+ if (rowsAxis) {
14239
+ if (layout2 !== "tabular")
14240
+ append(
14241
+ compact3 ? [label2(inner2)] : [pivot.repeatLabels ? label2(outer) : null, label2(inner2), null],
14242
+ Array(dimensions.width - rowLabelColumns).fill(null),
14243
+ { indices: [outerIndex, innerIndex] },
14244
+ compact3 ? 1 : 0
14245
+ );
14246
+ appendMeasures(
14247
+ [pivot.repeatLabels || first2 ? label2(outer) : null, label2(inner2)],
14248
+ keys,
14249
+ records,
14250
+ [outerIndex, innerIndex]
14251
+ );
14252
+ first2 = false;
14253
+ return;
14254
+ }
14255
+ append(
14256
+ compact3 ? [label2(inner2)] : [
14257
+ pivot.repeatLabels || layout2 === "tabular" && first2 ? label2(outer) : null,
14258
+ label2(inner2)
14259
+ ],
14260
+ numbers3(keys, records),
14261
+ { indices: [outerIndex, innerIndex] },
14262
+ compact3 ? 1 : 0
14263
+ );
14264
+ first2 = false;
14265
+ });
14266
+ if (bottom) {
14267
+ if (rowsAxis) {
14268
+ appendMeasures([label2(outer)], [key], groups.get(key) ?? [], [outerIndex], "default");
14269
+ return;
14270
+ }
14271
+ const caption = String(label2(outer));
14272
+ append(
14273
+ [`${caption} Total`, ...compact3 ? [] : [null]],
14274
+ numbers3([key], groups.get(key) ?? []),
14275
+ { indices: [outerIndex], type: "default" }
14276
+ );
14277
+ }
14278
+ });
14279
+ if (rowsAxis) appendMeasures([], [], pivot.records, [0], "grand");
14280
+ else
14281
+ append(["Grand Total", ...compact3 ? [] : [null]], numbers3([], pivot.records), {
14282
+ indices: [0],
14283
+ type: "grand"
14284
+ });
13955
14285
  return {
13956
14286
  values: values2,
13957
14287
  rowItems,
13958
14288
  secondRowItems,
13959
14289
  columnItems,
13960
14290
  rowEntries,
13961
- firstDataRow: pivot.columnField ? 2 : 1,
14291
+ firstDataRow,
13962
14292
  rowLabelColumns,
13963
- indents
14293
+ indents,
14294
+ ...rowsAxis ? { firstHeaderRow: 1 } : {}
13964
14295
  };
13965
14296
  }
13966
14297
 
13967
14298
  // xlsx/pivot/aggregate.ts
13968
- function aggregate2(records, field, type) {
13969
- if (!records.length) return null;
13970
- const values2 = records.map((record) => record[field] ?? null);
13971
- if (type === "count") return values2.filter((value2) => value2 !== null && value2 !== "").length;
13972
- const error = values2.find(isCellError);
13973
- if (error) return error;
13974
- const numbers3 = values2.filter((value2) => typeof value2 === "number");
13975
- if (!numbers3.length) return type === "average" ? { error: "#DIV/0!" } : 0;
13976
- if (type === "min") return numbers3.reduce((a, b) => Math.min(a, b));
13977
- if (type === "max") return numbers3.reduce((a, b) => Math.max(a, b));
13978
- const sum2 = numbers3.reduce((total2, value2) => total2 + value2, 0);
13979
- return type === "average" ? sum2 / numbers3.length : sum2;
13980
- }
13981
14299
  function pivotGrid(pivot) {
13982
14300
  validatePivotFields(pivot);
13983
- if (pivot.secondRowField) return hierarchicalPivotGrid(pivot, aggregate2);
14301
+ return prependPivotPage(pivotDataGrid(pivotPageProjection(pivot)), pivot);
14302
+ }
14303
+ function pivotDataGrid(pivot) {
14304
+ if (pivot.secondRowField) return hierarchicalPivotGrid(pivot);
13984
14305
  const rowItems = pivotItems(pivot, pivot.rowField);
13985
14306
  const columnItems = pivot.columnField ? pivotItems(pivot, pivot.columnField) : [];
13986
- if ((rowItems.length + 3) * (columnItems.length + 2) > 1e6)
14307
+ const rowsAxis = pivot.valuesAxis === "rows";
14308
+ const compact3 = pivot.layout === "compact";
14309
+ const headings = rowsAxis && pivot.layout !== void 0 && pivot.layout !== "tabular";
14310
+ const dimensions = pivotHeaderDimensions(pivot, columnItems.length, rowsAxis && !compact3 ? 2 : 1);
14311
+ const dataRows = (rowItems.length + 1) * (rowsAxis ? 1 + (pivot.additionalValues?.length ?? 0) : 1) + (headings ? rowItems.length : 0);
14312
+ if ((dataRows + dimensions.rows) * dimensions.width > 1e6)
13987
14313
  throw new Error("The PivotTable result is too large.");
14314
+ const label3 = pivotItemLabel;
14315
+ const values2 = pivotHeaders(
14316
+ pivot,
14317
+ columnItems,
14318
+ [pivot.layout === "compact" ? "Row Labels" : pivot.rowField],
14319
+ label3
14320
+ );
13988
14321
  const rowField = pivot.fields.indexOf(pivot.rowField);
13989
14322
  const colField = pivot.columnField ? pivot.fields.indexOf(pivot.columnField) : -1;
13990
- const valueField = pivot.fields.indexOf(pivot.valueField);
13991
14323
  const groups = /* @__PURE__ */ new Map();
13992
14324
  const cells = /* @__PURE__ */ new Map();
13993
14325
  const columns = /* @__PURE__ */ new Map();
@@ -14005,43 +14337,103 @@ function pivotGrid(pivot) {
14005
14337
  collect(cells, JSON.stringify([key, col]), record);
14006
14338
  }
14007
14339
  }
14008
- const label3 = pivotItemLabel;
14009
- const values2 = pivot.columnField ? [
14010
- [
14011
- pivot.valueCaption,
14012
- pivot.layout === "compact" ? "Column Labels" : pivot.columnField,
14013
- ...columnItems.slice(1).map(() => null),
14014
- null
14015
- ],
14016
- [
14017
- pivot.layout === "compact" ? "Row Labels" : pivot.rowField,
14018
- ...columnItems.map(label3),
14019
- "Grand Total"
14020
- ]
14021
- ] : [[pivot.layout === "compact" ? "Row Labels" : pivot.rowField, pivot.valueCaption]];
14340
+ const firstDataRow = values2.length;
14341
+ if (rowsAxis) {
14342
+ const measures = pivotMeasures(pivot);
14343
+ const rowEntries = [];
14344
+ const indents = values2.map(() => 0);
14345
+ const append = (caption, bands, index2, grand = false) => {
14346
+ measures.forEach((measure2, m) => {
14347
+ values2.push([
14348
+ ...compact3 ? [grand ? `Total ${measure2.caption}` : measure2.caption] : [
14349
+ grand ? `Total ${measure2.caption}` : pivot.repeatLabels || !headings && m === 0 ? caption : null,
14350
+ grand ? null : measure2.caption
14351
+ ],
14352
+ ...bands.map((band) => band[m] ?? null)
14353
+ ]);
14354
+ indents.push(compact3 && !grand ? 1 : 0);
14355
+ rowEntries.push({
14356
+ indices: grand ? [0] : [index2, m],
14357
+ measure: m,
14358
+ ...grand ? { type: "grand" } : {}
14359
+ });
14360
+ });
14361
+ };
14362
+ rowItems.forEach((item, index2) => {
14363
+ const key = pivotValueKey(item);
14364
+ if (headings) {
14365
+ values2.push([label3(item), ...Array(dimensions.width - 1).fill(null)]);
14366
+ rowEntries.push({ indices: [index2] });
14367
+ indents.push(0);
14368
+ }
14369
+ append(
14370
+ label3(item),
14371
+ [
14372
+ ...columnItems.map(
14373
+ (col) => pivotNumbers(pivot, cells.get(JSON.stringify([key, pivotValueKey(col)])) ?? [])
14374
+ ),
14375
+ pivotNumbers(pivot, groups.get(key) ?? [])
14376
+ ],
14377
+ index2
14378
+ );
14379
+ });
14380
+ append(
14381
+ "Grand Total",
14382
+ [
14383
+ ...columnItems.map((col) => pivotNumbers(pivot, columns.get(pivotValueKey(col)) ?? [])),
14384
+ pivotNumbers(pivot, pivot.records)
14385
+ ],
14386
+ 0,
14387
+ true
14388
+ );
14389
+ return {
14390
+ values: values2,
14391
+ rowItems,
14392
+ columnItems,
14393
+ firstDataRow,
14394
+ rowLabelColumns: compact3 ? 1 : 2,
14395
+ indents,
14396
+ firstHeaderRow: 1,
14397
+ rowEntries
14398
+ };
14399
+ }
14022
14400
  for (const row2 of rowItems) {
14023
14401
  const records = groups.get(pivotValueKey(row2)) ?? [];
14024
14402
  values2.push([
14025
14403
  label3(row2),
14026
- ...columnItems.map(
14027
- (col) => aggregate2(
14028
- cells.get(JSON.stringify([pivotValueKey(row2), pivotValueKey(col)])) ?? [],
14029
- valueField,
14030
- pivot.aggregate
14404
+ ...columnItems.flatMap(
14405
+ (col) => pivotNumbers(
14406
+ pivot,
14407
+ cells.get(JSON.stringify([pivotValueKey(row2), pivotValueKey(col)])) ?? []
14031
14408
  )
14032
14409
  ),
14033
- aggregate2(records, valueField, pivot.aggregate)
14410
+ ...pivotNumbers(pivot, records)
14034
14411
  ]);
14035
14412
  }
14036
14413
  values2.push([
14037
14414
  "Grand Total",
14038
- ...columnItems.map(
14039
- (col) => aggregate2(columns.get(pivotValueKey(col)) ?? [], valueField, pivot.aggregate)
14040
- ),
14041
- aggregate2(pivot.records, valueField, pivot.aggregate)
14415
+ ...columnItems.flatMap((col) => pivotNumbers(pivot, columns.get(pivotValueKey(col)) ?? [])),
14416
+ ...pivotNumbers(pivot, pivot.records)
14042
14417
  ]);
14043
- return { values: values2, rowItems, columnItems, firstDataRow: pivot.columnField ? 2 : 1 };
14418
+ return { values: values2, rowItems, columnItems, firstDataRow };
14419
+ }
14420
+
14421
+ // xlsx/write/xml-out.ts
14422
+ var CONTROL2 = "\0-\b\v\f-" + String.fromCharCode(65534, 65535);
14423
+ var INVALID_XML = new RegExp(`[${CONTROL2}]`, "g");
14424
+ var escapeText = (text2) => text2.replace(INVALID_XML, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
14425
+ var escapeAttr = (text2) => text2.replace(INVALID_XML, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/\r/g, "&#13;").replace(/\n/g, "&#10;").replace(/\t/g, "&#9;");
14426
+ function attrs(values2) {
14427
+ let out = "";
14428
+ for (const [name, value2] of Object.entries(values2)) {
14429
+ if (value2 === void 0) continue;
14430
+ const text2 = typeof value2 === "boolean" ? value2 ? "1" : "0" : typeof value2 === "number" ? num2(value2) : value2;
14431
+ out += ` ${name}="${escapeAttr(text2)}"`;
14432
+ }
14433
+ return out;
14044
14434
  }
14435
+ var el = (name, values2 = {}, content = "") => content ? `<${name}${attrs(values2)}>${content}</${name}>` : `<${name}${attrs(values2)}/>`;
14436
+ var num2 = (value2) => Object.is(value2, -0) ? "0" : String(value2);
14045
14437
 
14046
14438
  // xlsx/read/style-parts.ts
14047
14439
  function parseColor(element2, palette) {
@@ -14076,23 +14468,6 @@ function parseSqref(sqref) {
14076
14468
  return sqref.split(/\s+/).filter(Boolean).map((part) => parseRange(part)).filter((range2) => range2 !== void 0);
14077
14469
  }
14078
14470
 
14079
- // xlsx/write/xml-out.ts
14080
- var CONTROL2 = "\0-\b\v\f-" + String.fromCharCode(65534, 65535);
14081
- var INVALID_XML = new RegExp(`[${CONTROL2}]`, "g");
14082
- var escapeText = (text2) => text2.replace(INVALID_XML, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
14083
- var escapeAttr = (text2) => text2.replace(INVALID_XML, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/\r/g, "&#13;").replace(/\n/g, "&#10;").replace(/\t/g, "&#9;");
14084
- function attrs(values2) {
14085
- let out = "";
14086
- for (const [name, value2] of Object.entries(values2)) {
14087
- if (value2 === void 0) continue;
14088
- const text2 = typeof value2 === "boolean" ? value2 ? "1" : "0" : typeof value2 === "number" ? num2(value2) : value2;
14089
- out += ` ${name}="${escapeAttr(text2)}"`;
14090
- }
14091
- return out;
14092
- }
14093
- var el = (name, values2 = {}, content = "") => content ? `<${name}${attrs(values2)}>${content}</${name}>` : `<${name}${attrs(values2)}/>`;
14094
- var num2 = (value2) => Object.is(value2, -0) ? "0" : String(value2);
14095
-
14096
14471
  // xlsx/conditional-extensions.ts
14097
14472
  var XM = "http://schemas.microsoft.com/office/excel/2006/main";
14098
14473
  function dataBarLengths(rule, node) {
@@ -18865,12 +19240,16 @@ function write(ctx, s, pivot, old) {
18865
19240
  ],
18866
19241
  () => {
18867
19242
  const compact3 = pivot.layout === "compact";
18868
- const indents = [
18869
- stylePatcher(ctx.workbook, {
18870
- alignment: { indent: 0, ...compact3 ? { horizontal: "left" } : {} }
18871
- }),
18872
- stylePatcher(ctx.workbook, { alignment: { indent: 1, horizontal: "left" } })
18873
- ];
19243
+ const indents = new Map(
19244
+ [.../* @__PURE__ */ new Set([0, ...grid6.indents ?? []])].map(
19245
+ (indent) => [
19246
+ indent,
19247
+ stylePatcher(ctx.workbook, {
19248
+ alignment: { indent, ...compact3 || indent > 0 ? { horizontal: "left" } : {} }
19249
+ })
19250
+ ]
19251
+ )
19252
+ );
18874
19253
  const styles = /* @__PURE__ */ new Map();
18875
19254
  forEachCellInRange(sheet, location, (cell, row2, col) => {
18876
19255
  if (cell.styleId !== void 0) styles.set(`${row2}:${col}`, cell.styleId);
@@ -18893,7 +19272,7 @@ function write(ctx, s, pivot, old) {
18893
19272
  const indent = col === 0 ? grid6.indents?.[row2] ?? 0 : 0;
18894
19273
  const alignment = styleAt(ctx.workbook, styleId).alignment;
18895
19274
  if ((alignment?.indent ?? 0) !== indent || compact3 && alignment?.horizontal !== "left")
18896
- styleId = indents[indent](styleId);
19275
+ styleId = indents.get(indent)(styleId);
18897
19276
  }
18898
19277
  putCell(sheet, r, c, { value: value2, ...styleId !== void 0 ? { styleId } : {} });
18899
19278
  })
@@ -18920,6 +19299,10 @@ function createPivotTable(ctx, s, destination, options) {
18920
19299
  valueField: options.valueField,
18921
19300
  aggregate: aggregate3,
18922
19301
  valueCaption: pivotCaption(aggregate3, options.valueField),
19302
+ ...options.pageFilter !== void 0 ? { pageFilter: structuredClone(options.pageFilter) } : {},
19303
+ ...options.valuesAxis !== void 0 ? { valuesAxis: options.valuesAxis } : {},
19304
+ ...options.valuesPosition !== void 0 ? { valuesPosition: options.valuesPosition } : {},
19305
+ ...options.additionalValues ? { additionalValues: normalizedPivotMeasures(options.additionalValues) } : {},
18923
19306
  location: { start: { ...destination }, end: { ...destination } },
18924
19307
  ...options.columnField ? { columnField: options.columnField } : {}
18925
19308
  };
@@ -18951,6 +19334,19 @@ function refreshPivotTable(ctx, s, name, patch2 = {}) {
18951
19334
  if (patch2.repeatLabels !== void 0) next.repeatLabels = patch2.repeatLabels;
18952
19335
  if (patch2.layout !== void 0) next.layout = patch2.layout;
18953
19336
  if (patch2.subtotalPosition !== void 0) next.subtotalPosition = patch2.subtotalPosition;
19337
+ if (patch2.valuesAxis !== void 0) next.valuesAxis = patch2.valuesAxis;
19338
+ if (patch2.pageFilter !== void 0) {
19339
+ if (patch2.pageFilter === null) delete next.pageFilter;
19340
+ else next.pageFilter = structuredClone(patch2.pageFilter);
19341
+ }
19342
+ if (patch2.valuesPosition !== void 0) next.valuesPosition = patch2.valuesPosition;
19343
+ else if (patch2.valuesAxis === "columns" || patch2.secondRowField === "")
19344
+ delete next.valuesPosition;
19345
+ if (patch2.additionalValues !== void 0) {
19346
+ const measures = normalizedPivotMeasures(patch2.additionalValues);
19347
+ if (measures.length) next.additionalValues = measures;
19348
+ else delete next.additionalValues;
19349
+ }
18954
19350
  validatePivotFields(next);
18955
19351
  write(ctx, s, next, old);
18956
19352
  }
@@ -25493,17 +25889,23 @@ var NAVIGATION_STRINGS = {
25493
25889
  "Minigr\xE1ficos (crear, dar formato y borrar)",
25494
25890
  "\u8FF7\u4F60\u56FE\uFF08\u521B\u5EFA\u3001\u683C\u5F0F\u8BBE\u7F6E\u548C\u6E05\u9664\uFF09"
25495
25891
  ],
25496
- "Worksheet-range PivotTables (one row field, optional column field and one value field)": [
25497
- "Tableaux crois\xE9s dynamiques de plages (un champ de ligne, un champ de colonne facultatif et un champ de valeur)",
25498
- "PivotTables aus Arbeitsblattbereichen (ein Zeilenfeld, optionales Spaltenfeld und ein Wertfeld)",
25499
- "Tablas din\xE1micas de rangos (un campo de fila, columna opcional y un valor)",
25500
- "\u5DE5\u4F5C\u8868\u533A\u57DF\u6570\u636E\u900F\u89C6\u8868\uFF08\u4E00\u4E2A\u884C\u5B57\u6BB5\u3001\u53EF\u9009\u5217\u5B57\u6BB5\u548C\u4E00\u4E2A\u503C\u5B57\u6BB5\uFF09"
25892
+ "Worksheet-range PivotTables (up to two row fields and sixteen values, one optional column field and one cached report filter)": [
25893
+ "Tableaux crois\xE9s dynamiques de plages (jusqu\u2019\xE0 deux champs de ligne et seize valeurs, un champ de colonne facultatif et un filtre de rapport mis en cache)",
25894
+ "PivotTables aus Arbeitsblattbereichen (bis zu zwei Zeilenfelder und sechzehn Werte, ein optionales Spaltenfeld und ein zwischengespeicherter Berichtsfilter)",
25895
+ "Tablas din\xE1micas de rangos (hasta dos campos de fila y diecis\xE9is valores, un campo de columna opcional y un filtro de informe en cach\xE9)",
25896
+ "\u5DE5\u4F5C\u8868\u533A\u57DF\u6570\u636E\u900F\u89C6\u8868\uFF08\u6700\u591A\u4E24\u4E2A\u884C\u5B57\u6BB5\u548C\u5341\u516D\u4E2A\u503C\u5B57\u6BB5\u3001\u4E00\u4E2A\u53EF\u9009\u5217\u5B57\u6BB5\u548C\u4E00\u4E2A\u7F13\u5B58\u62A5\u8868\u7B5B\u9009\u5668\uFF09"
25501
25897
  ],
25502
- "Advanced PivotTable layouts, grouping and external data sources (preserved)": [
25503
- "Dispositions avanc\xE9es, regroupements et sources externes de tableaux crois\xE9s dynamiques (conserv\xE9s)",
25504
- "Erweiterte PivotTable-Layouts, Gruppierung und externe Datenquellen (erhalten)",
25505
- "Dise\xF1os avanzados, agrupaci\xF3n y fuentes externas de tablas din\xE1micas (conservados)",
25506
- "\u9AD8\u7EA7\u6570\u636E\u900F\u89C6\u8868\u5E03\u5C40\u3001\u5206\u7EC4\u548C\u5916\u90E8\u6570\u636E\u6E90\uFF08\u4FDD\u7559\uFF09"
25898
+ "Unmodeled PivotTable layouts, grouping, slicers and external data sources (preserved)": [
25899
+ "Dispositions non prises en charge, regroupements, segments et sources externes de tableaux crois\xE9s dynamiques (conserv\xE9s)",
25900
+ "Nicht modellierte PivotTable-Layouts, Gruppierung, Datenschnitte und externe Datenquellen (erhalten)",
25901
+ "Dise\xF1os de tablas din\xE1micas no modelados, agrupaci\xF3n, segmentaciones y fuentes externas (conservados)",
25902
+ "\u672A\u5EFA\u6A21\u7684\u6570\u636E\u900F\u89C6\u8868\u5E03\u5C40\u3001\u5206\u7EC4\u3001\u5207\u7247\u5668\u548C\u5916\u90E8\u6570\u636E\u6E90\uFF08\u4FDD\u7559\uFF09"
25903
+ ],
25904
+ "Values-on-rows report filters, multiple/dynamic filters and repeated column captions (preserved)": [
25905
+ "Filtres de rapport avec valeurs en lignes, filtres multiples ou dynamiques et libell\xE9s de colonnes r\xE9p\xE9t\xE9s (conserv\xE9s)",
25906
+ "Berichtsfilter mit Werten in Zeilen, mehrere/dynamische Filter und wiederholte Spaltenbeschriftungen (erhalten)",
25907
+ "Filtros de informe con valores en filas, filtros m\xFAltiples o din\xE1micos y t\xEDtulos de columna repetidos (conservados)",
25908
+ "\u503C\u4F4D\u4E8E\u884C\u4E0A\u7684\u62A5\u8868\u7B5B\u9009\u5668\u3001\u591A\u91CD\u6216\u52A8\u6001\u7B5B\u9009\u5668\u548C\u91CD\u590D\u5217\u6807\u9898\uFF08\u4FDD\u7559\uFF09"
25507
25909
  ],
25508
25910
  OK: ["OK", "OK", "Aceptar", "\u786E\u5B9A"],
25509
25911
  Cancel: ["Annuler", "Abbrechen", "Cancelar", "\u53D6\u6D88"],
@@ -28446,6 +28848,107 @@ var SPARKLINE_STRINGS = {
28446
28848
 
28447
28849
  // xlsx/ui/commands/i18n/pivots.ts
28448
28850
  var PIVOT_STRINGS = {
28851
+ "Report Filter Field:": [
28852
+ "Champ de filtre du rapport :",
28853
+ "Berichtsfilterfeld:",
28854
+ "Campo de filtro del informe:",
28855
+ "\u62A5\u8868\u7B5B\u9009\u5B57\u6BB5\uFF1A"
28856
+ ],
28857
+ "Report Filter Item:": [
28858
+ "\xC9l\xE9ment du filtre du rapport :",
28859
+ "Berichtsfilterelement:",
28860
+ "Elemento de filtro del informe:",
28861
+ "\u62A5\u8868\u7B5B\u9009\u9879\uFF1A"
28862
+ ],
28863
+ "(All)": ["(Tous)", "(Alle)", "(Todos)", "\uFF08\u5168\u90E8\uFF09"],
28864
+ "(blank)": ["(vide)", "(leer)", "(en blanco)", "\uFF08\u7A7A\u767D\uFF09"],
28865
+ "Before row fields": [
28866
+ "Avant les champs de ligne",
28867
+ "Vor den Zeilenfeldern",
28868
+ "Antes de los campos de fila",
28869
+ "\u884C\u5B57\u6BB5\u4E4B\u524D"
28870
+ ],
28871
+ "Values are listed before the row fields.": [
28872
+ "Les valeurs sont affich\xE9es avant les champs de ligne.",
28873
+ "Werte werden vor den Zeilenfeldern aufgef\xFChrt.",
28874
+ "Los valores aparecen antes de los campos de fila.",
28875
+ "\u503C\u5217\u5728\u884C\u5B57\u6BB5\u4E4B\u524D\u3002"
28876
+ ],
28877
+ "Values Placement:": [
28878
+ "Position des valeurs :",
28879
+ "Anordnung der Werte:",
28880
+ "Posici\xF3n de los valores:",
28881
+ "\u503C\u4F4D\u7F6E\uFF1A"
28882
+ ],
28883
+ "After row fields": [
28884
+ "Apr\xE8s les champs de ligne",
28885
+ "Nach den Zeilenfeldern",
28886
+ "Despu\xE9s de los campos de fila",
28887
+ "\u884C\u5B57\u6BB5\u4E4B\u540E"
28888
+ ],
28889
+ "Between row fields": [
28890
+ "Entre les champs de ligne",
28891
+ "Zwischen den Zeilenfeldern",
28892
+ "Entre los campos de fila",
28893
+ "\u884C\u5B57\u6BB5\u4E4B\u95F4"
28894
+ ],
28895
+ "Values are listed between the row fields.": [
28896
+ "Les valeurs sont affich\xE9es entre les champs de ligne.",
28897
+ "Werte werden zwischen den Zeilenfeldern aufgef\xFChrt.",
28898
+ "Los valores aparecen entre los campos de fila.",
28899
+ "\u503C\u5217\u5728\u884C\u5B57\u6BB5\u4E4B\u95F4\u3002"
28900
+ ],
28901
+ "Values Axis:": ["Axe des valeurs :", "Werteachse:", "Eje de valores:", "\u503C\u8F74\uFF1A"],
28902
+ "Values on Columns": [
28903
+ "Valeurs en colonnes",
28904
+ "Werte in Spalten",
28905
+ "Valores en columnas",
28906
+ "\u503C\u663E\u793A\u5728\u5217\u4E0A"
28907
+ ],
28908
+ "Values on Rows": ["Valeurs en lignes", "Werte in Zeilen", "Valores en filas", "\u503C\u663E\u793A\u5728\u884C\u4E0A"],
28909
+ "Values are listed after the row fields.": [
28910
+ "Les valeurs sont affich\xE9es apr\xE8s les champs de ligne.",
28911
+ "Werte werden nach den Zeilenfeldern aufgef\xFChrt.",
28912
+ "Los valores aparecen despu\xE9s de los campos de fila.",
28913
+ "\u503C\u5217\u5728\u884C\u5B57\u6BB5\u4E4B\u540E\u3002"
28914
+ ],
28915
+ "Values on rows display subtotals below groups.": [
28916
+ "Les valeurs en lignes affichent les sous-totaux sous les groupes.",
28917
+ "Werte in Zeilen zeigen Teilergebnisse unter den Gruppen an.",
28918
+ "Los valores en filas muestran los subtotales debajo de los grupos.",
28919
+ "\u884C\u4E0A\u7684\u503C\u5C06\u5206\u7C7B\u6C47\u603B\u663E\u793A\u5728\u7EC4\u4E0B\u65B9\u3002"
28920
+ ],
28921
+ "Multiple value fields use Values on columns.": [
28922
+ "Plusieurs champs de valeur utilisent les valeurs en colonnes.",
28923
+ "Mehrere Wertfelder verwenden Werte in Spalten.",
28924
+ "Varios campos de valor usan Valores en columnas.",
28925
+ "\u591A\u4E2A\u503C\u5B57\u6BB5\u7684\u503C\u4F4D\u4E8E\u5217\u8F74\u4E0A\u3002"
28926
+ ],
28927
+ "Add Value Field": [
28928
+ "Ajouter un champ de valeur",
28929
+ "Wertfeld hinzuf\xFCgen",
28930
+ "A\xF1adir campo de valor",
28931
+ "\u6DFB\u52A0\u503C\u5B57\u6BB5"
28932
+ ],
28933
+ "Remove Value Field": [
28934
+ "Supprimer le champ de valeur",
28935
+ "Wertfeld entfernen",
28936
+ "Quitar campo de valor",
28937
+ "\u5220\u9664\u503C\u5B57\u6BB5"
28938
+ ],
28939
+ "Additional Value Field": [
28940
+ "Champ de valeur suppl\xE9mentaire",
28941
+ "Zus\xE4tzliches Wertfeld",
28942
+ "Campo de valor adicional",
28943
+ "\u9644\u52A0\u503C\u5B57\u6BB5"
28944
+ ],
28945
+ "Value Caption:": ["Libell\xE9 de valeur :", "Wertbeschriftung:", "T\xEDtulo del valor:", "\u503C\u6807\u9898\uFF1A"],
28946
+ "Multiple value fields use tabular layout with Values on columns.": [
28947
+ "Plusieurs champs de valeur utilisent la forme tabulaire avec les valeurs en colonnes.",
28948
+ "Mehrere Wertfelder verwenden das Tabellenformat mit Werten in Spalten.",
28949
+ "Varios campos de valor usan el formato tabular con Valores en columnas.",
28950
+ "\u591A\u4E2A\u503C\u5B57\u6BB5\u4F7F\u7528\u8868\u683C\u5E03\u5C40\uFF0C\u503C\u4F4D\u4E8E\u5217\u8F74\u4E0A\u3002"
28951
+ ],
28449
28952
  "Compact Form": ["Forme compacte", "Kompaktformat", "Formato compacto", "\u538B\u7F29\u5F62\u5F0F"],
28450
28953
  "Outline Form": ["Forme de plan", "Gliederungsformat", "Formato de esquema", "\u5927\u7EB2\u5F62\u5F0F"],
28451
28954
  "Tabular Form": ["Forme tabulaire", "Tabellenformat", "Formato tabular", "\u8868\u683C\u5F62\u5F0F"],