ooxml.js 2.4.0 → 2.5.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 (138) hide show
  1. package/README.md +40 -2
  2. package/dist/codec.cjs +28 -0
  3. package/dist/codec.d.cts +72 -0
  4. package/dist/codec.d.ts +72 -0
  5. package/dist/codec.js +24 -0
  6. package/dist/compact.cjs +162 -0
  7. package/dist/compact.d.cts +70 -0
  8. package/dist/compact.d.ts +70 -0
  9. package/dist/compact.js +152 -0
  10. package/dist/image/sniff.cjs +28 -0
  11. package/dist/image/sniff.d.cts +5 -0
  12. package/dist/image/sniff.d.ts +5 -0
  13. package/dist/image/sniff.js +27 -0
  14. package/dist/index.cjs +83 -3025
  15. package/dist/index.d.cts +22 -527
  16. package/dist/index.d.ts +22 -527
  17. package/dist/index.js +22 -2964
  18. package/dist/model/node.cjs +67 -0
  19. package/dist/model/node.d.cts +2 -0
  20. package/dist/model/node.d.ts +2 -0
  21. package/dist/model/node.js +58 -0
  22. package/dist/model/package.cjs +19 -0
  23. package/dist/model/package.d.cts +2 -0
  24. package/dist/model/package.d.ts +2 -0
  25. package/dist/model/package.js +15 -0
  26. package/dist/node-CkBWRjNR.d.cts +83 -0
  27. package/dist/node-CkBWRjNR.d.ts +83 -0
  28. package/dist/package-BUojjTXf.d.ts +114 -0
  29. package/dist/package-L24lkba-.d.cts +114 -0
  30. package/dist/package-io/read.cjs +33 -0
  31. package/dist/package-io/read.d.cts +5 -0
  32. package/dist/package-io/read.d.ts +5 -0
  33. package/dist/package-io/read.js +32 -0
  34. package/dist/package-io/write.cjs +18 -0
  35. package/dist/package-io/write.d.cts +5 -0
  36. package/dist/package-io/write.d.ts +5 -0
  37. package/dist/package-io/write.js +17 -0
  38. package/dist/typed/docx/read.cjs +332 -0
  39. package/dist/typed/docx/read.d.cts +52 -0
  40. package/dist/typed/docx/read.d.ts +52 -0
  41. package/dist/typed/docx/read.js +328 -0
  42. package/dist/typed/docx/styles.cjs +148 -0
  43. package/dist/typed/docx/styles.d.cts +29 -0
  44. package/dist/typed/docx/styles.d.ts +29 -0
  45. package/dist/typed/docx/styles.js +146 -0
  46. package/dist/typed/pptx/inherit.cjs +96 -0
  47. package/dist/typed/pptx/inherit.d.cts +30 -0
  48. package/dist/typed/pptx/inherit.d.ts +30 -0
  49. package/dist/typed/pptx/inherit.js +90 -0
  50. package/dist/typed/pptx/read.cjs +364 -0
  51. package/dist/typed/pptx/read.d.cts +44 -0
  52. package/dist/typed/pptx/read.d.ts +44 -0
  53. package/dist/typed/pptx/read.js +362 -0
  54. package/dist/typed/shared/color.cjs +85 -0
  55. package/dist/typed/shared/color.d.cts +9 -0
  56. package/dist/typed/shared/color.d.ts +9 -0
  57. package/dist/typed/shared/color.js +84 -0
  58. package/dist/typed/shared/drawingml.cjs +191 -0
  59. package/dist/typed/shared/drawingml.d.cts +40 -0
  60. package/dist/typed/shared/drawingml.d.ts +40 -0
  61. package/dist/typed/shared/drawingml.js +180 -0
  62. package/dist/typed/shared/metadata.cjs +44 -0
  63. package/dist/typed/shared/metadata.d.cts +16 -0
  64. package/dist/typed/shared/metadata.d.ts +16 -0
  65. package/dist/typed/shared/metadata.js +42 -0
  66. package/dist/typed/shared/source-path.cjs +18 -0
  67. package/dist/typed/shared/source-path.d.cts +5 -0
  68. package/dist/typed/shared/source-path.d.ts +5 -0
  69. package/dist/typed/shared/source-path.js +17 -0
  70. package/dist/typed/shared/units.cjs +55 -0
  71. package/dist/typed/shared/units.d.cts +20 -0
  72. package/dist/typed/shared/units.d.ts +20 -0
  73. package/dist/typed/shared/units.js +38 -0
  74. package/dist/typed/util.cjs +85 -0
  75. package/dist/typed/util.d.cts +18 -0
  76. package/dist/typed/util.d.ts +18 -0
  77. package/dist/typed/util.js +77 -0
  78. package/dist/typed/xlsx/a1.cjs +64 -0
  79. package/dist/typed/xlsx/a1.d.cts +19 -0
  80. package/dist/typed/xlsx/a1.d.ts +19 -0
  81. package/dist/typed/xlsx/a1.js +58 -0
  82. package/dist/typed/xlsx/build.cjs +456 -0
  83. package/dist/typed/xlsx/build.d.cts +6 -0
  84. package/dist/typed/xlsx/build.d.ts +6 -0
  85. package/dist/typed/xlsx/build.js +455 -0
  86. package/dist/typed/xlsx/content.cjs +257 -0
  87. package/dist/typed/xlsx/content.d.cts +6 -0
  88. package/dist/typed/xlsx/content.d.ts +6 -0
  89. package/dist/typed/xlsx/content.js +256 -0
  90. package/dist/typed/xlsx/defined-names.cjs +90 -0
  91. package/dist/typed/xlsx/defined-names.d.cts +20 -0
  92. package/dist/typed/xlsx/defined-names.d.ts +20 -0
  93. package/dist/typed/xlsx/defined-names.js +83 -0
  94. package/dist/typed/xlsx/print-settings.cjs +116 -0
  95. package/dist/typed/xlsx/print-settings.d.cts +8 -0
  96. package/dist/typed/xlsx/print-settings.d.ts +8 -0
  97. package/dist/typed/xlsx/print-settings.js +114 -0
  98. package/dist/typed/xlsx/shared-strings.cjs +35 -0
  99. package/dist/typed/xlsx/shared-strings.d.cts +12 -0
  100. package/dist/typed/xlsx/shared-strings.d.ts +12 -0
  101. package/dist/typed/xlsx/shared-strings.js +33 -0
  102. package/dist/typed/xlsx/units.cjs +21 -0
  103. package/dist/typed/xlsx/units.d.cts +8 -0
  104. package/dist/typed/xlsx/units.d.ts +8 -0
  105. package/dist/typed/xlsx/units.js +16 -0
  106. package/dist/typed/xlsx/util.cjs +53 -0
  107. package/dist/typed/xlsx/util.d.cts +10 -0
  108. package/dist/typed/xlsx/util.d.ts +10 -0
  109. package/dist/typed/xlsx/util.js +47 -0
  110. package/dist/typed/xlsx.cjs +140 -0
  111. package/dist/typed/xlsx.d.cts +43 -0
  112. package/dist/typed/xlsx.d.ts +43 -0
  113. package/dist/typed/xlsx.js +135 -0
  114. package/dist/util/base64.cjs +48 -0
  115. package/dist/util/base64.d.cts +5 -0
  116. package/dist/util/base64.d.ts +5 -0
  117. package/dist/util/base64.js +46 -0
  118. package/dist/xml/build.cjs +46 -0
  119. package/dist/xml/build.d.cts +5 -0
  120. package/dist/xml/build.d.ts +5 -0
  121. package/dist/xml/build.js +46 -0
  122. package/dist/xml/entities.cjs +7 -0
  123. package/dist/xml/entities.d.cts +4 -0
  124. package/dist/xml/entities.d.ts +4 -0
  125. package/dist/xml/entities.js +6 -0
  126. package/dist/xml/fragment.cjs +22 -0
  127. package/dist/xml/fragment.d.cts +6 -0
  128. package/dist/xml/fragment.d.ts +6 -0
  129. package/dist/xml/fragment.js +20 -0
  130. package/dist/xml/parse.cjs +88 -0
  131. package/dist/xml/parse.d.cts +5 -0
  132. package/dist/xml/parse.d.ts +5 -0
  133. package/dist/xml/parse.js +88 -0
  134. package/dist/zip.cjs +12 -0
  135. package/dist/zip.d.cts +5 -0
  136. package/dist/zip.d.ts +5 -0
  137. package/dist/zip.js +10 -0
  138. package/package.json +9 -1
@@ -0,0 +1,455 @@
1
+ import { el, txt } from "../../xml/fragment.js";
2
+ import { encodeXmlText } from "../../xml/entities.js";
3
+ import "../shared/units.js";
4
+ import { SharedStringTable } from "./shared-strings.js";
5
+ import { cellReference, rangeReference } from "./a1.js";
6
+ import { XLNM_PRINT_AREA, XLNM_PRINT_TITLES, buildPrintAreaValue, buildPrintTitlesValue } from "./defined-names.js";
7
+ import { pageSizeToPaperSizeCode, ptToUniversalMeasure, writeXmlBool } from "./util.js";
8
+ import { DEFAULT_HEADER_FOOTER_MARGIN_PT } from "./print-settings.js";
9
+ import { ptToColumnWidthChars } from "./units.js";
10
+ //#region src/typed/xlsx/build.ts
11
+ const SML_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
12
+ const REL_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
13
+ const PKG_RELS_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
14
+ const CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
15
+ const CORE_PROPS_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
16
+ const DC_NS = "http://purl.org/dc/elements/1.1/";
17
+ const DCTERMS_NS = "http://purl.org/dc/terms/";
18
+ const XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
19
+ const EXTENDED_PROPS_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
20
+ const CT_WORKBOOK = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
21
+ const CT_STYLES = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml";
22
+ const CT_SHARED_STRINGS = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
23
+ const CT_WORKSHEET = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
24
+ const CT_CORE_PROPS = "application/vnd.openxmlformats-package.core-properties+xml";
25
+ const CT_EXTENDED_PROPS = "application/vnd.openxmlformats-officedocument.extended-properties+xml";
26
+ const REL_OFFICE_DOCUMENT = `${REL_NS}/officeDocument`;
27
+ const REL_CORE_PROPS = `${PKG_RELS_NS}/metadata/core-properties`;
28
+ const REL_EXTENDED_PROPS = `${REL_NS}/extended-properties`;
29
+ const REL_WORKSHEET = `${REL_NS}/worksheet`;
30
+ const REL_STYLES = `${REL_NS}/styles`;
31
+ const REL_SHARED_STRINGS = `${REL_NS}/sharedStrings`;
32
+ const MAX_COLUMN_INDEX = 16383;
33
+ const MAX_ROW_INDEX = 1048575;
34
+ function xmlDeclaration() {
35
+ return {
36
+ type: "declaration",
37
+ attributes: [
38
+ {
39
+ name: "version",
40
+ value: "1.0"
41
+ },
42
+ {
43
+ name: "encoding",
44
+ value: "UTF-8"
45
+ },
46
+ {
47
+ name: "standalone",
48
+ value: "yes"
49
+ }
50
+ ]
51
+ };
52
+ }
53
+ function xmlPart(root) {
54
+ return {
55
+ kind: "xml",
56
+ nodes: [xmlDeclaration(), root]
57
+ };
58
+ }
59
+ function buildContentTypesPart(sheetCount) {
60
+ const overrides = [
61
+ el("Override", {
62
+ PartName: "/xl/workbook.xml",
63
+ ContentType: CT_WORKBOOK
64
+ }),
65
+ el("Override", {
66
+ PartName: "/xl/styles.xml",
67
+ ContentType: CT_STYLES
68
+ }),
69
+ el("Override", {
70
+ PartName: "/xl/sharedStrings.xml",
71
+ ContentType: CT_SHARED_STRINGS
72
+ })
73
+ ];
74
+ for (let index = 0; index < sheetCount; index++) overrides.push(el("Override", {
75
+ PartName: `/xl/worksheets/sheet${index + 1}.xml`,
76
+ ContentType: CT_WORKSHEET
77
+ }));
78
+ overrides.push(el("Override", {
79
+ PartName: "/docProps/core.xml",
80
+ ContentType: CT_CORE_PROPS
81
+ }));
82
+ overrides.push(el("Override", {
83
+ PartName: "/docProps/app.xml",
84
+ ContentType: CT_EXTENDED_PROPS
85
+ }));
86
+ return xmlPart(el("Types", { xmlns: CONTENT_TYPES_NS }, [
87
+ el("Default", {
88
+ Extension: "rels",
89
+ ContentType: "application/vnd.openxmlformats-package.relationships+xml"
90
+ }),
91
+ el("Default", {
92
+ Extension: "xml",
93
+ ContentType: "application/xml"
94
+ }),
95
+ ...overrides
96
+ ]));
97
+ }
98
+ function buildPackageRelsPart() {
99
+ return xmlPart(el("Relationships", { xmlns: PKG_RELS_NS }, [
100
+ el("Relationship", {
101
+ Id: "rId1",
102
+ Type: REL_OFFICE_DOCUMENT,
103
+ Target: "xl/workbook.xml"
104
+ }),
105
+ el("Relationship", {
106
+ Id: "rId2",
107
+ Type: REL_CORE_PROPS,
108
+ Target: "docProps/core.xml"
109
+ }),
110
+ el("Relationship", {
111
+ Id: "rId3",
112
+ Type: REL_EXTENDED_PROPS,
113
+ Target: "docProps/app.xml"
114
+ })
115
+ ]));
116
+ }
117
+ function worksheetRelId(sheetIndex) {
118
+ return `rId${sheetIndex + 1}`;
119
+ }
120
+ function buildWorkbookRelsPart(sheetCount) {
121
+ const relationships = [];
122
+ for (let index = 0; index < sheetCount; index++) relationships.push(el("Relationship", {
123
+ Id: worksheetRelId(index),
124
+ Type: REL_WORKSHEET,
125
+ Target: `worksheets/sheet${index + 1}.xml`
126
+ }));
127
+ relationships.push(el("Relationship", {
128
+ Id: `rId${sheetCount + 1}`,
129
+ Type: REL_STYLES,
130
+ Target: "styles.xml"
131
+ }));
132
+ relationships.push(el("Relationship", {
133
+ Id: `rId${sheetCount + 2}`,
134
+ Type: REL_SHARED_STRINGS,
135
+ Target: "sharedStrings.xml"
136
+ }));
137
+ return xmlPart(el("Relationships", { xmlns: PKG_RELS_NS }, relationships));
138
+ }
139
+ function buildDefinedNameElements(sheets) {
140
+ const elements = [];
141
+ sheets.forEach((sheet, sheetIndex) => {
142
+ const { printRange, repeatRows, repeatColumns } = sheet.printSettings;
143
+ if (printRange !== void 0) {
144
+ const value = buildPrintAreaValue(sheet.name, printRange);
145
+ elements.push(el("definedName", {
146
+ name: XLNM_PRINT_AREA,
147
+ localSheetId: String(sheetIndex)
148
+ }, [txt(encodeXmlText(value))]));
149
+ }
150
+ if (repeatRows !== void 0 || repeatColumns !== void 0) {
151
+ const value = buildPrintTitlesValue(sheet.name, repeatRows, repeatColumns);
152
+ if (value !== void 0) elements.push(el("definedName", {
153
+ name: XLNM_PRINT_TITLES,
154
+ localSheetId: String(sheetIndex)
155
+ }, [txt(encodeXmlText(value))]));
156
+ }
157
+ });
158
+ return elements;
159
+ }
160
+ function buildWorkbookPart(sheets) {
161
+ const children = [el("sheets", {}, sheets.map((sheet, index) => el("sheet", {
162
+ name: encodeXmlText(sheet.name),
163
+ sheetId: String(index + 1),
164
+ "r:id": worksheetRelId(index)
165
+ })))];
166
+ const definedNameElements = buildDefinedNameElements(sheets);
167
+ if (definedNameElements.length > 0) children.push(el("definedNames", {}, definedNameElements));
168
+ return xmlPart(el("workbook", {
169
+ xmlns: SML_NS,
170
+ "xmlns:r": REL_NS
171
+ }, children));
172
+ }
173
+ function buildSharedStringsPart(sharedStrings) {
174
+ const entries = sharedStrings.entries();
175
+ const siElements = entries.map((value) => el("si", {}, [el("t", { "xml:space": "preserve" }, [txt(encodeXmlText(value))])]));
176
+ return xmlPart(el("sst", {
177
+ xmlns: SML_NS,
178
+ count: String(entries.length),
179
+ uniqueCount: String(entries.length)
180
+ }, siElements));
181
+ }
182
+ function buildStylesPart() {
183
+ return xmlPart(el("styleSheet", { xmlns: SML_NS }, [
184
+ el("fonts", { count: "1" }, [el("font", {}, [el("sz", { val: "11" }), el("name", { val: "Calibri" })])]),
185
+ el("fills", { count: "2" }, [el("fill", {}, [el("patternFill", { patternType: "none" })]), el("fill", {}, [el("patternFill", { patternType: "gray125" })])]),
186
+ el("borders", { count: "1" }, [el("border", {}, [
187
+ el("left"),
188
+ el("right"),
189
+ el("top"),
190
+ el("bottom"),
191
+ el("diagonal")
192
+ ])]),
193
+ el("cellStyleXfs", { count: "1" }, [el("xf", {
194
+ numFmtId: "0",
195
+ fontId: "0",
196
+ fillId: "0",
197
+ borderId: "0"
198
+ })]),
199
+ el("cellXfs", { count: "1" }, [el("xf", {
200
+ numFmtId: "0",
201
+ fontId: "0",
202
+ fillId: "0",
203
+ borderId: "0",
204
+ xfId: "0"
205
+ })]),
206
+ el("cellStyles", { count: "1" }, [el("cellStyle", {
207
+ name: "Normal",
208
+ xfId: "0",
209
+ builtinId: "0"
210
+ })])
211
+ ]));
212
+ }
213
+ function buildCorePropertiesPart(metadata) {
214
+ const children = [];
215
+ if (metadata.title !== void 0) children.push(el("dc:title", {}, [txt(encodeXmlText(metadata.title))]));
216
+ if (metadata.author !== void 0) children.push(el("dc:creator", {}, [txt(encodeXmlText(metadata.author))]));
217
+ if (metadata.subject !== void 0) children.push(el("dc:subject", {}, [txt(encodeXmlText(metadata.subject))]));
218
+ if (metadata.keywords !== void 0 && metadata.keywords.length > 0) children.push(el("cp:keywords", {}, [txt(encodeXmlText(metadata.keywords.join(", ")))]));
219
+ if (metadata.createdIso !== void 0) children.push(el("dcterms:created", { "xsi:type": "dcterms:W3CDTF" }, [txt(encodeXmlText(metadata.createdIso))]));
220
+ if (metadata.modifiedIso !== void 0) children.push(el("dcterms:modified", { "xsi:type": "dcterms:W3CDTF" }, [txt(encodeXmlText(metadata.modifiedIso))]));
221
+ return xmlPart(el("cp:coreProperties", {
222
+ "xmlns:cp": CORE_PROPS_NS,
223
+ "xmlns:dc": DC_NS,
224
+ "xmlns:dcterms": DCTERMS_NS,
225
+ "xmlns:xsi": XSI_NS
226
+ }, children));
227
+ }
228
+ function buildAppPropertiesPart(metadata) {
229
+ const children = [];
230
+ if (metadata.creator !== void 0) children.push(el("Application", {}, [txt(encodeXmlText(metadata.creator))]));
231
+ return xmlPart(el("Properties", { xmlns: EXTENDED_PROPS_NS }, children));
232
+ }
233
+ function computeDimension(sheet) {
234
+ let maxRow = 0;
235
+ let maxColumn = 0;
236
+ let hasAny = false;
237
+ for (const cell of sheet.cells) {
238
+ hasAny = true;
239
+ maxRow = Math.max(maxRow, cell.row);
240
+ maxColumn = Math.max(maxColumn, cell.column);
241
+ }
242
+ for (const column of sheet.columns) {
243
+ hasAny = true;
244
+ maxColumn = Math.max(maxColumn, column.index);
245
+ }
246
+ for (const row of sheet.rows) {
247
+ hasAny = true;
248
+ maxRow = Math.max(maxRow, row.index);
249
+ }
250
+ return hasAny ? rangeReference({
251
+ startRow: 0,
252
+ startColumn: 0,
253
+ endRow: maxRow,
254
+ endColumn: maxColumn
255
+ }) : "A1";
256
+ }
257
+ function buildColsElement(columns) {
258
+ if (columns.length === 0) return;
259
+ return el("cols", {}, columns.map((column) => {
260
+ const attrs = {
261
+ min: String(column.index + 1),
262
+ max: String(column.index + 1),
263
+ width: ptToColumnWidthChars(column.widthPt).toFixed(2),
264
+ customWidth: "true"
265
+ };
266
+ if (column.hidden === true) attrs.hidden = "true";
267
+ return el("col", attrs);
268
+ }));
269
+ }
270
+ function renderCellValue(value, isFormulaResult, sharedStrings) {
271
+ switch (value.kind) {
272
+ case "string":
273
+ if (isFormulaResult) return {
274
+ type: "str",
275
+ content: encodeXmlText(value.value)
276
+ };
277
+ return {
278
+ type: "s",
279
+ content: String(sharedStrings.intern(value.value))
280
+ };
281
+ case "number":
282
+ case "percentage":
283
+ case "currency": return { content: String(value.value) };
284
+ case "boolean": return {
285
+ type: "b",
286
+ content: value.value ? "1" : "0"
287
+ };
288
+ case "date":
289
+ case "time": return {
290
+ type: "d",
291
+ content: encodeXmlText(value.value)
292
+ };
293
+ case "error": return {
294
+ type: "e",
295
+ content: encodeXmlText(value.value)
296
+ };
297
+ case "empty": return;
298
+ }
299
+ }
300
+ function buildCellElement(cell, sharedStrings) {
301
+ const attrs = {
302
+ r: cellReference(cell.row, cell.column),
303
+ s: "0"
304
+ };
305
+ const children = [];
306
+ if (cell.formula !== void 0) children.push(el("f", {}, [txt(encodeXmlText(cell.formula))]));
307
+ const rendered = renderCellValue(cell.value, cell.formula !== void 0, sharedStrings);
308
+ if (rendered !== void 0) {
309
+ if (rendered.type !== void 0) attrs.t = rendered.type;
310
+ children.push(el("v", {}, [txt(rendered.content)]));
311
+ }
312
+ return el("c", attrs, children);
313
+ }
314
+ function buildSheetDataElement(sheet, sharedStrings) {
315
+ const cellsByRow = /* @__PURE__ */ new Map();
316
+ for (const cell of sheet.cells) {
317
+ const existing = cellsByRow.get(cell.row);
318
+ if (existing === void 0) cellsByRow.set(cell.row, [cell]);
319
+ else existing.push(cell);
320
+ }
321
+ const rowInfoByIndex = /* @__PURE__ */ new Map();
322
+ for (const row of sheet.rows) rowInfoByIndex.set(row.index, row);
323
+ return el("sheetData", {}, Array.from(/* @__PURE__ */ new Set([...cellsByRow.keys(), ...rowInfoByIndex.keys()])).sort((a, b) => a - b).map((rowIndex) => {
324
+ const cells = (cellsByRow.get(rowIndex) ?? []).slice().sort((a, b) => a.column - b.column);
325
+ const rowInfo = rowInfoByIndex.get(rowIndex);
326
+ const attrs = { r: String(rowIndex + 1) };
327
+ if (rowInfo !== void 0) {
328
+ attrs.ht = String(rowInfo.heightPt);
329
+ attrs.customHeight = "true";
330
+ if (rowInfo.hidden === true) attrs.hidden = "true";
331
+ }
332
+ return el("row", attrs, cells.map((cell) => buildCellElement(cell, sharedStrings)));
333
+ }));
334
+ }
335
+ function buildMergeCellsElement(cells) {
336
+ const merges = cells.filter((cell) => (cell.colSpan ?? 1) > 1 || (cell.rowSpan ?? 1) > 1);
337
+ if (merges.length === 0) return;
338
+ const mergeCellElements = merges.map((cell) => {
339
+ const endRow = cell.row + (cell.rowSpan ?? 1) - 1;
340
+ const endColumn = cell.column + (cell.colSpan ?? 1) - 1;
341
+ return el("mergeCell", { ref: rangeReference({
342
+ startRow: cell.row,
343
+ startColumn: cell.column,
344
+ endRow,
345
+ endColumn
346
+ }) });
347
+ });
348
+ return el("mergeCells", { count: String(mergeCellElements.length) }, mergeCellElements);
349
+ }
350
+ function buildSheetPrElement(settings) {
351
+ return el("sheetPr", {}, [el("pageSetUpPr", { fitToPage: writeXmlBool(settings.fitToPages !== void 0) })]);
352
+ }
353
+ function buildPrintOptionsElement(settings) {
354
+ return el("printOptions", {
355
+ gridLines: writeXmlBool(settings.gridlines),
356
+ headings: writeXmlBool(settings.headers)
357
+ });
358
+ }
359
+ function ptToInches(pt) {
360
+ return String(pt / 72);
361
+ }
362
+ function buildPageMarginsElement(settings) {
363
+ const margins = settings.margins;
364
+ return el("pageMargins", {
365
+ left: ptToInches(margins.leftPt),
366
+ right: ptToInches(margins.rightPt),
367
+ top: ptToInches(margins.topPt),
368
+ bottom: ptToInches(margins.bottomPt),
369
+ header: ptToInches(DEFAULT_HEADER_FOOTER_MARGIN_PT),
370
+ footer: ptToInches(DEFAULT_HEADER_FOOTER_MARGIN_PT)
371
+ });
372
+ }
373
+ function buildPageSetupElement(settings) {
374
+ const attrs = {};
375
+ const paperCode = pageSizeToPaperSizeCode(settings.pageSize);
376
+ if (paperCode !== void 0) attrs.paperSize = paperCode;
377
+ else {
378
+ attrs.paperWidth = ptToUniversalMeasure(settings.pageSize.widthPt);
379
+ attrs.paperHeight = ptToUniversalMeasure(settings.pageSize.heightPt);
380
+ }
381
+ attrs.scale = String(settings.scale ?? 100);
382
+ attrs.fitToWidth = String(settings.fitToPages?.width ?? 1);
383
+ attrs.fitToHeight = String(settings.fitToPages?.height ?? 1);
384
+ attrs.pageOrder = settings.pageOrder;
385
+ attrs.orientation = settings.pageSize.widthPt > settings.pageSize.heightPt ? "landscape" : "portrait";
386
+ return el("pageSetup", attrs);
387
+ }
388
+ function buildBreaksElements(settings) {
389
+ const manualBreaks = settings.manualBreaks;
390
+ if (manualBreaks === void 0) return {};
391
+ const result = {};
392
+ if (manualBreaks.rows.length > 0) {
393
+ const breaks = manualBreaks.rows.map((id) => el("brk", {
394
+ id: String(id),
395
+ min: "0",
396
+ max: String(MAX_COLUMN_INDEX),
397
+ man: "1"
398
+ }));
399
+ result.rowBreaks = el("rowBreaks", {
400
+ count: String(breaks.length),
401
+ manualBreakCount: String(breaks.length)
402
+ }, breaks);
403
+ }
404
+ if (manualBreaks.columns.length > 0) {
405
+ const breaks = manualBreaks.columns.map((id) => el("brk", {
406
+ id: String(id),
407
+ min: "0",
408
+ max: String(MAX_ROW_INDEX),
409
+ man: "1"
410
+ }));
411
+ result.colBreaks = el("colBreaks", {
412
+ count: String(breaks.length),
413
+ manualBreakCount: String(breaks.length)
414
+ }, breaks);
415
+ }
416
+ return result;
417
+ }
418
+ function buildWorksheetPart(sheet, sharedStrings) {
419
+ const children = [buildSheetPrElement(sheet.printSettings), el("dimension", { ref: computeDimension(sheet) })];
420
+ const colsElement = buildColsElement(sheet.columns);
421
+ if (colsElement !== void 0) children.push(colsElement);
422
+ children.push(buildSheetDataElement(sheet, sharedStrings));
423
+ const mergeCellsElement = buildMergeCellsElement(sheet.cells);
424
+ if (mergeCellsElement !== void 0) children.push(mergeCellsElement);
425
+ children.push(buildPrintOptionsElement(sheet.printSettings), buildPageMarginsElement(sheet.printSettings), buildPageSetupElement(sheet.printSettings));
426
+ const { rowBreaks, colBreaks } = buildBreaksElements(sheet.printSettings);
427
+ if (rowBreaks !== void 0) children.push(rowBreaks);
428
+ if (colBreaks !== void 0) children.push(colBreaks);
429
+ return xmlPart(el("worksheet", {
430
+ xmlns: SML_NS,
431
+ "xmlns:r": REL_NS
432
+ }, children));
433
+ }
434
+ function buildXlsxPackage(document) {
435
+ if (document.kind !== "spreadsheet") throw new Error(`buildXlsxPackage: expected a ContentDocument of kind "spreadsheet", got "${document.kind}"`);
436
+ const sheets = document.sheets;
437
+ const sharedStrings = new SharedStringTable();
438
+ const worksheetParts = sheets.map((sheet) => buildWorksheetPart(sheet, sharedStrings));
439
+ const parts = {
440
+ "[Content_Types].xml": buildContentTypesPart(sheets.length),
441
+ "_rels/.rels": buildPackageRelsPart(),
442
+ "xl/workbook.xml": buildWorkbookPart(sheets),
443
+ "xl/_rels/workbook.xml.rels": buildWorkbookRelsPart(sheets.length),
444
+ "xl/styles.xml": buildStylesPart(),
445
+ "xl/sharedStrings.xml": buildSharedStringsPart(sharedStrings),
446
+ "docProps/core.xml": buildCorePropertiesPart(document.metadata),
447
+ "docProps/app.xml": buildAppPropertiesPart(document.metadata)
448
+ };
449
+ worksheetParts.forEach((part, index) => {
450
+ parts[`xl/worksheets/sheet${index + 1}.xml`] = part;
451
+ });
452
+ return { parts };
453
+ }
454
+ //#endregion
455
+ export { buildXlsxPackage };