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.
- package/README.md +40 -2
- package/dist/codec.cjs +28 -0
- package/dist/codec.d.cts +72 -0
- package/dist/codec.d.ts +72 -0
- package/dist/codec.js +24 -0
- package/dist/compact.cjs +162 -0
- package/dist/compact.d.cts +70 -0
- package/dist/compact.d.ts +70 -0
- package/dist/compact.js +152 -0
- package/dist/image/sniff.cjs +28 -0
- package/dist/image/sniff.d.cts +5 -0
- package/dist/image/sniff.d.ts +5 -0
- package/dist/image/sniff.js +27 -0
- package/dist/index.cjs +83 -3025
- package/dist/index.d.cts +22 -527
- package/dist/index.d.ts +22 -527
- package/dist/index.js +22 -2964
- package/dist/model/node.cjs +67 -0
- package/dist/model/node.d.cts +2 -0
- package/dist/model/node.d.ts +2 -0
- package/dist/model/node.js +58 -0
- package/dist/model/package.cjs +19 -0
- package/dist/model/package.d.cts +2 -0
- package/dist/model/package.d.ts +2 -0
- package/dist/model/package.js +15 -0
- package/dist/node-CkBWRjNR.d.cts +83 -0
- package/dist/node-CkBWRjNR.d.ts +83 -0
- package/dist/package-BUojjTXf.d.ts +114 -0
- package/dist/package-L24lkba-.d.cts +114 -0
- package/dist/package-io/read.cjs +33 -0
- package/dist/package-io/read.d.cts +5 -0
- package/dist/package-io/read.d.ts +5 -0
- package/dist/package-io/read.js +32 -0
- package/dist/package-io/write.cjs +18 -0
- package/dist/package-io/write.d.cts +5 -0
- package/dist/package-io/write.d.ts +5 -0
- package/dist/package-io/write.js +17 -0
- package/dist/typed/docx/read.cjs +332 -0
- package/dist/typed/docx/read.d.cts +52 -0
- package/dist/typed/docx/read.d.ts +52 -0
- package/dist/typed/docx/read.js +328 -0
- package/dist/typed/docx/styles.cjs +148 -0
- package/dist/typed/docx/styles.d.cts +29 -0
- package/dist/typed/docx/styles.d.ts +29 -0
- package/dist/typed/docx/styles.js +146 -0
- package/dist/typed/pptx/inherit.cjs +96 -0
- package/dist/typed/pptx/inherit.d.cts +30 -0
- package/dist/typed/pptx/inherit.d.ts +30 -0
- package/dist/typed/pptx/inherit.js +90 -0
- package/dist/typed/pptx/read.cjs +364 -0
- package/dist/typed/pptx/read.d.cts +44 -0
- package/dist/typed/pptx/read.d.ts +44 -0
- package/dist/typed/pptx/read.js +362 -0
- package/dist/typed/shared/color.cjs +85 -0
- package/dist/typed/shared/color.d.cts +9 -0
- package/dist/typed/shared/color.d.ts +9 -0
- package/dist/typed/shared/color.js +84 -0
- package/dist/typed/shared/drawingml.cjs +191 -0
- package/dist/typed/shared/drawingml.d.cts +40 -0
- package/dist/typed/shared/drawingml.d.ts +40 -0
- package/dist/typed/shared/drawingml.js +180 -0
- package/dist/typed/shared/metadata.cjs +44 -0
- package/dist/typed/shared/metadata.d.cts +16 -0
- package/dist/typed/shared/metadata.d.ts +16 -0
- package/dist/typed/shared/metadata.js +42 -0
- package/dist/typed/shared/source-path.cjs +18 -0
- package/dist/typed/shared/source-path.d.cts +5 -0
- package/dist/typed/shared/source-path.d.ts +5 -0
- package/dist/typed/shared/source-path.js +17 -0
- package/dist/typed/shared/units.cjs +55 -0
- package/dist/typed/shared/units.d.cts +20 -0
- package/dist/typed/shared/units.d.ts +20 -0
- package/dist/typed/shared/units.js +38 -0
- package/dist/typed/util.cjs +85 -0
- package/dist/typed/util.d.cts +18 -0
- package/dist/typed/util.d.ts +18 -0
- package/dist/typed/util.js +77 -0
- package/dist/typed/xlsx/a1.cjs +64 -0
- package/dist/typed/xlsx/a1.d.cts +19 -0
- package/dist/typed/xlsx/a1.d.ts +19 -0
- package/dist/typed/xlsx/a1.js +58 -0
- package/dist/typed/xlsx/build.cjs +456 -0
- package/dist/typed/xlsx/build.d.cts +6 -0
- package/dist/typed/xlsx/build.d.ts +6 -0
- package/dist/typed/xlsx/build.js +455 -0
- package/dist/typed/xlsx/content.cjs +257 -0
- package/dist/typed/xlsx/content.d.cts +6 -0
- package/dist/typed/xlsx/content.d.ts +6 -0
- package/dist/typed/xlsx/content.js +256 -0
- package/dist/typed/xlsx/defined-names.cjs +90 -0
- package/dist/typed/xlsx/defined-names.d.cts +20 -0
- package/dist/typed/xlsx/defined-names.d.ts +20 -0
- package/dist/typed/xlsx/defined-names.js +83 -0
- package/dist/typed/xlsx/print-settings.cjs +116 -0
- package/dist/typed/xlsx/print-settings.d.cts +8 -0
- package/dist/typed/xlsx/print-settings.d.ts +8 -0
- package/dist/typed/xlsx/print-settings.js +114 -0
- package/dist/typed/xlsx/shared-strings.cjs +35 -0
- package/dist/typed/xlsx/shared-strings.d.cts +12 -0
- package/dist/typed/xlsx/shared-strings.d.ts +12 -0
- package/dist/typed/xlsx/shared-strings.js +33 -0
- package/dist/typed/xlsx/units.cjs +21 -0
- package/dist/typed/xlsx/units.d.cts +8 -0
- package/dist/typed/xlsx/units.d.ts +8 -0
- package/dist/typed/xlsx/units.js +16 -0
- package/dist/typed/xlsx/util.cjs +53 -0
- package/dist/typed/xlsx/util.d.cts +10 -0
- package/dist/typed/xlsx/util.d.ts +10 -0
- package/dist/typed/xlsx/util.js +47 -0
- package/dist/typed/xlsx.cjs +140 -0
- package/dist/typed/xlsx.d.cts +43 -0
- package/dist/typed/xlsx.d.ts +43 -0
- package/dist/typed/xlsx.js +135 -0
- package/dist/util/base64.cjs +48 -0
- package/dist/util/base64.d.cts +5 -0
- package/dist/util/base64.d.ts +5 -0
- package/dist/util/base64.js +46 -0
- package/dist/xml/build.cjs +46 -0
- package/dist/xml/build.d.cts +5 -0
- package/dist/xml/build.d.ts +5 -0
- package/dist/xml/build.js +46 -0
- package/dist/xml/entities.cjs +7 -0
- package/dist/xml/entities.d.cts +4 -0
- package/dist/xml/entities.d.ts +4 -0
- package/dist/xml/entities.js +6 -0
- package/dist/xml/fragment.cjs +22 -0
- package/dist/xml/fragment.d.cts +6 -0
- package/dist/xml/fragment.d.ts +6 -0
- package/dist/xml/fragment.js +20 -0
- package/dist/xml/parse.cjs +88 -0
- package/dist/xml/parse.d.cts +5 -0
- package/dist/xml/parse.d.ts +5 -0
- package/dist/xml/parse.js +88 -0
- package/dist/zip.cjs +12 -0
- package/dist/zip.d.cts +5 -0
- package/dist/zip.d.ts +5 -0
- package/dist/zip.js +10 -0
- 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 };
|