@office-open/xlsx 0.6.6 → 0.6.7
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 +13 -13
- package/dist/{index.d.ts → index.d.mts} +5 -1
- package/dist/index.d.mts.map +1 -0
- package/dist/{index.js → index.mjs} +133 -36
- package/dist/index.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -67,29 +67,29 @@ DEFLATE = compressed (default), STORE = no compression.
|
|
|
67
67
|
|
|
68
68
|
**Create + toBuffer (end-to-end)**
|
|
69
69
|
|
|
70
|
-
| Scenario | DEFLATE sync | STORE sync | DEFLATE async | STORE async |
|
|
71
|
-
| ---------------- | -----------: | -----------: | ------------: | -----------: |
|
|
72
|
-
| Simple (3 rows) |
|
|
73
|
-
| Styled rows (20) |
|
|
74
|
-
| Table (10×5) |
|
|
70
|
+
| Scenario | DEFLATE sync | STORE sync | DEFLATE async | STORE async | hucre |
|
|
71
|
+
| ---------------- | -----------: | -----------: | ------------: | -----------: | --------: |
|
|
72
|
+
| Simple (3 rows) | 457 ops/s | 10,016 ops/s | 500 ops/s | 11,637 ops/s | 689 ops/s |
|
|
73
|
+
| Styled rows (20) | 472 ops/s | 10,504 ops/s | 627 ops/s | 9,479 ops/s | 862 ops/s |
|
|
74
|
+
| Table (10×5) | 675 ops/s | 10,518 ops/s | 681 ops/s | 10,241 ops/s | 877 ops/s |
|
|
75
75
|
|
|
76
76
|
**Large Files — Create + toBuffer**
|
|
77
77
|
|
|
78
78
|
| Scenario | DEFLATE sync | STORE sync | DEFLATE async | STORE async | hucre |
|
|
79
79
|
| -------------------- | -----------: | ----------: | ------------: | ----------: | ----------: |
|
|
80
|
-
| 2000 rows |
|
|
81
|
-
| 200×10 table |
|
|
82
|
-
| 20 sheets × 100 rows |
|
|
80
|
+
| 2000 rows | 47.3 ops/s | 164.9 ops/s | 19.0 ops/s | 162.9 ops/s | 82.8 ops/s |
|
|
81
|
+
| 200×10 table | 148.2 ops/s | 510.5 ops/s | 160.7 ops/s | 691.7 ops/s | 226.4 ops/s |
|
|
82
|
+
| 20 sheets × 100 rows | 81.3 ops/s | 179.5 ops/s | 87.8 ops/s | 223.5 ops/s | 79.9 ops/s |
|
|
83
83
|
|
|
84
84
|
**Large Data — 100,000 rows × 20 columns (2M cells)**
|
|
85
85
|
|
|
86
86
|
| Method | Speed | Speedup |
|
|
87
87
|
| ------------- | ----------: | --------: |
|
|
88
|
-
| DEFLATE sync | 0.
|
|
89
|
-
| STORE sync | 0.
|
|
90
|
-
| DEFLATE async | 0.
|
|
91
|
-
| STORE async | 0.
|
|
92
|
-
| hucre | 0.
|
|
88
|
+
| DEFLATE sync | 0.250 ops/s | 0.68x |
|
|
89
|
+
| STORE sync | 0.516 ops/s | **1.40x** |
|
|
90
|
+
| DEFLATE async | 0.270 ops/s | 0.73x |
|
|
91
|
+
| STORE async | 0.664 ops/s | **1.80x** |
|
|
92
|
+
| hucre | 0.369 ops/s | |
|
|
93
93
|
|
|
94
94
|
## License
|
|
95
95
|
|
|
@@ -14,7 +14,9 @@ declare class ContentTypes extends BaseXmlComponent {
|
|
|
14
14
|
addTheme(index?: number): void;
|
|
15
15
|
addChart(index: number): void;
|
|
16
16
|
addDrawing(index: number): void;
|
|
17
|
+
addImageType(extension: "png" | "jpeg"): void;
|
|
17
18
|
prepForXml(_context: Context): IXmlableObject;
|
|
19
|
+
toXml(_context: Context): string;
|
|
18
20
|
}
|
|
19
21
|
//#endregion
|
|
20
22
|
//#region src/file/core-properties.d.ts
|
|
@@ -31,6 +33,7 @@ declare class CoreProperties extends BaseXmlComponent {
|
|
|
31
33
|
private readonly options;
|
|
32
34
|
constructor(options: CorePropertiesOptions);
|
|
33
35
|
prepForXml(_context: Context): IXmlableObject;
|
|
36
|
+
toXml(_context: Context): string;
|
|
34
37
|
}
|
|
35
38
|
//#endregion
|
|
36
39
|
//#region src/file/media/media.d.ts
|
|
@@ -148,6 +151,7 @@ declare class WorkbookXml extends BaseXmlComponent {
|
|
|
148
151
|
private readonly sheets;
|
|
149
152
|
constructor(sheets: readonly SheetDefinition[]);
|
|
150
153
|
prepForXml(_context: Context): IXmlableObject;
|
|
154
|
+
toXml(_context: Context): string;
|
|
151
155
|
}
|
|
152
156
|
//#endregion
|
|
153
157
|
//#region src/file/worksheet.d.ts
|
|
@@ -346,4 +350,4 @@ declare const patchWorkbook: <T extends PatchDocumentOutputType = PatchDocumentO
|
|
|
346
350
|
}: PatchWorkbookOptions<T>) => Promise<OutputByType$1[T]>;
|
|
347
351
|
//#endregion
|
|
348
352
|
export { type AlignmentOptions, type BorderOptions, type BorderSideOptions, type CellOptions, type CellPatch, type ColumnOptions, type ConditionalFormatOptions, type CorePropertiesOptions, type DataValidationOptions, File, File as Workbook, type FillOptions, type FontOptions, type FreezePaneOptions, type IPatch, type InputDataType, type MergeCellOptions, type OutputByType, type OutputType, Packer, type PatchDocumentOutputType, PatchType, type PatchWorkbookOptions, type RowOptions, SharedStrings, type StyleOptions, Styles, type WorkbookOptions, type WorksheetChartOptions, type WorksheetOptions, type XlsxDocument, type XlsxPartRefs, columnToLetter, dateToSerialNumber, letterToColumn, parseWorkbook, parseXlsx, patchWorkbook };
|
|
349
|
-
//# sourceMappingURL=index.d.
|
|
353
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/file/content-types.ts","../src/file/core-properties.ts","../src/file/media/media.ts","../src/file/shared-strings.ts","../src/file/styles.ts","../src/file/theme.ts","../src/file/workbook.ts","../src/file/worksheet.ts","../src/file/file.ts","../src/export/packer/packer.ts","../src/util/index.ts","../src/parse.ts","../src/patcher.ts"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AppProperties, BaseXmlComponent, ChartCollection, ChartSpace, Formatter, IgnoreIfEmptyXmlComponent, OoxmlMimeType, Relationships, buildCorePropertiesXml, compileMapping, createPacker, parseArchive, parseCorePropsElement, strFromU8, toJson, unzipSync, zipAndConvert } from "@office-open/core";
|
|
1
|
+
import { AppProperties, BaseXmlComponent, ChartCollection, ChartSpace, Formatter, IgnoreIfEmptyXmlComponent, OoxmlMimeType, Relationships, buildCorePropertiesXml, buildCorePropertiesXmlString, compileMapping, createPacker, parseArchive, parseCorePropsElement, strFromU8, toJson, unzipSync, zipAndConvert } from "@office-open/core";
|
|
2
2
|
import { attr, attrNum, attrs, escapeXml, findChild, js2xml, selfCloseElement, textOf } from "@office-open/xml";
|
|
3
3
|
import { toUint8Array } from "undio";
|
|
4
4
|
//#region src/file/content-types.ts
|
|
@@ -13,7 +13,7 @@ const XLSX_STYLES = "application/vnd.openxmlformats-officedocument.spreadsheetml
|
|
|
13
13
|
const XLSX_SHARED_STRINGS = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
|
|
14
14
|
const XLSX_THEME = "application/vnd.openxmlformats-officedocument.theme+xml";
|
|
15
15
|
const XLSX_CHART = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
|
|
16
|
-
const
|
|
16
|
+
const STATIC_ENTRIES = [
|
|
17
17
|
{
|
|
18
18
|
type: "Default",
|
|
19
19
|
contentType: "application/vnd.openxmlformats-package.relationships+xml",
|
|
@@ -24,16 +24,6 @@ const STATIC_CHILDREN = [{ _attr: { xmlns: "http://schemas.openxmlformats.org/pa
|
|
|
24
24
|
contentType: "application/xml",
|
|
25
25
|
key: "xml"
|
|
26
26
|
},
|
|
27
|
-
{
|
|
28
|
-
type: "Default",
|
|
29
|
-
contentType: "image/png",
|
|
30
|
-
key: "png"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
type: "Default",
|
|
34
|
-
contentType: "image/jpeg",
|
|
35
|
-
key: "jpeg"
|
|
36
|
-
},
|
|
37
27
|
{
|
|
38
28
|
type: "Override",
|
|
39
29
|
contentType: XLSX_MAIN,
|
|
@@ -49,7 +39,8 @@ const STATIC_CHILDREN = [{ _attr: { xmlns: "http://schemas.openxmlformats.org/pa
|
|
|
49
39
|
contentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml",
|
|
50
40
|
key: "/docProps/app.xml"
|
|
51
41
|
}
|
|
52
|
-
]
|
|
42
|
+
];
|
|
43
|
+
const STATIC_CHILDREN = [{ _attr: { xmlns: "http://schemas.openxmlformats.org/package/2006/content-types" } }, ...STATIC_ENTRIES.map((e) => {
|
|
53
44
|
if (e.type === "Default") return { Default: { _attr: {
|
|
54
45
|
ContentType: e.contentType,
|
|
55
46
|
Extension: e.key
|
|
@@ -59,6 +50,7 @@ const STATIC_CHILDREN = [{ _attr: { xmlns: "http://schemas.openxmlformats.org/pa
|
|
|
59
50
|
PartName: e.key
|
|
60
51
|
} } };
|
|
61
52
|
})];
|
|
53
|
+
const STATIC_XML = STATIC_ENTRIES.map((e) => e.type === "Default" ? `<Default ContentType="${e.contentType}" Extension="${e.key}"/>` : `<Override ContentType="${e.contentType}" PartName="${e.key}"/>`).join("");
|
|
62
54
|
var ContentTypes = class extends BaseXmlComponent {
|
|
63
55
|
dynamicEntries = [];
|
|
64
56
|
constructor() {
|
|
@@ -106,6 +98,15 @@ var ContentTypes = class extends BaseXmlComponent {
|
|
|
106
98
|
key: `/xl/drawings/drawing${index}.xml`
|
|
107
99
|
});
|
|
108
100
|
}
|
|
101
|
+
addImageType(extension) {
|
|
102
|
+
const contentType = extension === "png" ? "image/png" : "image/jpeg";
|
|
103
|
+
if (this.dynamicEntries.some((e) => e.type === "Default" && e.key === extension)) return;
|
|
104
|
+
this.dynamicEntries.push({
|
|
105
|
+
type: "Default",
|
|
106
|
+
contentType,
|
|
107
|
+
key: extension
|
|
108
|
+
});
|
|
109
|
+
}
|
|
109
110
|
prepForXml(_context) {
|
|
110
111
|
const children = [...STATIC_CHILDREN];
|
|
111
112
|
for (const e of this.dynamicEntries) if (e.type === "Default") children.push({ Default: { _attr: {
|
|
@@ -118,6 +119,13 @@ var ContentTypes = class extends BaseXmlComponent {
|
|
|
118
119
|
} } });
|
|
119
120
|
return { Types: children };
|
|
120
121
|
}
|
|
122
|
+
toXml(_context) {
|
|
123
|
+
const p = ["<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">", STATIC_XML];
|
|
124
|
+
for (const e of this.dynamicEntries) if (e.type === "Default") p.push(`<Default ContentType="${e.contentType}" Extension="${e.key}"/>`);
|
|
125
|
+
else p.push(`<Override ContentType="${e.contentType}" PartName="${e.key}"/>`);
|
|
126
|
+
p.push("</Types>");
|
|
127
|
+
return p.join("");
|
|
128
|
+
}
|
|
121
129
|
};
|
|
122
130
|
//#endregion
|
|
123
131
|
//#region src/file/core-properties.ts
|
|
@@ -135,6 +143,9 @@ var CoreProperties = class extends BaseXmlComponent {
|
|
|
135
143
|
prepForXml(_context) {
|
|
136
144
|
return buildCorePropertiesXml(this.options);
|
|
137
145
|
}
|
|
146
|
+
toXml(_context) {
|
|
147
|
+
return buildCorePropertiesXmlString(this.options);
|
|
148
|
+
}
|
|
138
149
|
};
|
|
139
150
|
//#endregion
|
|
140
151
|
//#region src/file/media/media.ts
|
|
@@ -356,7 +367,7 @@ var Styles = class extends BaseXmlComponent {
|
|
|
356
367
|
for (const f of this.fills) {
|
|
357
368
|
const patternAttrs = attrs({ patternType: f.patternType ?? "solid" });
|
|
358
369
|
const fgColor = f.color ? `<fgColor rgb="FF${f.color}"/>` : "";
|
|
359
|
-
p.push(`<fill><patternFill${patternAttrs}>${fgColor}</patternFill></fill>`);
|
|
370
|
+
p.push(fgColor ? `<fill><patternFill${patternAttrs}>${fgColor}</patternFill></fill>` : `<fill><patternFill${patternAttrs}/></fill>`);
|
|
360
371
|
}
|
|
361
372
|
p.push("</fills>");
|
|
362
373
|
p.push(`<borders count="${this.borders.length}">`);
|
|
@@ -369,17 +380,21 @@ var Styles = class extends BaseXmlComponent {
|
|
|
369
380
|
numFmtId: xf.numFmtId,
|
|
370
381
|
fontId: xf.fontId,
|
|
371
382
|
fillId: xf.fillId,
|
|
372
|
-
borderId: xf.borderId
|
|
383
|
+
borderId: xf.borderId,
|
|
384
|
+
xfId: 0
|
|
373
385
|
};
|
|
374
386
|
if (xf.alignment) xAttrs.applyAlignment = 1;
|
|
375
387
|
if (xf.fontId > 0) xAttrs.applyFont = 1;
|
|
376
388
|
if (xf.fillId > 0) xAttrs.applyFill = 1;
|
|
377
389
|
if (xf.borderId > 0) xAttrs.applyBorder = 1;
|
|
378
390
|
const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : "";
|
|
379
|
-
p.push(`<xf${attrs(xAttrs)}>${alignStr}</xf>`);
|
|
391
|
+
p.push(alignStr ? `<xf${attrs(xAttrs)}>${alignStr}</xf>` : `<xf${attrs(xAttrs)}/>`);
|
|
380
392
|
}
|
|
381
393
|
p.push("</cellXfs>");
|
|
382
394
|
p.push("<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>");
|
|
395
|
+
p.push("<dxfs count=\"0\"/>");
|
|
396
|
+
p.push("<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>");
|
|
397
|
+
p.push("<extLst/>");
|
|
383
398
|
p.push("</styleSheet>");
|
|
384
399
|
return p.join("");
|
|
385
400
|
}
|
|
@@ -445,6 +460,13 @@ var Styles = class extends BaseXmlComponent {
|
|
|
445
460
|
xfId: 0,
|
|
446
461
|
builtinId: 0
|
|
447
462
|
} }] }] });
|
|
463
|
+
children.push({ dxfs: { _attr: { count: 0 } } });
|
|
464
|
+
children.push({ tableStyles: { _attr: {
|
|
465
|
+
count: 0,
|
|
466
|
+
defaultTableStyle: "TableStyleMedium2",
|
|
467
|
+
defaultPivotStyle: "PivotStyleLight16"
|
|
468
|
+
} } });
|
|
469
|
+
children.push({ extLst: [] });
|
|
448
470
|
return { styleSheet: children };
|
|
449
471
|
}
|
|
450
472
|
buildFonts() {
|
|
@@ -572,10 +594,33 @@ var WorkbookXml = class extends BaseXmlComponent {
|
|
|
572
594
|
if (s.state && s.state !== "visible") attrs.state = s.state;
|
|
573
595
|
sheetElements.push({ sheet: { _attr: attrs } });
|
|
574
596
|
}
|
|
575
|
-
return { workbook: [
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
597
|
+
return { workbook: [
|
|
598
|
+
{ _attr: {
|
|
599
|
+
xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
|
600
|
+
"xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
|
601
|
+
} },
|
|
602
|
+
{ bookViews: [{ workbookView: { _attr: {
|
|
603
|
+
xWindow: 0,
|
|
604
|
+
yWindow: 0,
|
|
605
|
+
windowWidth: 28800,
|
|
606
|
+
windowHeight: 12300
|
|
607
|
+
} } }] },
|
|
608
|
+
{ sheets: sheetElements },
|
|
609
|
+
{ calcPr: { _attr: { calcId: 191029 } } }
|
|
610
|
+
] };
|
|
611
|
+
}
|
|
612
|
+
toXml(_context) {
|
|
613
|
+
const p = [
|
|
614
|
+
"<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">",
|
|
615
|
+
"<bookViews><workbookView xWindow=\"0\" yWindow=\"0\" windowWidth=\"28800\" windowHeight=\"12300\"/></bookViews>",
|
|
616
|
+
"<sheets>"
|
|
617
|
+
];
|
|
618
|
+
for (const s of this.sheets) {
|
|
619
|
+
const stateAttr = s.state && s.state !== "visible" ? ` state="${s.state}"` : "";
|
|
620
|
+
p.push(`<sheet name="${escapeXml(s.name)}" sheetId="${s.sheetId}" r:id="${s.rId}"${stateAttr}/>`);
|
|
621
|
+
}
|
|
622
|
+
p.push("</sheets><calcPr calcId=\"191029\"/></workbook>");
|
|
623
|
+
return p.join("");
|
|
579
624
|
}
|
|
580
625
|
};
|
|
581
626
|
//#endregion
|
|
@@ -621,6 +666,13 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
621
666
|
xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
|
622
667
|
"xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
|
623
668
|
} }];
|
|
669
|
+
const maxRow = this.rows.length;
|
|
670
|
+
let maxCol = 0;
|
|
671
|
+
for (const row of this.rows) if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;
|
|
672
|
+
if (maxRow > 0 && maxCol > 0) {
|
|
673
|
+
const dimRef = `A1:${this.defaultCellRef(maxRow, maxCol)}`;
|
|
674
|
+
children.push({ dimension: { _attr: { ref: dimRef } } });
|
|
675
|
+
}
|
|
624
676
|
if (this.freezePanes) {
|
|
625
677
|
const fp = this.freezePanes;
|
|
626
678
|
const ySplit = fp.row ? fp.row : 0;
|
|
@@ -638,7 +690,11 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
638
690
|
tabSelected: 1,
|
|
639
691
|
workbookViewId: 0
|
|
640
692
|
} }, { pane: { _attr: attr } }] }] });
|
|
641
|
-
}
|
|
693
|
+
} else children.push({ sheetViews: [{ sheetView: [{ _attr: {
|
|
694
|
+
tabSelected: 1,
|
|
695
|
+
workbookViewId: 0
|
|
696
|
+
} }] }] });
|
|
697
|
+
children.push({ sheetFormatPr: { _attr: { defaultRowHeight: 15 } } });
|
|
642
698
|
if (this.columns.length > 0) {
|
|
643
699
|
const colElements = [];
|
|
644
700
|
for (const col of this.columns) {
|
|
@@ -721,6 +777,14 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
721
777
|
}
|
|
722
778
|
children.push({ dataValidations: dvElements });
|
|
723
779
|
}
|
|
780
|
+
children.push({ pageMargins: { _attr: {
|
|
781
|
+
left: .75,
|
|
782
|
+
right: .75,
|
|
783
|
+
top: 1,
|
|
784
|
+
bottom: 1,
|
|
785
|
+
header: .5,
|
|
786
|
+
footer: .5
|
|
787
|
+
} } });
|
|
724
788
|
return { worksheet: children };
|
|
725
789
|
}
|
|
726
790
|
/**
|
|
@@ -732,6 +796,13 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
732
796
|
const sharedStrings = fileData?.sharedStrings;
|
|
733
797
|
const styles = fileData?.styles;
|
|
734
798
|
const p = ["<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">"];
|
|
799
|
+
const maxRow = this.rows.length;
|
|
800
|
+
let maxCol = 0;
|
|
801
|
+
for (const row of this.rows) if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;
|
|
802
|
+
if (maxRow > 0 && maxCol > 0) {
|
|
803
|
+
const dimRef = `A1:${this.defaultCellRef(maxRow, maxCol)}`;
|
|
804
|
+
p.push(`<dimension ref="${dimRef}"/>`);
|
|
805
|
+
}
|
|
735
806
|
if (this.freezePanes) {
|
|
736
807
|
const fp = this.freezePanes;
|
|
737
808
|
const ySplit = fp.row ? fp.row : 0;
|
|
@@ -741,7 +812,8 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
741
812
|
const topLeftCell = this.defaultCellRef(topRow, leftCol);
|
|
742
813
|
const activePane = ySplit > 0 && xSplit > 0 ? "bottomRight" : ySplit > 0 ? "bottomLeft" : "topRight";
|
|
743
814
|
p.push("<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\">", `<pane ySplit="${ySplit}" xSplit="${xSplit}" topLeftCell="${topLeftCell}" activePane="${activePane}" state="frozen"/>`, "</sheetView></sheetViews>");
|
|
744
|
-
}
|
|
815
|
+
} else p.push("<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>");
|
|
816
|
+
p.push("<sheetFormatPr defaultRowHeight=\"15\"/>");
|
|
745
817
|
if (this.columns.length > 0) {
|
|
746
818
|
p.push("<cols>");
|
|
747
819
|
for (const col of this.columns) {
|
|
@@ -777,7 +849,7 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
777
849
|
if (cellStr) rowParts.push(cellStr);
|
|
778
850
|
}
|
|
779
851
|
p.push(`<row${attrs(rowAttrs)}>`, ...rowParts, "</row>");
|
|
780
|
-
} else p.push(`<row${attrs(rowAttrs)}
|
|
852
|
+
} else p.push(`<row${attrs(rowAttrs)}/>`);
|
|
781
853
|
}
|
|
782
854
|
p.push("</sheetData>");
|
|
783
855
|
if (this.autoFilter) p.push(selfCloseElement("autoFilter", attrs({ ref: this.autoFilter })));
|
|
@@ -828,6 +900,7 @@ var Worksheet = class extends IgnoreIfEmptyXmlComponent {
|
|
|
828
900
|
}
|
|
829
901
|
p.push("</dataValidations>");
|
|
830
902
|
}
|
|
903
|
+
p.push("<pageMargins left=\"0.75\" right=\"0.75\" top=\"1\" bottom=\"1\" header=\"0.5\" footer=\"0.5\"/>");
|
|
831
904
|
p.push("</worksheet>");
|
|
832
905
|
return p.join("");
|
|
833
906
|
}
|
|
@@ -1051,6 +1124,20 @@ var Drawing = class extends BaseXmlComponent {
|
|
|
1051
1124
|
{ rowOff: [0] }
|
|
1052
1125
|
] };
|
|
1053
1126
|
}
|
|
1127
|
+
toXml(_context) {
|
|
1128
|
+
const p = [`<wsDr xmlns="${XDR_NS}" xmlns:a="${A_NS}" xmlns:r="${R_NS}">`];
|
|
1129
|
+
let id = 1;
|
|
1130
|
+
for (const img of this.images) {
|
|
1131
|
+
p.push(`<twoCellAnchor editAs="oneCell"><from><col>${img.col - 1}</col><colOff>${img.colOffset ?? 0}</colOff><row>${img.row - 1}</row><rowOff>${img.rowOffset ?? 0}</rowOff></from>`, `<to><col>${img.col}</col><colOff>0</colOff><row>${img.row}</row><rowOff>0</rowOff></to>`, `<pic><nvPicPr><cNvPr id="${id}" name="Picture ${id}"/><cNvPicPr preferRelativeResize="1"/></nvPicPr>`, `<blipFill><a:blip r:embed="${img.rId}"/><a:stretch><a:fillRect/></a:stretch></blipFill>`, `<spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="400000" cy="300000"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></spPr></pic>`, `<clientData/></twoCellAnchor>`);
|
|
1132
|
+
id++;
|
|
1133
|
+
}
|
|
1134
|
+
for (const chart of this.charts) {
|
|
1135
|
+
p.push(`<twoCellAnchor editAs="oneCell"><from><col>${chart.col - 1}</col><colOff>${chart.colOffset ?? 0}</colOff><row>${chart.row - 1}</row><rowOff>${chart.rowOffset ?? 0}</rowOff></from>`, `<to><col>${chart.col + 8}</col><colOff>0</colOff><row>${chart.row + 15}</row><rowOff>0</rowOff></to>`, `<graphicFrame><nvGraphicFramePr><cNvPr id="${id}" name="Chart ${id}"/><cNvGraphicFramePr><a:graphicFrameLocks noGrp="1"/></cNvGraphicFramePr></nvGraphicFramePr>`, `<xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/></xfrm>`, `<a:graphic><a:graphicData uri="${C_URI}"><c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="${R_NS}" r:id="${chart.rId}"/></a:graphicData></a:graphic></graphicFrame>`, `<clientData/></twoCellAnchor>`);
|
|
1136
|
+
id++;
|
|
1137
|
+
}
|
|
1138
|
+
p.push("</wsDr>");
|
|
1139
|
+
return p.join("");
|
|
1140
|
+
}
|
|
1054
1141
|
buildImageAnchor(img, id) {
|
|
1055
1142
|
return { twoCellAnchor: [
|
|
1056
1143
|
{ _attr: { editAs: "oneCell" } },
|
|
@@ -1116,13 +1203,13 @@ var Compiler = class {
|
|
|
1116
1203
|
};
|
|
1117
1204
|
const f = this.formatter;
|
|
1118
1205
|
const mapping = {};
|
|
1119
|
-
const fmt = (component
|
|
1206
|
+
const fmt = (component) => f.formatToXml(component, context);
|
|
1120
1207
|
mapping["Properties"] = {
|
|
1121
|
-
data: fmt(file.coreProperties
|
|
1208
|
+
data: fmt(file.coreProperties),
|
|
1122
1209
|
path: "docProps/core.xml"
|
|
1123
1210
|
};
|
|
1124
1211
|
mapping["AppProperties"] = {
|
|
1125
|
-
data: fmt(file.appProperties
|
|
1212
|
+
data: fmt(file.appProperties),
|
|
1126
1213
|
path: "docProps/app.xml"
|
|
1127
1214
|
};
|
|
1128
1215
|
mapping["FileRelationships"] = {
|
|
@@ -1130,7 +1217,7 @@ var Compiler = class {
|
|
|
1130
1217
|
path: "_rels/.rels"
|
|
1131
1218
|
};
|
|
1132
1219
|
mapping["Workbook"] = {
|
|
1133
|
-
data: fmt(file.workbookXml
|
|
1220
|
+
data: fmt(file.workbookXml),
|
|
1134
1221
|
path: "xl/workbook.xml"
|
|
1135
1222
|
};
|
|
1136
1223
|
mapping["WorkbookRelationships"] = {
|
|
@@ -1144,7 +1231,7 @@ var Compiler = class {
|
|
|
1144
1231
|
const ws = worksheets[i];
|
|
1145
1232
|
const imgOpts = ws.imageOptions;
|
|
1146
1233
|
const chartOpts = ws.charts;
|
|
1147
|
-
let sheetXml = fmt(ws
|
|
1234
|
+
let sheetXml = fmt(ws);
|
|
1148
1235
|
if (imgOpts.length > 0 || chartOpts.length > 0) {
|
|
1149
1236
|
const drawingImages = [];
|
|
1150
1237
|
const drawingCharts = [];
|
|
@@ -1187,7 +1274,7 @@ var Compiler = class {
|
|
|
1187
1274
|
const drawing = new Drawing(drawingImages, drawingCharts);
|
|
1188
1275
|
const drawingIdx = i + 1;
|
|
1189
1276
|
mapping[`Drawing${i}`] = {
|
|
1190
|
-
data: fmt(drawing
|
|
1277
|
+
data: fmt(drawing),
|
|
1191
1278
|
path: `xl/drawings/drawing${drawingIdx}.xml`
|
|
1192
1279
|
};
|
|
1193
1280
|
mapping[`DrawingRels${i}`] = {
|
|
@@ -1210,33 +1297,43 @@ var Compiler = class {
|
|
|
1210
1297
|
}
|
|
1211
1298
|
const sharedStrings = file.sharedStrings;
|
|
1212
1299
|
if (sharedStrings.count > 0) mapping["SharedStrings"] = {
|
|
1213
|
-
data: fmt(sharedStrings
|
|
1300
|
+
data: fmt(sharedStrings),
|
|
1214
1301
|
path: "xl/sharedStrings.xml"
|
|
1215
1302
|
};
|
|
1216
1303
|
mapping["Styles"] = {
|
|
1217
|
-
data: fmt(file.styles
|
|
1304
|
+
data: fmt(file.styles),
|
|
1218
1305
|
path: "xl/styles.xml"
|
|
1219
1306
|
};
|
|
1220
1307
|
mapping["Theme"] = {
|
|
1221
|
-
data: fmt(file.theme
|
|
1308
|
+
data: fmt(file.theme),
|
|
1222
1309
|
path: "xl/theme/theme1.xml"
|
|
1223
1310
|
};
|
|
1224
1311
|
for (let i = 0; i < file.charts.array.length; i++) {
|
|
1225
1312
|
const chartData = file.charts.array[i];
|
|
1226
1313
|
mapping[`Chart${i}`] = {
|
|
1227
|
-
data: fmt(chartData.chartSpace
|
|
1314
|
+
data: fmt(chartData.chartSpace),
|
|
1228
1315
|
path: `xl/charts/chart${i + 1}.xml`
|
|
1229
1316
|
};
|
|
1230
1317
|
file.contentTypes.addChart(i + 1);
|
|
1231
1318
|
}
|
|
1319
|
+
const imageExts = /* @__PURE__ */ new Set();
|
|
1320
|
+
for (const img of file.media.array) {
|
|
1321
|
+
const ext = img.fileName.endsWith(".png") ? "png" : "jpeg";
|
|
1322
|
+
if (!imageExts.has(ext)) {
|
|
1323
|
+
imageExts.add(ext);
|
|
1324
|
+
file.contentTypes.addImageType(ext);
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1232
1327
|
mapping["ContentTypes"] = {
|
|
1233
1328
|
data: fmt(file.contentTypes),
|
|
1234
1329
|
path: "[Content_Types].xml"
|
|
1235
1330
|
};
|
|
1236
|
-
|
|
1331
|
+
const mediaFiles = [];
|
|
1332
|
+
for (const img of file.media.array) mediaFiles.push({
|
|
1237
1333
|
data: img.data,
|
|
1238
1334
|
path: `xl/media/${img.fileName}`
|
|
1239
|
-
})
|
|
1335
|
+
});
|
|
1336
|
+
return compileMapping(mapping, overrides, mediaFiles);
|
|
1240
1337
|
}
|
|
1241
1338
|
};
|
|
1242
1339
|
//#endregion
|
|
@@ -1625,4 +1722,4 @@ function findLocalChild(parent, name) {
|
|
|
1625
1722
|
//#endregion
|
|
1626
1723
|
export { File, File as Workbook, Packer, PatchType, SharedStrings, Styles, columnToLetter, dateToSerialNumber, letterToColumn, parseWorkbook, parseXlsx, patchWorkbook };
|
|
1627
1724
|
|
|
1628
|
-
//# sourceMappingURL=index.
|
|
1725
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["localName"],"sources":["../src/file/content-types.ts","../src/file/core-properties.ts","../src/file/media/media.ts","../src/file/shared-strings.ts","../src/file/styles.ts","../src/file/theme.ts","../src/file/workbook.ts","../src/file/worksheet.ts","../src/file/file.ts","../src/file/drawing/drawing.ts","../src/export/packer/next-compiler.ts","../src/export/packer/packer.ts","../src/util/index.ts","../src/parse.ts","../src/patcher.ts"],"sourcesContent":["/**\n * Content Types module for XLSX packages.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\nconst XLSX_MAIN = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\";\nconst XLSX_WORKSHEET = \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst XLSX_STYLES = \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\";\nconst XLSX_SHARED_STRINGS =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\";\nconst XLSX_THEME = \"application/vnd.openxmlformats-officedocument.theme+xml\";\nconst XLSX_CHART = \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\";\n\ntype EntryType = \"Default\" | \"Override\";\n\ninterface ContentEntry {\n readonly type: EntryType;\n readonly contentType: string;\n readonly key: string;\n}\n\nconst STATIC_ENTRIES: readonly ContentEntry[] = [\n {\n type: \"Default\",\n contentType: \"application/vnd.openxmlformats-package.relationships+xml\",\n key: \"rels\",\n },\n { type: \"Default\", contentType: \"application/xml\", key: \"xml\" },\n { type: \"Override\", contentType: XLSX_MAIN, key: \"/xl/workbook.xml\" },\n {\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-package.core-properties+xml\",\n key: \"/docProps/core.xml\",\n },\n {\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.extended-properties+xml\",\n key: \"/docProps/app.xml\",\n },\n];\n\nconst STATIC_CHILDREN: IXmlableObject[] = [\n { _attr: { xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\" } },\n ...STATIC_ENTRIES.map((e) => {\n if (e.type === \"Default\") {\n return { Default: { _attr: { ContentType: e.contentType, Extension: e.key } } };\n }\n return { Override: { _attr: { ContentType: e.contentType, PartName: e.key } } };\n }),\n];\n\n// Pre-compiled static XML fragment (module-level constant)\nconst STATIC_XML = STATIC_ENTRIES.map((e) =>\n e.type === \"Default\"\n ? `<Default ContentType=\"${e.contentType}\" Extension=\"${e.key}\"/>`\n : `<Override ContentType=\"${e.contentType}\" PartName=\"${e.key}\"/>`,\n).join(\"\");\n\nexport class ContentTypes extends BaseXmlComponent {\n private readonly dynamicEntries: ContentEntry[] = [];\n\n public constructor() {\n super(\"Types\");\n }\n\n public addWorksheet(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_WORKSHEET,\n key: `/xl/worksheets/sheet${index}.xml`,\n });\n }\n\n public addStyles(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_STYLES,\n key: \"/xl/styles.xml\",\n });\n }\n\n public addSharedStrings(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_SHARED_STRINGS,\n key: \"/xl/sharedStrings.xml\",\n });\n }\n\n public addTheme(index: number = 1): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_THEME,\n key: `/xl/theme/theme${index}.xml`,\n });\n }\n\n public addChart(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_CHART,\n key: `/xl/charts/chart${index}.xml`,\n });\n }\n\n public addDrawing(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.drawing+xml\",\n key: `/xl/drawings/drawing${index}.xml`,\n });\n }\n\n public addImageType(extension: \"png\" | \"jpeg\"): void {\n const contentType = extension === \"png\" ? \"image/png\" : \"image/jpeg\";\n // Avoid duplicates\n if (this.dynamicEntries.some((e) => e.type === \"Default\" && e.key === extension)) return;\n this.dynamicEntries.push({ type: \"Default\", contentType, key: extension });\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children = [...STATIC_CHILDREN];\n for (const e of this.dynamicEntries) {\n if (e.type === \"Default\") {\n children.push({\n Default: { _attr: { ContentType: e.contentType, Extension: e.key } },\n });\n } else {\n children.push({\n Override: { _attr: { ContentType: e.contentType, PartName: e.key } },\n });\n }\n }\n return { Types: children };\n }\n\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">',\n STATIC_XML,\n ];\n for (const e of this.dynamicEntries) {\n if (e.type === \"Default\") {\n p.push(`<Default ContentType=\"${e.contentType}\" Extension=\"${e.key}\"/>`);\n } else {\n p.push(`<Override ContentType=\"${e.contentType}\" PartName=\"${e.key}\"/>`);\n }\n }\n p.push(\"</Types>\");\n return p.join(\"\");\n }\n}\n","/**\n * Core Properties module for SpreadsheetML documents.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { buildCorePropertiesXml, buildCorePropertiesXmlString } from \"@office-open/core\";\n\nexport interface CorePropertiesOptions {\n readonly title?: string;\n readonly subject?: string;\n readonly creator?: string;\n readonly keywords?: string;\n readonly description?: string;\n readonly lastModifiedBy?: string;\n readonly revision?: number;\n}\n\nexport class CoreProperties extends BaseXmlComponent {\n private readonly options: CorePropertiesOptions;\n\n public constructor(options: CorePropertiesOptions) {\n super(\"cp:coreProperties\");\n this.options = options;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n return buildCorePropertiesXml(this.options);\n }\n\n public override toXml(_context: Context): string {\n return buildCorePropertiesXmlString(this.options);\n }\n}\n","/**\n * Media collection for XLSX files — stores image binary data.\n *\n * @module\n */\n\nexport interface MediaData {\n readonly fileName: string;\n readonly type: string;\n readonly data: Uint8Array;\n readonly width: number;\n readonly height: number;\n}\n\nexport class Media {\n private readonly map = new Map<string, MediaData>();\n\n public addImage(key: string, data: MediaData): void {\n this.map.set(key, data);\n }\n\n public get array(): readonly MediaData[] {\n return [...this.map.values()];\n }\n}\n","/**\n * Shared Strings Table — generates xl/sharedStrings.xml.\n *\n * XLSX stores repeated string values in a central table to reduce file size.\n * Cells reference strings by index into this table.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { escapeXml } from \"@office-open/xml\";\n\nexport class SharedStrings extends BaseXmlComponent {\n private readonly strings: string[] = [];\n private readonly indexMap = new Map<string, number>();\n\n public constructor() {\n super(\"sst\");\n }\n\n /**\n * Register a string and return its index.\n * Returns existing index if the string is already registered.\n */\n public register(s: string): number {\n const existing = this.indexMap.get(s);\n if (existing !== undefined) return existing;\n\n const idx = this.strings.length;\n this.strings.push(s);\n this.indexMap.set(s, idx);\n return idx;\n }\n\n public get count(): number {\n return this.strings.length;\n }\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${this.strings.length}\" uniqueCount=\"${this.indexMap.size}\">`,\n ];\n for (const s of this.strings) {\n p.push(`<si><t>${escapeXml(s)}</t></si>`);\n }\n p.push(\"</sst>\");\n return p.join(\"\");\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n count: this.strings.length,\n uniqueCount: this.indexMap.size,\n },\n },\n ];\n\n for (const s of this.strings) {\n children.push({ si: [{ t: [s] }] });\n }\n\n return { sst: children };\n }\n}\n","/**\n * Styles component — generates xl/styles.xml.\n *\n * XLSX uses an index-based style system: cells reference style entries\n * via the `s` attribute, which is an index into `cellXfs`.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { attrs, escapeXml } from \"@office-open/xml\";\n\n// ── Sub-style option interfaces ──\n\nexport interface FontOptions {\n readonly bold?: boolean;\n readonly italic?: boolean;\n readonly underline?: boolean;\n readonly strike?: boolean;\n readonly size?: number;\n readonly color?: string;\n readonly fontName?: string;\n}\n\nexport interface FillOptions {\n readonly type?: \"solid\" | \"pattern\";\n readonly color?: string;\n readonly patternType?: string;\n}\n\nexport interface BorderOptions {\n readonly style?: \"thin\" | \"medium\" | \"thick\" | \"dotted\" | \"dashed\" | \"hair\" | \"none\";\n readonly color?: string;\n}\n\nexport interface BorderSideOptions {\n readonly top?: BorderOptions;\n readonly bottom?: BorderOptions;\n readonly left?: BorderOptions;\n readonly right?: BorderOptions;\n readonly diagonal?: BorderOptions;\n}\n\nexport interface AlignmentOptions {\n readonly horizontal?: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\";\n readonly vertical?: \"top\" | \"center\" | \"bottom\";\n readonly wrapText?: boolean;\n readonly textRotation?: number;\n readonly indent?: number;\n}\n\nexport interface StyleOptions {\n readonly font?: FontOptions;\n readonly fill?: FillOptions;\n readonly border?: BorderSideOptions;\n readonly numFmt?: string;\n readonly alignment?: AlignmentOptions;\n}\n\n// ── Style key helpers for deduplication ──\n\nfunction fontKey(f: FontOptions): string {\n return `b${f.bold ? 1 : 0}i${f.italic ? 1 : 0}u${f.underline ? 1 : 0}s${f.strike ? 1 : 0}z${f.size ?? 0}c${f.color ?? \"\"}n${f.fontName ?? \"\"}`;\n}\n\nfunction fillKey(f: FillOptions): string {\n return `t${f.type ?? \"\"}c${f.color ?? \"\"}p${f.patternType ?? \"\"}`;\n}\n\nfunction borderKey(b: BorderSideOptions): string {\n const sk = (o?: BorderOptions) => `${o?.style ?? \"\"}_${o?.color ?? \"\"}`;\n return `t${sk(b.top)}b${sk(b.bottom)}l${sk(b.left)}r${sk(b.right)}d${sk(b.diagonal)}`;\n}\n\n// ── Built-in number format IDs ──\n\nconst BUILTIN_NUMFMTS: Record<string, number> = {\n General: 0,\n \"0\": 1,\n \"0.00\": 2,\n \"#,##0\": 3,\n \"#,##0.00\": 4,\n \"0%\": 9,\n \"0.00%\": 10,\n \"0.00E+00\": 11,\n \"mm-dd-yy\": 14,\n \"d-mmm-yy\": 15,\n \"d-mmm\": 16,\n \"mmm-yy\": 17,\n \"h:mm AM/PM\": 18,\n \"h:mm:ss AM/PM\": 19,\n \"h:mm\": 20,\n \"h:mm:ss\": 21,\n \"m/d/yy h:mm\": 22,\n \"#,##0 ;(#,##0)\": 37,\n \"#,##0 ;[Red](#,##0)\": 38,\n \"#,##0.00;(#,##0.00)\": 39,\n \"#,##0.00;[Red](#,##0.00)\": 40,\n \"mm:ss\": 45,\n \"[h]:mm:ss\": 46,\n \"mmss.0\": 47,\n \"##0.0E+0\": 48,\n \"@\": 49,\n};\n\nexport class Styles extends BaseXmlComponent {\n private readonly fonts: FontOptions[] = [\n { size: 11, fontName: \"Calibri\" }, // default font (index 0)\n ];\n private readonly fontKeys = new Map<string, number>();\n\n private readonly fills: FillOptions[] = [\n { patternType: \"none\" }, // default fill (index 0)\n { patternType: \"gray125\" }, // required fill (index 1)\n ];\n private readonly fillKeys = new Map<string, number>();\n\n private readonly borders: BorderSideOptions[] = [\n {}, // default empty border (index 0)\n ];\n private readonly borderKeys = new Map<string, number>();\n\n private readonly customNumFmts = new Map<string, number>();\n private nextCustomNumFmtId = 164; // custom numFmts start at 164\n\n private readonly cellXfs: Array<{\n readonly fontId: number;\n readonly fillId: number;\n readonly borderId: number;\n readonly numFmtId: number;\n readonly alignment?: AlignmentOptions;\n }> = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // default xf (index 0)\n ];\n private readonly cellXfKeys = new Map<string, number>();\n\n public constructor() {\n super(\"styleSheet\");\n\n // Pre-register default font/fill/border keys\n this.fontKeys.set(fontKey(this.fonts[0]), 0);\n this.fillKeys.set(fillKey(this.fills[0]), 0);\n this.fillKeys.set(fillKey(this.fills[1]), 1);\n this.borderKeys.set(borderKey(this.borders[0]), 0);\n this.cellXfKeys.set(this.cellXfKey(this.cellXfs[0]), 0);\n }\n\n /**\n * Register a style and return its index (for the cell `s` attribute).\n * Deduplicates across fonts, fills, borders, numFmts, and cellXfs.\n */\n public register(opts: StyleOptions): number {\n const fontId = this.registerFont(opts.font);\n const fillId = this.registerFill(opts.fill);\n const borderId = this.registerBorder(opts.border);\n const numFmtId = this.registerNumFmt(opts.numFmt);\n\n const xf = {\n fontId,\n fillId,\n borderId,\n numFmtId,\n alignment: opts.alignment,\n };\n\n const key = this.cellXfKey(xf);\n const existing = this.cellXfKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(xf);\n this.cellXfKeys.set(key, idx);\n return idx;\n }\n\n private registerFont(opts?: FontOptions): number {\n if (!opts) return 0;\n const key = fontKey(opts);\n const existing = this.fontKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fonts.length;\n this.fonts.push(opts);\n this.fontKeys.set(key, idx);\n return idx;\n }\n\n private registerFill(opts?: FillOptions): number {\n if (!opts) return 0;\n const key = fillKey(opts);\n const existing = this.fillKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fills.length;\n this.fills.push(opts);\n this.fillKeys.set(key, idx);\n return idx;\n }\n\n private registerBorder(opts?: BorderSideOptions): number {\n if (!opts) return 0;\n const key = borderKey(opts);\n const existing = this.borderKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.borders.length;\n this.borders.push(opts);\n this.borderKeys.set(key, idx);\n return idx;\n }\n\n private registerNumFmt(fmt?: string): number {\n if (!fmt) return 0;\n const builtin = BUILTIN_NUMFMTS[fmt];\n if (builtin !== undefined) return builtin;\n\n const existing = this.customNumFmts.get(fmt);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.customNumFmts.set(fmt, id);\n return id;\n }\n\n private cellXfKey(xf: {\n readonly fontId: number;\n readonly fillId: number;\n readonly borderId: number;\n readonly numFmtId: number;\n readonly alignment?: AlignmentOptions;\n }): string {\n const a = xf.alignment;\n const ak = a\n ? `h${a.horizontal ?? \"\"}v${a.vertical ?? \"\"}w${a.wrapText ? 1 : 0}r${a.textRotation ?? \"\"}i${a.indent ?? \"\"}`\n : \"\";\n return `${xf.fontId}|${xf.fillId}|${xf.borderId}|${xf.numFmtId}|${ak}`;\n }\n\n // ── XML generation ──\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n p.push(`<numFmts count=\"${this.customNumFmts.size}\">`);\n for (const [fmt, id] of this.customNumFmts) {\n p.push(`<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXml(fmt)}\"/>`);\n }\n p.push(\"</numFmts>\");\n }\n\n // fonts\n p.push(`<fonts count=\"${this.fonts.length}\">`);\n for (const f of this.fonts) {\n p.push(`<font>${this.fontXmlStr(f)}</font>`);\n }\n p.push(\"</fonts>\");\n\n // fills\n p.push(`<fills count=\"${this.fills.length}\">`);\n for (const f of this.fills) {\n const patternAttrs = attrs({ patternType: f.patternType ?? \"solid\" });\n const fgColor = f.color ? `<fgColor rgb=\"FF${f.color}\"/>` : \"\";\n p.push(\n fgColor\n ? `<fill><patternFill${patternAttrs}>${fgColor}</patternFill></fill>`\n : `<fill><patternFill${patternAttrs}/></fill>`,\n );\n }\n p.push(\"</fills>\");\n\n // borders\n p.push(`<borders count=\"${this.borders.length}\">`);\n for (const b of this.borders) {\n p.push(`<border>${this.borderXmlStr(b)}</border>`);\n }\n p.push(\"</borders>\");\n\n // cellStyleXfs\n p.push(\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>',\n );\n\n // cellXfs\n p.push(`<cellXfs count=\"${this.cellXfs.length}\">`);\n for (const xf of this.cellXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n xfId: 0,\n };\n if (xf.alignment) xAttrs.applyAlignment = 1;\n if (xf.fontId > 0) xAttrs.applyFont = 1;\n if (xf.fillId > 0) xAttrs.applyFill = 1;\n if (xf.borderId > 0) xAttrs.applyBorder = 1;\n\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n p.push(alignStr ? `<xf${attrs(xAttrs)}>${alignStr}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellXfs>\");\n\n // cellStyles\n p.push('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n\n // dxfs and tableStyles (required by Excel)\n p.push('<dxfs count=\"0\"/>');\n p.push(\n '<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>',\n );\n p.push(\"<extLst/>\");\n\n p.push(\"</styleSheet>\");\n return p.join(\"\");\n }\n\n private fontXmlStr(f: FontOptions): string {\n const parts: string[] = [];\n if (f.bold) parts.push(\"<b/>\");\n if (f.italic) parts.push(\"<i/>\");\n if (f.underline) parts.push(\"<u/>\");\n if (f.strike) parts.push(\"<strike/>\");\n if (f.size) parts.push(`<sz val=\"${f.size}\"/>`);\n if (f.color) parts.push(`<color rgb=\"FF${f.color}\"/>`);\n if (f.fontName) parts.push(`<name val=\"${escapeXml(f.fontName)}\"/>`);\n return parts.join(\"\");\n }\n\n private borderXmlStr(b: BorderSideOptions): string {\n const parts: string[] = [];\n for (const side of [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const) {\n const opts = b[side] as BorderOptions | undefined;\n if (opts && opts.style && opts.style !== \"none\") {\n const colorStr = opts.color ? `<color rgb=\"FF${opts.color}\"/>` : \"\";\n parts.push(`<${side} style=\"${opts.style}\">${colorStr}</${side}>`);\n } else {\n parts.push(`<${side}/>`);\n }\n }\n return parts.join(\"\");\n }\n\n private alignmentXmlStr(a: AlignmentOptions): string {\n const aAttrs: Record<string, string | number | boolean | undefined> = {};\n if (a.horizontal) aAttrs.horizontal = a.horizontal;\n if (a.vertical) aAttrs.vertical = a.vertical;\n if (a.wrapText) aAttrs.wrapText = 1;\n if (a.textRotation !== undefined) aAttrs.textRotation = a.textRotation;\n if (a.indent !== undefined) aAttrs.indent = a.indent;\n return `<alignment${attrs(aAttrs)}/>`;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n },\n },\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n const fmtElements: IXmlableObject[] = [{ _attr: { count: this.customNumFmts.size } }];\n for (const [fmt, id] of this.customNumFmts) {\n fmtElements.push({\n numFmt: { _attr: { numFmtId: id, formatCode: fmt } },\n });\n }\n children.push({ numFmts: fmtElements });\n }\n\n // fonts\n children.push(this.buildFonts());\n\n // fills\n children.push(this.buildFills());\n\n // borders\n children.push(this.buildBorders());\n\n // cellStyleXfs\n children.push({\n cellStyleXfs: [\n { _attr: { count: 1 } },\n { xf: [{ _attr: { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 } }] },\n ],\n });\n\n // cellXfs\n children.push(this.buildCellXfs());\n\n // cellStyles\n children.push({\n cellStyles: [\n { _attr: { count: 1 } },\n { cellStyle: [{ _attr: { name: \"Normal\", xfId: 0, builtinId: 0 } }] },\n ],\n });\n\n // dxfs, tableStyles, extLst (required by Excel)\n children.push({ dxfs: { _attr: { count: 0 } } });\n children.push({\n tableStyles: {\n _attr: {\n count: 0,\n defaultTableStyle: \"TableStyleMedium2\",\n defaultPivotStyle: \"PivotStyleLight16\",\n },\n },\n });\n children.push({ extLst: [] });\n\n return { styleSheet: children };\n }\n\n private buildFonts(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.fonts.length } }];\n for (const f of this.fonts) {\n elements.push({ font: this.fontXml(f) });\n }\n return { fonts: elements };\n }\n\n private fontXml(f: FontOptions): IXmlableObject[] {\n const parts: IXmlableObject[] = [];\n if (f.bold) parts.push({ b: [] });\n if (f.italic) parts.push({ i: [] });\n if (f.underline) parts.push({ u: [] });\n if (f.strike) parts.push({ strike: [] });\n if (f.size) parts.push({ sz: [{ _attr: { val: f.size } }] });\n if (f.color) parts.push({ color: [{ _attr: { rgb: `FF${f.color}` } }] });\n if (f.fontName) parts.push({ name: [{ _attr: { val: f.fontName } }] });\n return parts;\n }\n\n private buildFills(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.fills.length } }];\n for (const f of this.fills) {\n elements.push({\n fill: [\n {\n patternFill: [\n { _attr: { patternType: f.patternType ?? \"solid\" } },\n ...(f.color ? [{ fgColor: [{ _attr: { rgb: `FF${f.color}` } }] }] : []),\n ],\n },\n ],\n });\n }\n return { fills: elements };\n }\n\n private buildBorders(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.borders.length } }];\n for (const b of this.borders) {\n elements.push({ border: this.borderXml(b) });\n }\n return { borders: elements };\n }\n\n private borderXml(b: BorderSideOptions): IXmlableObject[] {\n const parts: IXmlableObject[] = [];\n for (const side of [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const) {\n const opts = b[side] as BorderOptions | undefined;\n if (opts && opts.style && opts.style !== \"none\") {\n const attrs: Record<string, string> = { style: opts.style };\n const children: IXmlableObject[] = [{ _attr: attrs }];\n if (opts.color) {\n children.push({ color: [{ _attr: { rgb: `FF${opts.color}` } }] });\n }\n parts.push({ [side]: children });\n } else {\n parts.push({ [side]: [] });\n }\n }\n return parts;\n }\n\n private buildCellXfs(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.cellXfs.length } }];\n for (const xf of this.cellXfs) {\n const attrs: Record<string, string | number> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n };\n if (xf.alignment) {\n attrs.applyAlignment = 1;\n }\n if (xf.fontId > 0) attrs.applyFont = 1;\n if (xf.fillId > 0) attrs.applyFill = 1;\n if (xf.borderId > 0) attrs.applyBorder = 1;\n\n const children: IXmlableObject[] = [{ _attr: attrs }];\n if (xf.alignment) {\n children.push(this.alignmentXml(xf.alignment));\n }\n elements.push({ xf: children });\n }\n return { cellXfs: elements };\n }\n\n private alignmentXml(a: AlignmentOptions): IXmlableObject {\n const attrs: Record<string, string | number> = {};\n if (a.horizontal) attrs.horizontal = a.horizontal;\n if (a.vertical) attrs.vertical = a.vertical;\n if (a.wrapText) attrs.wrapText = 1;\n if (a.textRotation !== undefined) attrs.textRotation = a.textRotation;\n if (a.indent !== undefined) attrs.indent = a.indent;\n return { alignment: [{ _attr: attrs }] };\n }\n}\n","/**\n * Default theme for XLSX files — matches Microsoft Office's output structure.\n * Produces xl/theme/theme1.xml that Excel accepts without repair warnings.\n *\n * The theme XML is completely static — identical for every XLSX file.\n * Pre-serialized as a string constant to avoid building the IXmlableObject\n * tree and re-serializing on every compile.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\n// Pre-serialized theme XML. Generated once via xml(buildThemeObj()) and inlined.\n// To regenerate: run `pnpm tsx scripts/gen-theme.ts` from packages/xlsx.\nconst THEME_XML =\n '<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"5B9BD5\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"4472C4\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\" panose=\"020F0302020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\" panose=\"020F0502020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"103000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"100000\"/><a:satMod val=\"110000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"150000\"/><a:tint val=\"93000\"/><a:shade val=\"98000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"103000\"/><a:satMod val=\"130000\"/><a:tint val=\"98000\"/><a:shade val=\"90000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"120000\"/><a:shade val=\"63000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>';\n\nexport class DefaultTheme extends BaseXmlComponent {\n public constructor() {\n super(\"a:theme\");\n }\n\n /** Return pre-cached static theme XML — zero allocation. */\n public override toXml(_context: Context): string {\n return THEME_XML;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n // Re-expose the static XML as an IXmlableObject for backward compatibility.\n // This is only used if someone calls prepForXml() directly.\n return {\n \"a:theme\": [\n {\n _attr: {\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\",\n name: \"Office Theme\",\n },\n },\n ],\n };\n }\n}\n","/**\n * Workbook component — generates xl/workbook.xml.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { escapeXml } from \"@office-open/xml\";\n\nexport interface SheetDefinition {\n readonly name: string;\n readonly sheetId: number;\n readonly rId: string;\n readonly state?: \"visible\" | \"hidden\" | \"veryHidden\";\n}\n\nexport class WorkbookXml extends BaseXmlComponent {\n private readonly sheets: readonly SheetDefinition[];\n\n public constructor(sheets: readonly SheetDefinition[]) {\n super(\"workbook\");\n this.sheets = sheets;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const sheetElements: IXmlableObject[] = [];\n for (const s of this.sheets) {\n const attrs: Record<string, string> = {\n name: s.name,\n sheetId: String(s.sheetId),\n \"r:id\": s.rId,\n };\n if (s.state && s.state !== \"visible\") {\n attrs.state = s.state;\n }\n sheetElements.push({ sheet: { _attr: attrs } });\n }\n\n return {\n workbook: [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n },\n {\n bookViews: [\n {\n workbookView: {\n _attr: { xWindow: 0, yWindow: 0, windowWidth: 28800, windowHeight: 12300 },\n },\n },\n ],\n },\n { sheets: sheetElements },\n { calcPr: { _attr: { calcId: 191029 } } },\n ],\n };\n }\n\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n '<bookViews><workbookView xWindow=\"0\" yWindow=\"0\" windowWidth=\"28800\" windowHeight=\"12300\"/></bookViews>',\n \"<sheets>\",\n ];\n for (const s of this.sheets) {\n const stateAttr = s.state && s.state !== \"visible\" ? ` state=\"${s.state}\"` : \"\";\n p.push(\n `<sheet name=\"${escapeXml(s.name)}\" sheetId=\"${s.sheetId}\" r:id=\"${s.rId}\"${stateAttr}/>`,\n );\n }\n p.push('</sheets><calcPr calcId=\"191029\"/></workbook>');\n return p.join(\"\");\n }\n}\n","import type { SharedStrings } from \"@file/shared-strings\";\nimport type { Styles, StyleOptions } from \"@file/styles\";\n/**\n * Worksheet component — generates xl/worksheets/sheet{n}.xml.\n *\n * @module\n */\nimport { IgnoreIfEmptyXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport type { ChartSpaceOptions } from \"@office-open/core\";\nimport { attrs, escapeXml, selfCloseElement } from \"@office-open/xml\";\n\nexport interface ColumnOptions {\n readonly min: number;\n readonly max: number;\n readonly width?: number;\n readonly hidden?: boolean;\n readonly customWidth?: boolean;\n}\n\nexport interface RowOptions {\n readonly cells?: readonly CellOptions[];\n readonly height?: number;\n readonly hidden?: boolean;\n readonly rowNumber?: number;\n}\n\nexport interface CellOptions {\n readonly value?: string | number | boolean | Date | null;\n readonly reference?: string;\n /** Direct style index (for pre-resolved styles) */\n readonly styleIndex?: number;\n /** Style options (resolved to index at compile time) */\n readonly style?: StyleOptions;\n}\n\nexport interface MergeCellOptions {\n readonly from: { readonly row: number; readonly col: number };\n readonly to: { readonly row: number; readonly col: number };\n}\n\nexport interface FreezePaneOptions {\n /** Row split position (1-based, freezes rows above) */\n readonly row?: number;\n /** Column split position (1-based, freezes columns to the left) */\n readonly col?: number;\n}\n\nexport interface WorksheetImageOptions {\n readonly data: Uint8Array;\n readonly type: \"png\" | \"jpeg\" | \"jpg\";\n readonly col: number;\n readonly row: number;\n}\n\nexport interface WorksheetChartOptions extends ChartSpaceOptions {\n /** 1-based column position for the chart */\n readonly col: number;\n /** 1-based row position for the chart */\n readonly row: number;\n}\n\nexport type DataValidationType =\n | \"none\"\n | \"whole\"\n | \"decimal\"\n | \"list\"\n | \"date\"\n | \"time\"\n | \"textLength\"\n | \"custom\";\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\nexport interface DataValidationOptions {\n /** Cell range, e.g. \"A1:A10\" */\n readonly sqref: string;\n readonly type?: DataValidationType;\n readonly operator?: DataValidationOperator;\n readonly formula1?: string;\n readonly formula2?: string;\n readonly allowBlank?: boolean;\n readonly showErrorMessage?: boolean;\n readonly errorTitle?: string;\n readonly error?: string;\n readonly showInputMessage?: boolean;\n readonly promptTitle?: string;\n readonly prompt?: string;\n}\n\nexport type ConditionalFormatType =\n | \"cellIs\"\n | \"containsText\"\n | \"expression\"\n | \"top10\"\n | \"aboveAverage\";\nexport type ConditionalFormatOperator =\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThanOrEqual\"\n | \"greaterThan\"\n | \"between\"\n | \"notBetween\"\n | \"containsText\"\n | \"notContains\"\n | \"beginsWith\"\n | \"endsWith\";\n\nexport interface ConditionalFormatRule {\n readonly type: ConditionalFormatType;\n readonly operator?: ConditionalFormatOperator;\n /** Formula(s) — up to 3 */\n readonly formulas?: readonly string[];\n readonly priority?: number;\n /** Reference to a dxf (differential format) in the styles table */\n readonly dxfId?: number;\n}\n\nexport interface ConditionalFormatOptions {\n /** Cell range, e.g. \"A1:A10\" */\n readonly sqref: string;\n readonly rules: readonly ConditionalFormatRule[];\n}\n\nexport interface WorksheetOptions {\n readonly name?: string;\n readonly children?: readonly RowOptions[];\n readonly columns?: readonly ColumnOptions[];\n readonly mergeCells?: readonly MergeCellOptions[];\n readonly freezePanes?: FreezePaneOptions;\n /** Auto-filter range, e.g. \"A1:D10\" */\n readonly autoFilter?: string;\n readonly images?: readonly WorksheetImageOptions[];\n readonly charts?: readonly WorksheetChartOptions[];\n readonly dataValidations?: readonly DataValidationOptions[];\n readonly conditionalFormats?: readonly ConditionalFormatOptions[];\n}\n\nexport class Worksheet extends IgnoreIfEmptyXmlComponent {\n private readonly rows: readonly RowOptions[];\n private readonly columns: readonly ColumnOptions[];\n private readonly mergeCells: readonly MergeCellOptions[];\n private readonly freezePanes?: FreezePaneOptions;\n private readonly autoFilter?: string;\n private readonly images: readonly WorksheetImageOptions[];\n private readonly chartOptions: readonly WorksheetChartOptions[];\n private readonly dataValidations: readonly DataValidationOptions[];\n private readonly conditionalFormats: readonly ConditionalFormatOptions[];\n\n public constructor(options: WorksheetOptions) {\n super(\"worksheet\");\n this.rows = options.children ?? [];\n this.columns = options.columns ?? [];\n this.mergeCells = options.mergeCells ?? [];\n this.freezePanes = options.freezePanes;\n this.autoFilter = options.autoFilter;\n this.images = options.images ?? [];\n this.chartOptions = options.charts ?? [];\n this.dataValidations = options.dataValidations ?? [];\n this.conditionalFormats = options.conditionalFormats ?? [];\n }\n\n public get imageOptions(): readonly WorksheetImageOptions[] {\n return this.images;\n }\n\n public get charts(): readonly WorksheetChartOptions[] {\n return this.chartOptions;\n }\n\n public override prepForXml(context: Context): IXmlableObject | undefined {\n const fileData = context.fileData as\n | { sharedStrings?: SharedStrings; styles?: Styles }\n | undefined;\n const sharedStrings = fileData?.sharedStrings;\n const styles = fileData?.styles;\n\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n },\n ];\n\n // Dimension — defines the used range of the sheet\n const maxRow = this.rows.length;\n let maxCol = 0;\n for (const row of this.rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n if (maxRow > 0 && maxCol > 0) {\n const dimRef = `A1:${this.defaultCellRef(maxRow, maxCol)}`;\n children.push({ dimension: { _attr: { ref: dimRef } } });\n }\n\n // Sheet views (freeze panes) — must come before cols per XSD sequence\n if (this.freezePanes) {\n const fp = this.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = this.defaultCellRef(topRow, leftCol);\n const attr: Record<string, string | number> = {\n ySplit,\n xSplit,\n topLeftCell,\n activePane:\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\",\n state: \"frozen\",\n };\n children.push({\n sheetViews: [\n {\n sheetView: [\n { _attr: { tabSelected: 1, workbookViewId: 0 } },\n { pane: { _attr: attr } },\n ],\n },\n ],\n });\n } else {\n children.push({\n sheetViews: [{ sheetView: [{ _attr: { tabSelected: 1, workbookViewId: 0 } }] }],\n });\n }\n\n children.push({ sheetFormatPr: { _attr: { defaultRowHeight: 15 } } });\n\n // Column definitions (after sheetViews, before sheetData)\n if (this.columns.length > 0) {\n const colElements: IXmlableObject[] = [];\n for (const col of this.columns) {\n const colAttrs: Record<string, string | number> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n colElements.push({ col: { _attr: colAttrs } });\n }\n children.push({ cols: colElements });\n }\n\n // Sheet data (rows + cells)\n const sheetDataChildren: IXmlableObject[] = [];\n for (let i = 0; i < this.rows.length; i++) {\n const rowOpts = this.rows[i];\n const rowNumber = rowOpts.rowNumber ?? i + 1;\n const rowAttrs: Record<string, string | number> = { r: rowNumber };\n if (rowOpts.height !== undefined) {\n rowAttrs.ht = rowOpts.height;\n rowAttrs.customHeight = 1;\n }\n if (rowOpts.hidden) {\n rowAttrs.hidden = 1;\n }\n\n const cellElements: IXmlableObject[] = [];\n if (rowOpts.cells) {\n for (let j = 0; j < rowOpts.cells.length; j++) {\n const cell = rowOpts.cells[j];\n const ref = cell.reference ?? this.defaultCellRef(rowNumber, j + 1);\n const cellObj = this.buildCell(ref, cell, sharedStrings, styles);\n if (cellObj) cellElements.push(cellObj);\n }\n }\n\n sheetDataChildren.push({ row: [{ _attr: rowAttrs }, ...cellElements] });\n }\n\n children.push({ sheetData: sheetDataChildren });\n\n // Auto filter (after sheetData, before mergeCells — per XSD sequence)\n if (this.autoFilter) {\n children.push({ autoFilter: { _attr: { ref: this.autoFilter } } });\n }\n\n // Merge cells (after autoFilter)\n if (this.mergeCells.length > 0) {\n const mergeElements: IXmlableObject[] = [{ _attr: { count: this.mergeCells.length } }];\n for (const mc of this.mergeCells) {\n const fromRef = this.defaultCellRef(mc.from.row, mc.from.col);\n const toRef = this.defaultCellRef(mc.to.row, mc.to.col);\n mergeElements.push({\n mergeCell: { _attr: { ref: `${fromRef}:${toRef}` } },\n });\n }\n children.push({ mergeCells: mergeElements });\n }\n\n // Conditional formatting (after autoFilter, before dataValidations)\n if (this.conditionalFormats.length > 0) {\n for (const cf of this.conditionalFormats) {\n const rules: IXmlableObject[] = [];\n for (let ri = 0; ri < cf.rules.length; ri++) {\n const rule = cf.rules[ri];\n const ruleAttrs: Record<string, string | number> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n\n const ruleChildren: IXmlableObject[] = [{ _attr: ruleAttrs }];\n\n if (rule.formulas) {\n for (const f of rule.formulas) {\n ruleChildren.push({ formula: [f] });\n }\n }\n rules.push({ cfRule: ruleChildren });\n }\n children.push({ conditionalFormatting: [{ _attr: { sqref: cf.sqref } }, ...rules] });\n }\n }\n\n // Data validations (after conditionalFormatting)\n if (this.dataValidations.length > 0) {\n const dvElements: IXmlableObject[] = [{ _attr: { count: this.dataValidations.length } }];\n for (const dv of this.dataValidations) {\n const dvAttrs: Record<string, string | number> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n\n const dvChildren: IXmlableObject[] = [{ _attr: dvAttrs }];\n if (dv.formula1 !== undefined) dvChildren.push({ formula1: [dv.formula1] });\n if (dv.formula2 !== undefined) dvChildren.push({ formula2: [dv.formula2] });\n dvElements.push({ dataValidation: dvChildren });\n }\n children.push({ dataValidations: dvElements });\n }\n\n children.push({\n pageMargins: {\n _attr: { left: 0.75, right: 0.75, top: 1, bottom: 1, header: 0.5, footer: 0.5 },\n },\n });\n\n return { worksheet: children };\n }\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(context: Context): string {\n const fileData = context.fileData as\n | { sharedStrings?: SharedStrings; styles?: Styles }\n | undefined;\n const sharedStrings = fileData?.sharedStrings;\n const styles = fileData?.styles;\n\n const p: string[] = [\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // Dimension — defines the used range of the sheet\n const maxRow = this.rows.length;\n let maxCol = 0;\n for (const row of this.rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n if (maxRow > 0 && maxCol > 0) {\n const dimRef = `A1:${this.defaultCellRef(maxRow, maxCol)}`;\n p.push(`<dimension ref=\"${dimRef}\"/>`);\n }\n\n // Sheet views\n if (this.freezePanes) {\n const fp = this.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = this.defaultCellRef(topRow, leftCol);\n const activePane =\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\";\n p.push(\n '<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\">',\n `<pane ySplit=\"${ySplit}\" xSplit=\"${xSplit}\" topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/>`,\n \"</sheetView></sheetViews>\",\n );\n } else {\n // Default sheetView (required by Excel)\n p.push('<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>');\n }\n\n // Sheet format — default row height\n p.push('<sheetFormatPr defaultRowHeight=\"15\"/>');\n\n // Column definitions\n if (this.columns.length > 0) {\n p.push(\"<cols>\");\n for (const col of this.columns) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n p.push(selfCloseElement(\"col\", attrs(colAttrs)));\n }\n p.push(\"</cols>\");\n }\n\n // Sheet data (rows + cells) — the hot path\n p.push(\"<sheetData>\");\n for (let i = 0; i < this.rows.length; i++) {\n const rowOpts = this.rows[i];\n const rowNumber = rowOpts.rowNumber ?? i + 1;\n const rowAttrs: Record<string, string | number | boolean | undefined> = { r: rowNumber };\n if (rowOpts.height !== undefined) {\n rowAttrs.ht = rowOpts.height;\n rowAttrs.customHeight = 1;\n }\n if (rowOpts.hidden) {\n rowAttrs.hidden = 1;\n }\n\n if (rowOpts.cells) {\n const rowParts: string[] = [];\n for (let j = 0; j < rowOpts.cells.length; j++) {\n const cell = rowOpts.cells[j];\n const ref = cell.reference ?? this.defaultCellRef(rowNumber, j + 1);\n const cellStr = this.buildCellString(ref, cell, sharedStrings, styles);\n if (cellStr) rowParts.push(cellStr);\n }\n p.push(`<row${attrs(rowAttrs)}>`, ...rowParts, \"</row>\");\n } else {\n p.push(`<row${attrs(rowAttrs)}/>`);\n }\n }\n p.push(\"</sheetData>\");\n\n // Auto filter\n if (this.autoFilter) {\n p.push(selfCloseElement(\"autoFilter\", attrs({ ref: this.autoFilter })));\n }\n\n // Merge cells\n if (this.mergeCells.length > 0) {\n p.push(`<mergeCells count=\"${this.mergeCells.length}\">`);\n for (const mc of this.mergeCells) {\n const fromRef = this.defaultCellRef(mc.from.row, mc.from.col);\n const toRef = this.defaultCellRef(mc.to.row, mc.to.col);\n p.push(selfCloseElement(\"mergeCell\", attrs({ ref: `${fromRef}:${toRef}` })));\n }\n p.push(\"</mergeCells>\");\n }\n\n // Conditional formatting\n if (this.conditionalFormats.length > 0) {\n for (const cf of this.conditionalFormats) {\n p.push(`<conditionalFormatting sqref=\"${cf.sqref}\">`);\n for (let ri = 0; ri < cf.rules.length; ri++) {\n const rule = cf.rules[ri];\n const ruleAttrs: Record<string, string | number | boolean | undefined> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n if (rule.formulas && rule.formulas.length > 0) {\n const formulaParts = rule.formulas.map((f) => `<formula>${escapeXml(f)}</formula>`);\n p.push(`<cfRule${attrs(ruleAttrs)}>`, ...formulaParts, \"</cfRule>\");\n } else {\n p.push(selfCloseElement(\"cfRule\", attrs(ruleAttrs)));\n }\n }\n p.push(\"</conditionalFormatting>\");\n }\n }\n\n // Data validations\n if (this.dataValidations.length > 0) {\n p.push(`<dataValidations count=\"${this.dataValidations.length}\">`);\n for (const dv of this.dataValidations) {\n const dvAttrs: Record<string, string | number | boolean | undefined> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n const inner: string[] = [];\n if (dv.formula1 !== undefined) inner.push(`<formula1>${escapeXml(dv.formula1)}</formula1>`);\n if (dv.formula2 !== undefined) inner.push(`<formula2>${escapeXml(dv.formula2)}</formula2>`);\n if (inner.length > 0) {\n p.push(`<dataValidation${attrs(dvAttrs)}>`, ...inner, \"</dataValidation>\");\n } else {\n p.push(selfCloseElement(\"dataValidation\", attrs(dvAttrs)));\n }\n }\n p.push(\"</dataValidations>\");\n }\n\n p.push('<pageMargins left=\"0.75\" right=\"0.75\" top=\"1\" bottom=\"1\" header=\"0.5\" footer=\"0.5\"/>');\n p.push(\"</worksheet>\");\n return p.join(\"\");\n }\n\n /**\n * Direct string serialization of a single cell — zero intermediate objects.\n */\n private buildCellString(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n ): string {\n const cellAttrs: Record<string, string | number | boolean | undefined> = { r: ref };\n\n // Resolve style\n if (cell.style !== undefined && styles) {\n cellAttrs.s = styles.register(cell.style);\n } else if (cell.styleIndex !== undefined) {\n cellAttrs.s = cell.styleIndex;\n }\n\n const value = cell.value;\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return selfCloseElement(\"c\", attrs(cellAttrs));\n }\n return \"\";\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n cellAttrs.t = \"s\";\n const idx = sharedStrings.register(value);\n return `<c${attrs(cellAttrs)}><v>${idx}</v></c>`;\n }\n cellAttrs.t = \"inlineStr\";\n return `<c${attrs(cellAttrs)}><is><t>${escapeXml(value)}</t></is></c>`;\n }\n\n if (typeof value === \"number\") {\n return `<c${attrs(cellAttrs)}><v>${value}</v></c>`;\n }\n\n if (typeof value === \"boolean\") {\n cellAttrs.t = \"b\";\n return `<c${attrs(cellAttrs)}><v>${value ? 1 : 0}</v></c>`;\n }\n\n if (value instanceof Date) {\n const serial = this.dateToSerialNumber(value);\n return `<c${attrs(cellAttrs)}><v>${serial}</v></c>`;\n }\n\n return \"\";\n }\n\n private defaultCellRef(row: number, col: number): string {\n return this.columnToLetter(col) + row;\n }\n\n private columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n }\n\n private buildCell(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n ): IXmlableObject | undefined {\n const attrs: Record<string, string | number> = { r: ref };\n\n // Resolve style: either direct index or register options\n if (cell.style !== undefined && styles) {\n attrs.s = styles.register(cell.style);\n } else if (cell.styleIndex !== undefined) {\n attrs.s = cell.styleIndex;\n }\n\n const value = cell.value;\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return { c: [{ _attr: attrs }] };\n }\n return undefined;\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n attrs.t = \"s\";\n const idx = sharedStrings.register(value);\n return { c: [{ _attr: attrs }, { v: [idx] }] };\n }\n // Fallback: inline string\n attrs.t = \"inlineStr\";\n return { c: [{ _attr: attrs }, { is: [{ t: [value] }] }] };\n }\n\n if (typeof value === \"number\") {\n return { c: [{ _attr: attrs }, { v: [value] }] };\n }\n\n if (typeof value === \"boolean\") {\n attrs.t = \"b\";\n return { c: [{ _attr: attrs }, { v: [value ? 1 : 0] }] };\n }\n\n if (value instanceof Date) {\n const serial = this.dateToSerialNumber(value);\n return { c: [{ _attr: attrs }, { v: [serial] }] };\n }\n\n return undefined;\n }\n\n private dateToSerialNumber(date: Date): number {\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n return (date.getTime() - epoch.getTime()) / msPerDay;\n }\n}\n","import { ContentTypes } from \"@file/content-types\";\nimport { CoreProperties, type CorePropertiesOptions } from \"@file/core-properties\";\nimport { Media } from \"@file/media/media\";\nimport { SharedStrings } from \"@file/shared-strings\";\nimport { Styles } from \"@file/styles\";\nimport { DefaultTheme } from \"@file/theme\";\nimport { WorkbookXml, type SheetDefinition } from \"@file/workbook\";\nimport { Worksheet, type WorksheetOptions } from \"@file/worksheet\";\n/**\n * File class (exported as Workbook) — the top-level container for XLSX documents.\n *\n * @module\n */\nimport { AppProperties, ChartCollection, Relationships } from \"@office-open/core\";\n\nexport interface WorkbookOptions extends CorePropertiesOptions {\n readonly worksheets?: readonly WorksheetOptions[];\n}\n\nexport class File {\n private readonly worksheetOptions: readonly WorksheetOptions[];\n private readonly corePropsOptions: CorePropertiesOptions;\n\n // Lazy components\n private _coreProperties?: CoreProperties;\n private _appProperties?: AppProperties;\n private _contentTypes?: ContentTypes;\n private _styles?: Styles;\n private _theme?: DefaultTheme;\n private _workbookXml?: WorkbookXml;\n private _worksheets?: Worksheet[];\n private _sharedStrings?: SharedStrings;\n private _media?: Media;\n private _fileRels?: Relationships;\n private _workbookRels?: Relationships;\n private _charts?: ChartCollection;\n\n public constructor(options: WorkbookOptions) {\n this.worksheetOptions = options.worksheets ?? [];\n this.corePropsOptions = options;\n }\n\n // ── Lazy getters ──\n\n public get coreProperties(): CoreProperties {\n return (this._coreProperties ??= new CoreProperties(this.corePropsOptions));\n }\n\n public get appProperties(): AppProperties {\n return (this._appProperties ??= new AppProperties());\n }\n\n public get contentTypes(): ContentTypes {\n if (!this._contentTypes) {\n this._contentTypes = new ContentTypes();\n for (let i = 0; i < this.worksheetOptions.length; i++) {\n this._contentTypes.addWorksheet(i + 1);\n }\n this._contentTypes.addStyles();\n this._contentTypes.addSharedStrings();\n this._contentTypes.addTheme();\n }\n return this._contentTypes;\n }\n\n public get styles(): Styles {\n return (this._styles ??= new Styles());\n }\n\n public get theme(): DefaultTheme {\n return (this._theme ??= new DefaultTheme());\n }\n\n public get workbookXml(): WorkbookXml {\n if (!this._workbookXml) {\n const sheets: SheetDefinition[] = this.worksheetOptions.map((ws, i) => ({\n name: ws.name ?? `Sheet${i + 1}`,\n sheetId: i + 1,\n rId: `rId${i + 1}`,\n }));\n this._workbookXml = new WorkbookXml(sheets);\n }\n return this._workbookXml;\n }\n\n public get sharedStrings(): SharedStrings {\n return (this._sharedStrings ??= new SharedStrings());\n }\n\n public get media(): Media {\n return (this._media ??= new Media());\n }\n\n public get charts(): ChartCollection {\n return (this._charts ??= new ChartCollection());\n }\n\n public get worksheets(): readonly Worksheet[] {\n if (!this._worksheets) {\n this._worksheets = this.worksheetOptions.map((ws) => new Worksheet(ws));\n }\n return this._worksheets;\n }\n\n public get fileRelationships(): Relationships {\n if (!this._fileRels) {\n this._fileRels = new Relationships();\n this._fileRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n \"xl/workbook.xml\",\n );\n this._fileRels.addRelationship(\n 2,\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n \"docProps/core.xml\",\n );\n this._fileRels.addRelationship(\n 3,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n \"docProps/app.xml\",\n );\n }\n return this._fileRels;\n }\n\n public get workbookRelationships(): Relationships {\n if (!this._workbookRels) {\n this._workbookRels = new Relationships();\n let rid = 1;\n for (let i = 0; i < this.worksheetOptions.length; i++) {\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n \"sharedStrings.xml\",\n );\n }\n return this._workbookRels;\n }\n}\n","/**\n * XLSX Drawing component — generates xl/drawings/drawing{n}.xml.\n *\n * Uses the spreadsheetDrawing namespace (default, no prefix) for anchoring\n * images and charts to worksheet cells.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\nexport interface ImageOptions {\n /** 1-based column */\n readonly col: number;\n /** Column offset in EMU (default 0) */\n readonly colOffset?: number;\n /** 1-based row */\n readonly row: number;\n /** Row offset in EMU (default 0) */\n readonly rowOffset?: number;\n /** Relationship ID for the image */\n readonly rId: string;\n}\n\nexport interface ChartAnchorOptions {\n /** 1-based column */\n readonly col: number;\n /** Column offset in EMU (default 0) */\n readonly colOffset?: number;\n /** 1-based row */\n readonly row: number;\n /** Row offset in EMU (default 0) */\n readonly rowOffset?: number;\n /** Relationship ID for the chart */\n readonly rId: string;\n}\n\nconst XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst A_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst C_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\n\nexport class Drawing extends BaseXmlComponent {\n private readonly images: readonly ImageOptions[];\n private readonly charts: readonly ChartAnchorOptions[];\n\n public constructor(images: readonly ImageOptions[], charts: readonly ChartAnchorOptions[] = []) {\n super(\"wsDr\");\n this.images = images;\n this.charts = charts;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: XDR_NS,\n \"xmlns:a\": A_NS,\n \"xmlns:r\": R_NS,\n },\n },\n ];\n\n let nextId = 1;\n for (const img of this.images) {\n children.push(this.buildImageAnchor(img, nextId++));\n }\n\n for (const chart of this.charts) {\n children.push(this.buildChartAnchor(chart, nextId++));\n }\n\n return { wsDr: children };\n }\n\n private buildFromAnchor(\n col: number,\n row: number,\n colOffset?: number,\n rowOffset?: number,\n ): IXmlableObject {\n return {\n from: [\n { col: [col - 1] },\n { colOff: [colOffset ?? 0] },\n { row: [row - 1] },\n { rowOff: [rowOffset ?? 0] },\n ],\n };\n }\n\n private buildToAnchor(col: number, row: number): IXmlableObject {\n return {\n to: [{ col: [col] }, { colOff: [0] }, { row: [row] }, { rowOff: [0] }],\n };\n }\n\n public override toXml(_context: Context): string {\n const p: string[] = [`<wsDr xmlns=\"${XDR_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${R_NS}\">`];\n let id = 1;\n for (const img of this.images) {\n p.push(\n `<twoCellAnchor editAs=\"oneCell\"><from><col>${img.col - 1}</col><colOff>${img.colOffset ?? 0}</colOff><row>${img.row - 1}</row><rowOff>${img.rowOffset ?? 0}</rowOff></from>`,\n `<to><col>${img.col}</col><colOff>0</colOff><row>${img.row}</row><rowOff>0</rowOff></to>`,\n `<pic><nvPicPr><cNvPr id=\"${id}\" name=\"Picture ${id}\"/><cNvPicPr preferRelativeResize=\"1\"/></nvPicPr>`,\n `<blipFill><a:blip r:embed=\"${img.rId}\"/><a:stretch><a:fillRect/></a:stretch></blipFill>`,\n `<spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"400000\" cy=\"300000\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></spPr></pic>`,\n `<clientData/></twoCellAnchor>`,\n );\n id++;\n }\n for (const chart of this.charts) {\n p.push(\n `<twoCellAnchor editAs=\"oneCell\"><from><col>${chart.col - 1}</col><colOff>${chart.colOffset ?? 0}</colOff><row>${chart.row - 1}</row><rowOff>${chart.rowOffset ?? 0}</rowOff></from>`,\n `<to><col>${chart.col + 8}</col><colOff>0</colOff><row>${chart.row + 15}</row><rowOff>0</rowOff></to>`,\n `<graphicFrame><nvGraphicFramePr><cNvPr id=\"${id}\" name=\"Chart ${id}\"/><cNvGraphicFramePr><a:graphicFrameLocks noGrp=\"1\"/></cNvGraphicFramePr></nvGraphicFramePr>`,\n `<xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/></xfrm>`,\n `<a:graphic><a:graphicData uri=\"${C_URI}\"><c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" xmlns:r=\"${R_NS}\" r:id=\"${chart.rId}\"/></a:graphicData></a:graphic></graphicFrame>`,\n `<clientData/></twoCellAnchor>`,\n );\n id++;\n }\n p.push(\"</wsDr>\");\n return p.join(\"\");\n }\n\n private buildImageAnchor(img: ImageOptions, id: number): IXmlableObject {\n return {\n twoCellAnchor: [\n { _attr: { editAs: \"oneCell\" } },\n this.buildFromAnchor(img.col, img.row, img.colOffset, img.rowOffset),\n this.buildToAnchor(img.col, img.row),\n {\n pic: [\n {\n nvPicPr: [\n { cNvPr: { _attr: { id, name: `Picture ${id}` } } },\n { cNvPicPr: [{ _attr: { preferRelativeResize: 1 } }] },\n ],\n },\n {\n blipFill: [\n { \"a:blip\": { _attr: { \"r:embed\": img.rId } } },\n { \"a:stretch\": [{ \"a:fillRect\": [] }] },\n ],\n },\n {\n spPr: [\n {\n \"a:xfrm\": [\n { \"a:off\": { _attr: { x: 0, y: 0 } } },\n { \"a:ext\": { _attr: { cx: 400000, cy: 300000 } } },\n ],\n },\n { \"a:prstGeom\": [{ _attr: { prst: \"rect\" } }, { \"a:avLst\": [] }] },\n ],\n },\n ],\n },\n { clientData: [] },\n ],\n };\n }\n\n private buildChartAnchor(chart: ChartAnchorOptions, id: number): IXmlableObject {\n return {\n twoCellAnchor: [\n { _attr: { editAs: \"oneCell\" } },\n this.buildFromAnchor(chart.col, chart.row, chart.colOffset, chart.rowOffset),\n this.buildToAnchor(chart.col + 8, chart.row + 15),\n {\n graphicFrame: [\n {\n nvGraphicFramePr: [\n { cNvPr: { _attr: { id, name: `Chart ${id}` } } },\n { cNvGraphicFramePr: [{ \"a:graphicFrameLocks\": { _attr: { noGrp: 1 } } }] },\n ],\n },\n {\n xfrm: [\n { \"a:off\": { _attr: { x: 0, y: 0 } } },\n { \"a:ext\": { _attr: { cx: 0, cy: 0 } } },\n ],\n },\n {\n \"a:graphic\": [\n {\n \"a:graphicData\": [\n { _attr: { uri: C_URI } },\n {\n \"c:chart\": {\n _attr: {\n \"xmlns:c\": \"http://schemas.openxmlformats.org/drawingml/2006/chart\",\n \"xmlns:r\": R_NS,\n \"r:id\": chart.rId,\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n { clientData: [] },\n ],\n };\n }\n}\n","/**\n * XLSX Compiler — compiles a File object into a Zippable structure.\n *\n * @module\n */\nimport { Formatter } from \"@export/formatter\";\nimport { Drawing, type ImageOptions, type ChartAnchorOptions } from \"@file/drawing/drawing\";\nimport type { File } from \"@file/file\";\nimport type { Context } from \"@file/xml-components\";\nimport {\n ChartSpace,\n Relationships,\n compileMapping,\n type XmlifyedFile,\n type Zippable,\n} from \"@office-open/core\";\n\nexport class Compiler {\n private readonly formatter = new Formatter();\n\n public compile(file: File, overrides: readonly XmlifyedFile[] = []): Zippable {\n const context: Context = { fileData: file, stack: [] };\n const f = this.formatter;\n\n const mapping: Record<string, { data: string; path: string }> = {};\n\n const fmt = (component: any) => f.formatToXml(component, context);\n\n // Core properties\n mapping[\"Properties\"] = {\n data: fmt(file.coreProperties),\n path: \"docProps/core.xml\",\n };\n\n // App properties\n mapping[\"AppProperties\"] = {\n data: fmt(file.appProperties),\n path: \"docProps/app.xml\",\n };\n\n // File-level relationships (_rels/.rels)\n mapping[\"FileRelationships\"] = {\n data: fmt(file.fileRelationships),\n path: \"_rels/.rels\",\n };\n\n // Workbook\n mapping[\"Workbook\"] = {\n data: fmt(file.workbookXml),\n path: \"xl/workbook.xml\",\n };\n\n // Workbook relationships\n mapping[\"WorkbookRelationships\"] = {\n data: fmt(file.workbookRelationships),\n path: \"xl/_rels/workbook.xml.rels\",\n };\n\n // Worksheets — formatted BEFORE SharedStrings so strings are registered\n const worksheets = file.worksheets;\n let globalMediaIdx = 0;\n let globalChartIdx = 0;\n\n for (let i = 0; i < worksheets.length; i++) {\n const ws = worksheets[i];\n const imgOpts = ws.imageOptions;\n const chartOpts = ws.charts;\n\n // Worksheet uses toXml() fast path (zero-allocation string concat)\n let sheetXml = fmt(ws);\n\n const hasMedia = imgOpts.length > 0 || chartOpts.length > 0;\n\n if (hasMedia) {\n const drawingImages: ImageOptions[] = [];\n const drawingCharts: ChartAnchorOptions[] = [];\n const drawingRels = new Relationships();\n let rid = 1;\n\n // Process images\n for (const img of imgOpts) {\n const mediaKey = `image_${globalMediaIdx}`;\n const ext = img.type === \"jpeg\" || img.type === \"jpg\" ? \"jpeg\" : \"png\";\n file.media.addImage(mediaKey, {\n fileName: `image${globalMediaIdx + 1}.${ext}`,\n type: ext,\n data: img.data,\n width: 0,\n height: 0,\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `../media/image${globalMediaIdx + 1}.${ext}`,\n );\n\n drawingImages.push({\n col: img.col,\n row: img.row,\n rId: `rId${rid}`,\n });\n rid++;\n globalMediaIdx++;\n }\n\n // Process charts\n for (const chart of chartOpts) {\n const chartKey = `chart_${globalChartIdx}`;\n file.charts.addChart(chartKey, {\n key: chartKey,\n chartSpace: new ChartSpace(chart),\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${globalChartIdx + 1}.xml`,\n );\n\n drawingCharts.push({\n col: chart.col,\n row: chart.row,\n rId: `rId${rid}`,\n });\n rid++;\n globalChartIdx++;\n }\n\n // Generate drawing XML\n const drawing = new Drawing(drawingImages, drawingCharts);\n const drawingIdx = i + 1;\n mapping[`Drawing${i}`] = {\n data: fmt(drawing),\n path: `xl/drawings/drawing${drawingIdx}.xml`,\n };\n\n // Drawing relationships\n mapping[`DrawingRels${i}`] = {\n data: fmt(drawingRels),\n path: `xl/drawings/_rels/drawing${drawingIdx}.xml.rels`,\n };\n\n // Insert drawing reference before the closing </worksheet> tag.\n // Use slice instead of replace to avoid O(n) full-string scan.\n const closingTag = \"</worksheet>\";\n sheetXml =\n sheetXml.slice(0, -closingTag.length) + `<drawing r:id=\"rId${rid}\"/>` + closingTag;\n\n // Worksheet needs its own rels for drawing reference\n const wsRels = new Relationships();\n wsRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${drawingIdx}.xml`,\n );\n mapping[`WorksheetRels${i}`] = {\n data: fmt(wsRels),\n path: `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n };\n\n file.contentTypes.addDrawing(drawingIdx);\n }\n\n mapping[`Worksheet${i}`] = {\n data: sheetXml,\n path: `xl/worksheets/sheet${i + 1}.xml`,\n };\n }\n\n // Shared Strings — AFTER worksheets so all strings are collected\n const sharedStrings = file.sharedStrings;\n if (sharedStrings.count > 0) {\n mapping[\"SharedStrings\"] = {\n data: fmt(sharedStrings),\n path: \"xl/sharedStrings.xml\",\n };\n }\n\n // Styles\n mapping[\"Styles\"] = {\n data: fmt(file.styles),\n path: \"xl/styles.xml\",\n };\n\n // Theme\n mapping[\"Theme\"] = {\n data: fmt(file.theme),\n path: \"xl/theme/theme1.xml\",\n };\n\n // Charts — AFTER worksheets so charts are registered\n for (let i = 0; i < file.charts.array.length; i++) {\n const chartData = file.charts.array[i];\n mapping[`Chart${i}`] = {\n data: fmt(chartData.chartSpace),\n path: `xl/charts/chart${i + 1}.xml`,\n };\n file.contentTypes.addChart(i + 1);\n }\n\n // Register image content types\n const imageExts = new Set<string>();\n for (const img of file.media.array) {\n const ext = img.fileName.endsWith(\".png\") ? \"png\" : \"jpeg\";\n if (!imageExts.has(ext)) {\n imageExts.add(ext);\n file.contentTypes.addImageType(ext as \"png\" | \"jpeg\");\n }\n }\n\n // Content Types — must be last\n mapping[\"ContentTypes\"] = {\n data: fmt(file.contentTypes),\n path: \"[Content_Types].xml\",\n };\n\n // Convert mapping to Zippable\n const mediaFiles: Array<{ data: Uint8Array; path: string }> = [];\n for (const img of file.media.array) {\n mediaFiles.push({ data: img.data, path: `xl/media/${img.fileName}` });\n }\n\n return compileMapping(mapping, overrides, mediaFiles);\n }\n}\n","import type { File } from \"@file/file\";\n/**\n * Packer module — export API for XLSX files.\n *\n * @module\n */\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\n\nimport { Compiler } from \"./next-compiler\";\n\nconst compiler = new Compiler();\n\nexport const Packer = createPacker<File>({\n compile: (file, overrides) => compiler.compile(file, overrides),\n mimeType: OoxmlMimeType.XLSX,\n});\n","/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert Excel column letter(s) to a 1-based column number.\n * \"A\" → 1, \"Z\" → 26, \"AA\" → 27\n */\nexport function letterToColumn(s: string): number {\n let result = 0;\n for (let i = 0; i < s.length; i++) {\n result = result * 26 + (s.charCodeAt(i) - 64);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n","/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport { parseArchive, parseCorePropsElement } from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, findChild, textOf } from \"@office-open/xml\";\nimport { toUint8Array } from \"undio\";\nimport type { DataType } from \"undio\";\n\nimport type { WorkbookOptions } from \"./file/file\";\nimport type {\n WorksheetOptions,\n RowOptions,\n CellOptions,\n ColumnOptions,\n MergeCellOptions,\n} from \"./file/worksheet\";\nimport { letterToColumn } from \"./util\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/core-properties\")) coreProps = target;\n else if (type.includes(\"/extended-properties\")) appProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n };\n}\n\n// ── Shared strings helper ──\n\nfunction parseSharedStrings(el: Element | undefined): string[] {\n if (!el) return [];\n const strings: string[] = [];\n for (const si of el.elements ?? []) {\n if (si.name !== \"si\") continue;\n // Handle both <si><t>text</t></si> and <si><r><t>text</t></r>...</si>\n const t = findChild(si, \"t\");\n if (t) {\n strings.push(textOf(t) ?? \"\");\n } else {\n // Rich text: concatenate all <r><t> segments\n const parts: string[] = [];\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findChild(r, \"t\");\n if (rt) parts.push(textOf(rt) ?? \"\");\n }\n strings.push(parts.join(\"\"));\n }\n }\n return strings;\n}\n\n// ── Cell reference helpers ──\n\nfunction colFromRef(ref: string): number {\n const match = ref.match(/^([A-Z]+)/);\n return match ? letterToColumn(match[1]) : 1;\n}\n\nfunction rowFromRef(ref: string): number {\n const match = ref.match(/(\\d+)$/);\n return match ? parseInt(match[1], 10) : 1;\n}\n\n// ── Worksheet parsing ──\n\nfunction parseWorksheetElement(wsEl: Element, strings: string[]): WorksheetOptions {\n const opts: Record<string, unknown> = {};\n\n // Sheet name from the parent workbook's sheet element (not available here)\n // Caller should set it\n\n // Columns\n // Elements might be prefixed or unprefixed depending on how the XML parser handles default namespaces.\n const colsEl = findChild(wsEl, \"cols\") ?? findChildByLocalName(wsEl, \"cols\");\n if (colsEl) {\n const columns: ColumnOptions[] = [];\n for (const col of colsEl.elements ?? []) {\n if (localName(col) !== \"col\") continue;\n const min = attrNum(col, \"min\");\n const max = attrNum(col, \"max\");\n if (min === undefined || max === undefined) continue;\n const colOpts: Record<string, unknown> = { min, max };\n const width = attrNum(col, \"width\");\n if (width !== undefined) colOpts.width = width;\n if (attr(col, \"hidden\") === \"1\") colOpts.hidden = true;\n columns.push(colOpts as unknown as ColumnOptions);\n }\n if (columns.length > 0) opts.columns = columns;\n }\n\n // Freeze panes\n const sheetViews = findChildByLocalName(wsEl, \"sheetViews\");\n if (sheetViews) {\n const sheetView = findChildByLocalName(sheetViews, \"sheetView\");\n if (sheetView) {\n const pane = findChildByLocalName(sheetView, \"pane\");\n if (pane) {\n const state = attr(pane, \"state\");\n if (state === \"frozen\") {\n const freezePanes: Record<string, unknown> = {};\n const ySplit = attrNum(pane, \"ySplit\");\n const xSplit = attrNum(pane, \"xSplit\");\n if (ySplit && ySplit > 0) freezePanes.row = ySplit;\n if (xSplit && xSplit > 0) freezePanes.col = xSplit;\n if (Object.keys(freezePanes).length > 0) opts.freezePanes = freezePanes;\n }\n }\n }\n }\n\n // Sheet data (rows)\n const sheetData = findChildByLocalName(wsEl, \"sheetData\");\n const rows: RowOptions[] = [];\n if (sheetData) {\n for (const rowEl of sheetData.elements ?? []) {\n if (localName(rowEl) !== \"row\") continue;\n const rowNumber = attrNum(rowEl, \"r\");\n const rowOpts: Record<string, unknown> = {};\n if (rowNumber !== undefined) rowOpts.rowNumber = rowNumber;\n\n const ht = attrNum(rowEl, \"ht\");\n if (ht !== undefined) rowOpts.height = ht;\n if (attr(rowEl, \"hidden\") === \"1\") rowOpts.hidden = true;\n\n const cells: CellOptions[] = [];\n for (const cellEl of rowEl.elements ?? []) {\n if (localName(cellEl) !== \"c\") continue;\n const ref = attr(cellEl, \"r\");\n const type = attr(cellEl, \"t\");\n const cellOpts: Record<string, unknown> = {};\n if (ref) cellOpts.reference = ref;\n\n const styleIdx = attrNum(cellEl, \"s\");\n if (styleIdx !== undefined) cellOpts.styleIndex = styleIdx;\n\n // Cell value\n const vEl = findChildByLocalName(cellEl, \"v\");\n const isEl = findChildByLocalName(cellEl, \"is\");\n\n if (type === \"s\" && vEl) {\n // Shared string\n const idx = parseInt(textOf(vEl) ?? \"\", 10);\n cellOpts.value = strings[idx] ?? \"\";\n } else if (type === \"b\" && vEl) {\n cellOpts.value = textOf(vEl) === \"1\";\n } else if (type === \"inlineStr\" && isEl) {\n const t = findChildByLocalName(isEl, \"t\");\n cellOpts.value = textOf(t) ?? \"\";\n } else if (vEl) {\n const raw = textOf(vEl) ?? \"\";\n const num = Number(raw);\n cellOpts.value = isNaN(num) ? raw : num;\n }\n\n cells.push(cellOpts as CellOptions);\n }\n\n rowOpts.cells = cells;\n rows.push(rowOpts as RowOptions);\n }\n }\n opts.children = rows;\n\n // Merge cells\n const mergeCellsEl = findChildByLocalName(wsEl, \"mergeCells\");\n if (mergeCellsEl) {\n const mergeCells: MergeCellOptions[] = [];\n for (const mc of mergeCellsEl.elements ?? []) {\n if (localName(mc) !== \"mergeCell\") continue;\n const ref = attr(mc, \"ref\");\n if (!ref) continue;\n const parts = ref.split(\":\");\n if (parts.length === 2) {\n mergeCells.push({\n from: { row: rowFromRef(parts[0]), col: colFromRef(parts[0]) },\n to: { row: rowFromRef(parts[1]), col: colFromRef(parts[1]) },\n });\n }\n }\n if (mergeCells.length > 0) opts.mergeCells = mergeCells;\n }\n\n // Auto filter\n const autoFilterEl = findChildByLocalName(wsEl, \"autoFilter\");\n if (autoFilterEl) {\n const ref = attr(autoFilterEl, \"ref\");\n if (ref) opts.autoFilter = ref;\n }\n\n return opts as WorksheetOptions;\n}\n\n// ── Helpers ──\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findChildByLocalName(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n const xlsx = parseXlsx(data);\n\n const opts: Record<string, unknown> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision) opts.revision = parseInt(cp.revision, 10);\n }\n }\n\n // Shared strings\n const strings = parseSharedStrings(xlsx.sharedStrings);\n\n // Sheet names from workbook\n const sheetNames: string[] = [];\n if (xlsx.workbook) {\n const sheetsEl = findChildByLocalName(xlsx.workbook, \"sheets\");\n if (sheetsEl) {\n for (const s of sheetsEl.elements ?? []) {\n if (localName(s) !== \"sheet\") continue;\n sheetNames.push(attr(s, \"name\") ?? \"\");\n }\n }\n }\n\n // Parse worksheets\n const worksheets: WorksheetOptions[] = [];\n for (let i = 0; i < xlsx.worksheets.length; i++) {\n const wsPath = xlsx.worksheets[i];\n const wsEl = xlsx.doc.get(wsPath);\n if (!wsEl) continue;\n\n const wsOpts = parseWorksheetElement(wsEl, strings) as Record<string, unknown>;\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n return opts as WorkbookOptions;\n}\n","/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - Replaces placeholders in the shared strings table (most common)\n * - Replaces placeholders in inline strings within worksheet cells\n *\n * @module\n */\nimport { OoxmlMimeType, unzipSync, zipAndConvert, strFromU8, toJson } from \"@office-open/core\";\nimport type { OutputByType, OutputType } from \"@office-open/core\";\nimport { js2xml } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { toUint8Array } from \"undio\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\nexport type InputDataType = Buffer | string | number[] | Uint8Array | ArrayBuffer | Blob;\n\nexport type PatchDocumentOutputType = OutputType;\n\nexport const PatchType = {\n CELL: \"cell\",\n} as const;\n\nexport interface CellPatch {\n /** Replacement value (string, number, boolean, or Date) */\n readonly value: string | number | boolean | Date;\n}\n\nexport type IPatch = CellPatch;\n\nexport interface PatchWorkbookOptions<T extends PatchDocumentOutputType = PatchDocumentOutputType> {\n readonly outputType: T;\n readonly data: InputDataType;\n readonly patches: Readonly<Record<string, IPatch>>;\n readonly placeholderDelimiters?: Readonly<{\n readonly start: string;\n readonly end: string;\n }>;\n}\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * Placeholders are matched in shared strings and inline strings.\n * For string replacements, the shared string value is updated in-place.\n * For non-string replacements, the cell type and value are updated.\n */\nexport const patchWorkbook = async <T extends PatchDocumentOutputType = PatchDocumentOutputType>({\n outputType,\n data,\n patches,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n const { start, end } = placeholderDelimiters;\n\n // Build placeholder → patch map\n const patchMap = new Map<string, IPatch>();\n for (const [key, patch] of Object.entries(patches)) {\n patchMap.set(`${start}${key}${end}`, patch);\n }\n\n // 1. Patch shared strings\n const sst = xmlMap.get(\"xl/sharedStrings.xml\");\n if (sst) {\n patchSharedStrings(sst, patchMap);\n }\n\n // 2. Patch inline strings in worksheets\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) patchWorksheetInlineStrings(ws, patchMap);\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n for (const [key, value] of xmlMap) {\n files[key] = encoder.encode(js2xml(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, IPatch>): void {\n // toJson returns {elements: [{name: \"sst\", ...}]} — unwrap to actual root\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, IPatch>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Check inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nfunction patchTextElement(tEl: Element, patchMap: Map<string, IPatch>): void {\n const text = tEl.elements?.[0]?.text;\n if (typeof text !== \"string\") return;\n\n for (const [placeholder, patch] of patchMap) {\n if (text.includes(placeholder)) {\n const newValue = String(patch.value);\n const replaced = text.replace(placeholder, newValue);\n if (tEl.elements) {\n tEl.elements[0] = { ...tEl.elements[0], text: replaced };\n }\n }\n }\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@office-open/xlsx",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7",
|
|
4
4
|
"description": "Generate .xlsx files with JS/TS",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"excel",
|
|
@@ -27,18 +27,18 @@
|
|
|
27
27
|
"dist"
|
|
28
28
|
],
|
|
29
29
|
"type": "module",
|
|
30
|
-
"main": "dist/index.
|
|
31
|
-
"types": "dist/index.d.
|
|
30
|
+
"main": "dist/index.mjs",
|
|
31
|
+
"types": "dist/index.d.mts",
|
|
32
32
|
"exports": {
|
|
33
33
|
".": {
|
|
34
|
-
"types": "./dist/index.d.
|
|
35
|
-
"import": "./dist/index.
|
|
34
|
+
"types": "./dist/index.d.mts",
|
|
35
|
+
"import": "./dist/index.mjs"
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"undio": "0.2.0",
|
|
40
|
-
"@office-open/
|
|
41
|
-
"@office-open/
|
|
40
|
+
"@office-open/xml": "0.6.7",
|
|
41
|
+
"@office-open/core": "0.6.7"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"dev": "basis build --stub",
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/file/content-types.ts","../src/file/core-properties.ts","../src/file/media/media.ts","../src/file/shared-strings.ts","../src/file/styles.ts","../src/file/theme.ts","../src/file/workbook.ts","../src/file/worksheet.ts","../src/file/file.ts","../src/export/packer/packer.ts","../src/util/index.ts","../src/parse.ts","../src/patcher.ts"],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["localName"],"sources":["../src/file/content-types.ts","../src/file/core-properties.ts","../src/file/media/media.ts","../src/file/shared-strings.ts","../src/file/styles.ts","../src/file/theme.ts","../src/file/workbook.ts","../src/file/worksheet.ts","../src/file/file.ts","../src/file/drawing/drawing.ts","../src/export/packer/next-compiler.ts","../src/export/packer/packer.ts","../src/util/index.ts","../src/parse.ts","../src/patcher.ts"],"sourcesContent":["/**\n * Content Types module for XLSX packages.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\nconst XLSX_MAIN = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\";\nconst XLSX_WORKSHEET = \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst XLSX_STYLES = \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\";\nconst XLSX_SHARED_STRINGS =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\";\nconst XLSX_THEME = \"application/vnd.openxmlformats-officedocument.theme+xml\";\nconst XLSX_CHART = \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\";\n\ntype EntryType = \"Default\" | \"Override\";\n\ninterface ContentEntry {\n readonly type: EntryType;\n readonly contentType: string;\n readonly key: string;\n}\n\nconst STATIC_ENTRIES: readonly ContentEntry[] = [\n {\n type: \"Default\",\n contentType: \"application/vnd.openxmlformats-package.relationships+xml\",\n key: \"rels\",\n },\n { type: \"Default\", contentType: \"application/xml\", key: \"xml\" },\n { type: \"Default\", contentType: \"image/png\", key: \"png\" },\n { type: \"Default\", contentType: \"image/jpeg\", key: \"jpeg\" },\n { type: \"Override\", contentType: XLSX_MAIN, key: \"/xl/workbook.xml\" },\n {\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-package.core-properties+xml\",\n key: \"/docProps/core.xml\",\n },\n {\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.extended-properties+xml\",\n key: \"/docProps/app.xml\",\n },\n];\n\nconst STATIC_CHILDREN: IXmlableObject[] = [\n { _attr: { xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\" } },\n ...STATIC_ENTRIES.map((e) => {\n if (e.type === \"Default\") {\n return { Default: { _attr: { ContentType: e.contentType, Extension: e.key } } };\n }\n return { Override: { _attr: { ContentType: e.contentType, PartName: e.key } } };\n }),\n];\n\nexport class ContentTypes extends BaseXmlComponent {\n private readonly dynamicEntries: ContentEntry[] = [];\n\n public constructor() {\n super(\"Types\");\n }\n\n public addWorksheet(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_WORKSHEET,\n key: `/xl/worksheets/sheet${index}.xml`,\n });\n }\n\n public addStyles(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_STYLES,\n key: \"/xl/styles.xml\",\n });\n }\n\n public addSharedStrings(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_SHARED_STRINGS,\n key: \"/xl/sharedStrings.xml\",\n });\n }\n\n public addTheme(index: number = 1): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_THEME,\n key: `/xl/theme/theme${index}.xml`,\n });\n }\n\n public addChart(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_CHART,\n key: `/xl/charts/chart${index}.xml`,\n });\n }\n\n public addDrawing(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.drawing+xml\",\n key: `/xl/drawings/drawing${index}.xml`,\n });\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children = [...STATIC_CHILDREN];\n for (const e of this.dynamicEntries) {\n if (e.type === \"Default\") {\n children.push({\n Default: { _attr: { ContentType: e.contentType, Extension: e.key } },\n });\n } else {\n children.push({\n Override: { _attr: { ContentType: e.contentType, PartName: e.key } },\n });\n }\n }\n return { Types: children };\n }\n}\n","/**\n * Core Properties module for SpreadsheetML documents.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { buildCorePropertiesXml } from \"@office-open/core\";\n\nexport interface CorePropertiesOptions {\n readonly title?: string;\n readonly subject?: string;\n readonly creator?: string;\n readonly keywords?: string;\n readonly description?: string;\n readonly lastModifiedBy?: string;\n readonly revision?: number;\n}\n\nexport class CoreProperties extends BaseXmlComponent {\n private readonly options: CorePropertiesOptions;\n\n public constructor(options: CorePropertiesOptions) {\n super(\"cp:coreProperties\");\n this.options = options;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n return buildCorePropertiesXml(this.options);\n }\n}\n","/**\n * Media collection for XLSX files — stores image binary data.\n *\n * @module\n */\n\nexport interface MediaData {\n readonly fileName: string;\n readonly type: string;\n readonly data: Uint8Array;\n readonly width: number;\n readonly height: number;\n}\n\nexport class Media {\n private readonly map = new Map<string, MediaData>();\n\n public addImage(key: string, data: MediaData): void {\n this.map.set(key, data);\n }\n\n public get array(): readonly MediaData[] {\n return [...this.map.values()];\n }\n}\n","/**\n * Shared Strings Table — generates xl/sharedStrings.xml.\n *\n * XLSX stores repeated string values in a central table to reduce file size.\n * Cells reference strings by index into this table.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { escapeXml } from \"@office-open/xml\";\n\nexport class SharedStrings extends BaseXmlComponent {\n private readonly strings: string[] = [];\n private readonly indexMap = new Map<string, number>();\n\n public constructor() {\n super(\"sst\");\n }\n\n /**\n * Register a string and return its index.\n * Returns existing index if the string is already registered.\n */\n public register(s: string): number {\n const existing = this.indexMap.get(s);\n if (existing !== undefined) return existing;\n\n const idx = this.strings.length;\n this.strings.push(s);\n this.indexMap.set(s, idx);\n return idx;\n }\n\n public get count(): number {\n return this.strings.length;\n }\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${this.strings.length}\" uniqueCount=\"${this.indexMap.size}\">`,\n ];\n for (const s of this.strings) {\n p.push(`<si><t>${escapeXml(s)}</t></si>`);\n }\n p.push(\"</sst>\");\n return p.join(\"\");\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n count: this.strings.length,\n uniqueCount: this.indexMap.size,\n },\n },\n ];\n\n for (const s of this.strings) {\n children.push({ si: [{ t: [s] }] });\n }\n\n return { sst: children };\n }\n}\n","/**\n * Styles component — generates xl/styles.xml.\n *\n * XLSX uses an index-based style system: cells reference style entries\n * via the `s` attribute, which is an index into `cellXfs`.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport { attrs, escapeXml } from \"@office-open/xml\";\n\n// ── Sub-style option interfaces ──\n\nexport interface FontOptions {\n readonly bold?: boolean;\n readonly italic?: boolean;\n readonly underline?: boolean;\n readonly strike?: boolean;\n readonly size?: number;\n readonly color?: string;\n readonly fontName?: string;\n}\n\nexport interface FillOptions {\n readonly type?: \"solid\" | \"pattern\";\n readonly color?: string;\n readonly patternType?: string;\n}\n\nexport interface BorderOptions {\n readonly style?: \"thin\" | \"medium\" | \"thick\" | \"dotted\" | \"dashed\" | \"hair\" | \"none\";\n readonly color?: string;\n}\n\nexport interface BorderSideOptions {\n readonly top?: BorderOptions;\n readonly bottom?: BorderOptions;\n readonly left?: BorderOptions;\n readonly right?: BorderOptions;\n readonly diagonal?: BorderOptions;\n}\n\nexport interface AlignmentOptions {\n readonly horizontal?: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\";\n readonly vertical?: \"top\" | \"center\" | \"bottom\";\n readonly wrapText?: boolean;\n readonly textRotation?: number;\n readonly indent?: number;\n}\n\nexport interface StyleOptions {\n readonly font?: FontOptions;\n readonly fill?: FillOptions;\n readonly border?: BorderSideOptions;\n readonly numFmt?: string;\n readonly alignment?: AlignmentOptions;\n}\n\n// ── Style key helpers for deduplication ──\n\nfunction fontKey(f: FontOptions): string {\n return `b${f.bold ? 1 : 0}i${f.italic ? 1 : 0}u${f.underline ? 1 : 0}s${f.strike ? 1 : 0}z${f.size ?? 0}c${f.color ?? \"\"}n${f.fontName ?? \"\"}`;\n}\n\nfunction fillKey(f: FillOptions): string {\n return `t${f.type ?? \"\"}c${f.color ?? \"\"}p${f.patternType ?? \"\"}`;\n}\n\nfunction borderKey(b: BorderSideOptions): string {\n const sk = (o?: BorderOptions) => `${o?.style ?? \"\"}_${o?.color ?? \"\"}`;\n return `t${sk(b.top)}b${sk(b.bottom)}l${sk(b.left)}r${sk(b.right)}d${sk(b.diagonal)}`;\n}\n\n// ── Built-in number format IDs ──\n\nconst BUILTIN_NUMFMTS: Record<string, number> = {\n General: 0,\n \"0\": 1,\n \"0.00\": 2,\n \"#,##0\": 3,\n \"#,##0.00\": 4,\n \"0%\": 9,\n \"0.00%\": 10,\n \"0.00E+00\": 11,\n \"mm-dd-yy\": 14,\n \"d-mmm-yy\": 15,\n \"d-mmm\": 16,\n \"mmm-yy\": 17,\n \"h:mm AM/PM\": 18,\n \"h:mm:ss AM/PM\": 19,\n \"h:mm\": 20,\n \"h:mm:ss\": 21,\n \"m/d/yy h:mm\": 22,\n \"#,##0 ;(#,##0)\": 37,\n \"#,##0 ;[Red](#,##0)\": 38,\n \"#,##0.00;(#,##0.00)\": 39,\n \"#,##0.00;[Red](#,##0.00)\": 40,\n \"mm:ss\": 45,\n \"[h]:mm:ss\": 46,\n \"mmss.0\": 47,\n \"##0.0E+0\": 48,\n \"@\": 49,\n};\n\nexport class Styles extends BaseXmlComponent {\n private readonly fonts: FontOptions[] = [\n { size: 11, fontName: \"Calibri\" }, // default font (index 0)\n ];\n private readonly fontKeys = new Map<string, number>();\n\n private readonly fills: FillOptions[] = [\n { patternType: \"none\" }, // default fill (index 0)\n { patternType: \"gray125\" }, // required fill (index 1)\n ];\n private readonly fillKeys = new Map<string, number>();\n\n private readonly borders: BorderSideOptions[] = [\n {}, // default empty border (index 0)\n ];\n private readonly borderKeys = new Map<string, number>();\n\n private readonly customNumFmts = new Map<string, number>();\n private nextCustomNumFmtId = 164; // custom numFmts start at 164\n\n private readonly cellXfs: Array<{\n readonly fontId: number;\n readonly fillId: number;\n readonly borderId: number;\n readonly numFmtId: number;\n readonly alignment?: AlignmentOptions;\n }> = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // default xf (index 0)\n ];\n private readonly cellXfKeys = new Map<string, number>();\n\n public constructor() {\n super(\"styleSheet\");\n\n // Pre-register default font/fill/border keys\n this.fontKeys.set(fontKey(this.fonts[0]), 0);\n this.fillKeys.set(fillKey(this.fills[0]), 0);\n this.fillKeys.set(fillKey(this.fills[1]), 1);\n this.borderKeys.set(borderKey(this.borders[0]), 0);\n this.cellXfKeys.set(this.cellXfKey(this.cellXfs[0]), 0);\n }\n\n /**\n * Register a style and return its index (for the cell `s` attribute).\n * Deduplicates across fonts, fills, borders, numFmts, and cellXfs.\n */\n public register(opts: StyleOptions): number {\n const fontId = this.registerFont(opts.font);\n const fillId = this.registerFill(opts.fill);\n const borderId = this.registerBorder(opts.border);\n const numFmtId = this.registerNumFmt(opts.numFmt);\n\n const xf = {\n fontId,\n fillId,\n borderId,\n numFmtId,\n alignment: opts.alignment,\n };\n\n const key = this.cellXfKey(xf);\n const existing = this.cellXfKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(xf);\n this.cellXfKeys.set(key, idx);\n return idx;\n }\n\n private registerFont(opts?: FontOptions): number {\n if (!opts) return 0;\n const key = fontKey(opts);\n const existing = this.fontKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fonts.length;\n this.fonts.push(opts);\n this.fontKeys.set(key, idx);\n return idx;\n }\n\n private registerFill(opts?: FillOptions): number {\n if (!opts) return 0;\n const key = fillKey(opts);\n const existing = this.fillKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fills.length;\n this.fills.push(opts);\n this.fillKeys.set(key, idx);\n return idx;\n }\n\n private registerBorder(opts?: BorderSideOptions): number {\n if (!opts) return 0;\n const key = borderKey(opts);\n const existing = this.borderKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.borders.length;\n this.borders.push(opts);\n this.borderKeys.set(key, idx);\n return idx;\n }\n\n private registerNumFmt(fmt?: string): number {\n if (!fmt) return 0;\n const builtin = BUILTIN_NUMFMTS[fmt];\n if (builtin !== undefined) return builtin;\n\n const existing = this.customNumFmts.get(fmt);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.customNumFmts.set(fmt, id);\n return id;\n }\n\n private cellXfKey(xf: {\n readonly fontId: number;\n readonly fillId: number;\n readonly borderId: number;\n readonly numFmtId: number;\n readonly alignment?: AlignmentOptions;\n }): string {\n const a = xf.alignment;\n const ak = a\n ? `h${a.horizontal ?? \"\"}v${a.vertical ?? \"\"}w${a.wrapText ? 1 : 0}r${a.textRotation ?? \"\"}i${a.indent ?? \"\"}`\n : \"\";\n return `${xf.fontId}|${xf.fillId}|${xf.borderId}|${xf.numFmtId}|${ak}`;\n }\n\n // ── XML generation ──\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(_context: Context): string {\n const p: string[] = [\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n p.push(`<numFmts count=\"${this.customNumFmts.size}\">`);\n for (const [fmt, id] of this.customNumFmts) {\n p.push(`<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXml(fmt)}\"/>`);\n }\n p.push(\"</numFmts>\");\n }\n\n // fonts\n p.push(`<fonts count=\"${this.fonts.length}\">`);\n for (const f of this.fonts) {\n p.push(`<font>${this.fontXmlStr(f)}</font>`);\n }\n p.push(\"</fonts>\");\n\n // fills\n p.push(`<fills count=\"${this.fills.length}\">`);\n for (const f of this.fills) {\n const patternAttrs = attrs({ patternType: f.patternType ?? \"solid\" });\n const fgColor = f.color ? `<fgColor rgb=\"FF${f.color}\"/>` : \"\";\n p.push(`<fill><patternFill${patternAttrs}>${fgColor}</patternFill></fill>`);\n }\n p.push(\"</fills>\");\n\n // borders\n p.push(`<borders count=\"${this.borders.length}\">`);\n for (const b of this.borders) {\n p.push(`<border>${this.borderXmlStr(b)}</border>`);\n }\n p.push(\"</borders>\");\n\n // cellStyleXfs\n p.push(\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>',\n );\n\n // cellXfs\n p.push(`<cellXfs count=\"${this.cellXfs.length}\">`);\n for (const xf of this.cellXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n };\n if (xf.alignment) xAttrs.applyAlignment = 1;\n if (xf.fontId > 0) xAttrs.applyFont = 1;\n if (xf.fillId > 0) xAttrs.applyFill = 1;\n if (xf.borderId > 0) xAttrs.applyBorder = 1;\n\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n p.push(`<xf${attrs(xAttrs)}>${alignStr}</xf>`);\n }\n p.push(\"</cellXfs>\");\n\n // cellStyles\n p.push('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n\n p.push(\"</styleSheet>\");\n return p.join(\"\");\n }\n\n private fontXmlStr(f: FontOptions): string {\n const parts: string[] = [];\n if (f.bold) parts.push(\"<b/>\");\n if (f.italic) parts.push(\"<i/>\");\n if (f.underline) parts.push(\"<u/>\");\n if (f.strike) parts.push(\"<strike/>\");\n if (f.size) parts.push(`<sz val=\"${f.size}\"/>`);\n if (f.color) parts.push(`<color rgb=\"FF${f.color}\"/>`);\n if (f.fontName) parts.push(`<name val=\"${escapeXml(f.fontName)}\"/>`);\n return parts.join(\"\");\n }\n\n private borderXmlStr(b: BorderSideOptions): string {\n const parts: string[] = [];\n for (const side of [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const) {\n const opts = b[side] as BorderOptions | undefined;\n if (opts && opts.style && opts.style !== \"none\") {\n const colorStr = opts.color ? `<color rgb=\"FF${opts.color}\"/>` : \"\";\n parts.push(`<${side} style=\"${opts.style}\">${colorStr}</${side}>`);\n } else {\n parts.push(`<${side}/>`);\n }\n }\n return parts.join(\"\");\n }\n\n private alignmentXmlStr(a: AlignmentOptions): string {\n const aAttrs: Record<string, string | number | boolean | undefined> = {};\n if (a.horizontal) aAttrs.horizontal = a.horizontal;\n if (a.vertical) aAttrs.vertical = a.vertical;\n if (a.wrapText) aAttrs.wrapText = 1;\n if (a.textRotation !== undefined) aAttrs.textRotation = a.textRotation;\n if (a.indent !== undefined) aAttrs.indent = a.indent;\n return `<alignment${attrs(aAttrs)}/>`;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n },\n },\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n const fmtElements: IXmlableObject[] = [{ _attr: { count: this.customNumFmts.size } }];\n for (const [fmt, id] of this.customNumFmts) {\n fmtElements.push({\n numFmt: { _attr: { numFmtId: id, formatCode: fmt } },\n });\n }\n children.push({ numFmts: fmtElements });\n }\n\n // fonts\n children.push(this.buildFonts());\n\n // fills\n children.push(this.buildFills());\n\n // borders\n children.push(this.buildBorders());\n\n // cellStyleXfs\n children.push({\n cellStyleXfs: [\n { _attr: { count: 1 } },\n { xf: [{ _attr: { numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 } }] },\n ],\n });\n\n // cellXfs\n children.push(this.buildCellXfs());\n\n // cellStyles\n children.push({\n cellStyles: [\n { _attr: { count: 1 } },\n { cellStyle: [{ _attr: { name: \"Normal\", xfId: 0, builtinId: 0 } }] },\n ],\n });\n\n return { styleSheet: children };\n }\n\n private buildFonts(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.fonts.length } }];\n for (const f of this.fonts) {\n elements.push({ font: this.fontXml(f) });\n }\n return { fonts: elements };\n }\n\n private fontXml(f: FontOptions): IXmlableObject[] {\n const parts: IXmlableObject[] = [];\n if (f.bold) parts.push({ b: [] });\n if (f.italic) parts.push({ i: [] });\n if (f.underline) parts.push({ u: [] });\n if (f.strike) parts.push({ strike: [] });\n if (f.size) parts.push({ sz: [{ _attr: { val: f.size } }] });\n if (f.color) parts.push({ color: [{ _attr: { rgb: `FF${f.color}` } }] });\n if (f.fontName) parts.push({ name: [{ _attr: { val: f.fontName } }] });\n return parts;\n }\n\n private buildFills(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.fills.length } }];\n for (const f of this.fills) {\n elements.push({\n fill: [\n {\n patternFill: [\n { _attr: { patternType: f.patternType ?? \"solid\" } },\n ...(f.color ? [{ fgColor: [{ _attr: { rgb: `FF${f.color}` } }] }] : []),\n ],\n },\n ],\n });\n }\n return { fills: elements };\n }\n\n private buildBorders(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.borders.length } }];\n for (const b of this.borders) {\n elements.push({ border: this.borderXml(b) });\n }\n return { borders: elements };\n }\n\n private borderXml(b: BorderSideOptions): IXmlableObject[] {\n const parts: IXmlableObject[] = [];\n for (const side of [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const) {\n const opts = b[side] as BorderOptions | undefined;\n if (opts && opts.style && opts.style !== \"none\") {\n const attrs: Record<string, string> = { style: opts.style };\n const children: IXmlableObject[] = [{ _attr: attrs }];\n if (opts.color) {\n children.push({ color: [{ _attr: { rgb: `FF${opts.color}` } }] });\n }\n parts.push({ [side]: children });\n } else {\n parts.push({ [side]: [] });\n }\n }\n return parts;\n }\n\n private buildCellXfs(): IXmlableObject {\n const elements: IXmlableObject[] = [{ _attr: { count: this.cellXfs.length } }];\n for (const xf of this.cellXfs) {\n const attrs: Record<string, string | number> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n };\n if (xf.alignment) {\n attrs.applyAlignment = 1;\n }\n if (xf.fontId > 0) attrs.applyFont = 1;\n if (xf.fillId > 0) attrs.applyFill = 1;\n if (xf.borderId > 0) attrs.applyBorder = 1;\n\n const children: IXmlableObject[] = [{ _attr: attrs }];\n if (xf.alignment) {\n children.push(this.alignmentXml(xf.alignment));\n }\n elements.push({ xf: children });\n }\n return { cellXfs: elements };\n }\n\n private alignmentXml(a: AlignmentOptions): IXmlableObject {\n const attrs: Record<string, string | number> = {};\n if (a.horizontal) attrs.horizontal = a.horizontal;\n if (a.vertical) attrs.vertical = a.vertical;\n if (a.wrapText) attrs.wrapText = 1;\n if (a.textRotation !== undefined) attrs.textRotation = a.textRotation;\n if (a.indent !== undefined) attrs.indent = a.indent;\n return { alignment: [{ _attr: attrs }] };\n }\n}\n","/**\n * Default theme for XLSX files — matches Microsoft Office's output structure.\n * Produces xl/theme/theme1.xml that Excel accepts without repair warnings.\n *\n * The theme XML is completely static — identical for every XLSX file.\n * Pre-serialized as a string constant to avoid building the IXmlableObject\n * tree and re-serializing on every compile.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\n// Pre-serialized theme XML. Generated once via xml(buildThemeObj()) and inlined.\n// To regenerate: run `pnpm tsx scripts/gen-theme.ts` from packages/xlsx.\nconst THEME_XML =\n '<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"5B9BD5\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"4472C4\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\" panose=\"020F0302020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\" panose=\"020F0502020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"103000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"100000\"/><a:satMod val=\"110000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"150000\"/><a:tint val=\"93000\"/><a:shade val=\"98000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"103000\"/><a:satMod val=\"130000\"/><a:tint val=\"98000\"/><a:shade val=\"90000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"120000\"/><a:shade val=\"63000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>';\n\nexport class DefaultTheme extends BaseXmlComponent {\n public constructor() {\n super(\"a:theme\");\n }\n\n /** Return pre-cached static theme XML — zero allocation. */\n public override toXml(_context: Context): string {\n return THEME_XML;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n // Re-expose the static XML as an IXmlableObject for backward compatibility.\n // This is only used if someone calls prepForXml() directly.\n return {\n \"a:theme\": [\n {\n _attr: {\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\",\n name: \"Office Theme\",\n },\n },\n ],\n };\n }\n}\n","/**\n * Workbook component — generates xl/workbook.xml.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\nexport interface SheetDefinition {\n readonly name: string;\n readonly sheetId: number;\n readonly rId: string;\n readonly state?: \"visible\" | \"hidden\" | \"veryHidden\";\n}\n\nexport class WorkbookXml extends BaseXmlComponent {\n private readonly sheets: readonly SheetDefinition[];\n\n public constructor(sheets: readonly SheetDefinition[]) {\n super(\"workbook\");\n this.sheets = sheets;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const sheetElements: IXmlableObject[] = [];\n for (const s of this.sheets) {\n const attrs: Record<string, string> = {\n name: s.name,\n sheetId: String(s.sheetId),\n \"r:id\": s.rId,\n };\n if (s.state && s.state !== \"visible\") {\n attrs.state = s.state;\n }\n sheetElements.push({ sheet: { _attr: attrs } });\n }\n\n return {\n workbook: [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n },\n { sheets: sheetElements },\n ],\n };\n }\n}\n","import type { SharedStrings } from \"@file/shared-strings\";\nimport type { Styles, StyleOptions } from \"@file/styles\";\n/**\n * Worksheet component — generates xl/worksheets/sheet{n}.xml.\n *\n * @module\n */\nimport { IgnoreIfEmptyXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\nimport type { ChartSpaceOptions } from \"@office-open/core\";\nimport { attrs, escapeXml, selfCloseElement } from \"@office-open/xml\";\n\nexport interface ColumnOptions {\n readonly min: number;\n readonly max: number;\n readonly width?: number;\n readonly hidden?: boolean;\n readonly customWidth?: boolean;\n}\n\nexport interface RowOptions {\n readonly cells?: readonly CellOptions[];\n readonly height?: number;\n readonly hidden?: boolean;\n readonly rowNumber?: number;\n}\n\nexport interface CellOptions {\n readonly value?: string | number | boolean | Date | null;\n readonly reference?: string;\n /** Direct style index (for pre-resolved styles) */\n readonly styleIndex?: number;\n /** Style options (resolved to index at compile time) */\n readonly style?: StyleOptions;\n}\n\nexport interface MergeCellOptions {\n readonly from: { readonly row: number; readonly col: number };\n readonly to: { readonly row: number; readonly col: number };\n}\n\nexport interface FreezePaneOptions {\n /** Row split position (1-based, freezes rows above) */\n readonly row?: number;\n /** Column split position (1-based, freezes columns to the left) */\n readonly col?: number;\n}\n\nexport interface WorksheetImageOptions {\n readonly data: Uint8Array;\n readonly type: \"png\" | \"jpeg\" | \"jpg\";\n readonly col: number;\n readonly row: number;\n}\n\nexport interface WorksheetChartOptions extends ChartSpaceOptions {\n /** 1-based column position for the chart */\n readonly col: number;\n /** 1-based row position for the chart */\n readonly row: number;\n}\n\nexport type DataValidationType =\n | \"none\"\n | \"whole\"\n | \"decimal\"\n | \"list\"\n | \"date\"\n | \"time\"\n | \"textLength\"\n | \"custom\";\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\nexport interface DataValidationOptions {\n /** Cell range, e.g. \"A1:A10\" */\n readonly sqref: string;\n readonly type?: DataValidationType;\n readonly operator?: DataValidationOperator;\n readonly formula1?: string;\n readonly formula2?: string;\n readonly allowBlank?: boolean;\n readonly showErrorMessage?: boolean;\n readonly errorTitle?: string;\n readonly error?: string;\n readonly showInputMessage?: boolean;\n readonly promptTitle?: string;\n readonly prompt?: string;\n}\n\nexport type ConditionalFormatType =\n | \"cellIs\"\n | \"containsText\"\n | \"expression\"\n | \"top10\"\n | \"aboveAverage\";\nexport type ConditionalFormatOperator =\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThanOrEqual\"\n | \"greaterThan\"\n | \"between\"\n | \"notBetween\"\n | \"containsText\"\n | \"notContains\"\n | \"beginsWith\"\n | \"endsWith\";\n\nexport interface ConditionalFormatRule {\n readonly type: ConditionalFormatType;\n readonly operator?: ConditionalFormatOperator;\n /** Formula(s) — up to 3 */\n readonly formulas?: readonly string[];\n readonly priority?: number;\n /** Reference to a dxf (differential format) in the styles table */\n readonly dxfId?: number;\n}\n\nexport interface ConditionalFormatOptions {\n /** Cell range, e.g. \"A1:A10\" */\n readonly sqref: string;\n readonly rules: readonly ConditionalFormatRule[];\n}\n\nexport interface WorksheetOptions {\n readonly name?: string;\n readonly children?: readonly RowOptions[];\n readonly columns?: readonly ColumnOptions[];\n readonly mergeCells?: readonly MergeCellOptions[];\n readonly freezePanes?: FreezePaneOptions;\n /** Auto-filter range, e.g. \"A1:D10\" */\n readonly autoFilter?: string;\n readonly images?: readonly WorksheetImageOptions[];\n readonly charts?: readonly WorksheetChartOptions[];\n readonly dataValidations?: readonly DataValidationOptions[];\n readonly conditionalFormats?: readonly ConditionalFormatOptions[];\n}\n\nexport class Worksheet extends IgnoreIfEmptyXmlComponent {\n private readonly rows: readonly RowOptions[];\n private readonly columns: readonly ColumnOptions[];\n private readonly mergeCells: readonly MergeCellOptions[];\n private readonly freezePanes?: FreezePaneOptions;\n private readonly autoFilter?: string;\n private readonly images: readonly WorksheetImageOptions[];\n private readonly chartOptions: readonly WorksheetChartOptions[];\n private readonly dataValidations: readonly DataValidationOptions[];\n private readonly conditionalFormats: readonly ConditionalFormatOptions[];\n\n public constructor(options: WorksheetOptions) {\n super(\"worksheet\");\n this.rows = options.children ?? [];\n this.columns = options.columns ?? [];\n this.mergeCells = options.mergeCells ?? [];\n this.freezePanes = options.freezePanes;\n this.autoFilter = options.autoFilter;\n this.images = options.images ?? [];\n this.chartOptions = options.charts ?? [];\n this.dataValidations = options.dataValidations ?? [];\n this.conditionalFormats = options.conditionalFormats ?? [];\n }\n\n public get imageOptions(): readonly WorksheetImageOptions[] {\n return this.images;\n }\n\n public get charts(): readonly WorksheetChartOptions[] {\n return this.chartOptions;\n }\n\n public override prepForXml(context: Context): IXmlableObject | undefined {\n const fileData = context.fileData as\n | { sharedStrings?: SharedStrings; styles?: Styles }\n | undefined;\n const sharedStrings = fileData?.sharedStrings;\n const styles = fileData?.styles;\n\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n },\n },\n ];\n\n // Sheet views (freeze panes) — must come before cols per XSD sequence\n if (this.freezePanes) {\n const fp = this.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = this.defaultCellRef(topRow, leftCol);\n const attr: Record<string, string | number> = {\n ySplit,\n xSplit,\n topLeftCell,\n activePane:\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\",\n state: \"frozen\",\n };\n children.push({\n sheetViews: [\n {\n sheetView: [\n { _attr: { tabSelected: 1, workbookViewId: 0 } },\n { pane: { _attr: attr } },\n ],\n },\n ],\n });\n }\n\n // Column definitions (after sheetViews, before sheetData)\n if (this.columns.length > 0) {\n const colElements: IXmlableObject[] = [];\n for (const col of this.columns) {\n const colAttrs: Record<string, string | number> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n colElements.push({ col: { _attr: colAttrs } });\n }\n children.push({ cols: colElements });\n }\n\n // Sheet data (rows + cells)\n const sheetDataChildren: IXmlableObject[] = [];\n for (let i = 0; i < this.rows.length; i++) {\n const rowOpts = this.rows[i];\n const rowNumber = rowOpts.rowNumber ?? i + 1;\n const rowAttrs: Record<string, string | number> = { r: rowNumber };\n if (rowOpts.height !== undefined) {\n rowAttrs.ht = rowOpts.height;\n rowAttrs.customHeight = 1;\n }\n if (rowOpts.hidden) {\n rowAttrs.hidden = 1;\n }\n\n const cellElements: IXmlableObject[] = [];\n if (rowOpts.cells) {\n for (let j = 0; j < rowOpts.cells.length; j++) {\n const cell = rowOpts.cells[j];\n const ref = cell.reference ?? this.defaultCellRef(rowNumber, j + 1);\n const cellObj = this.buildCell(ref, cell, sharedStrings, styles);\n if (cellObj) cellElements.push(cellObj);\n }\n }\n\n sheetDataChildren.push({ row: [{ _attr: rowAttrs }, ...cellElements] });\n }\n\n children.push({ sheetData: sheetDataChildren });\n\n // Auto filter (after sheetData, before mergeCells — per XSD sequence)\n if (this.autoFilter) {\n children.push({ autoFilter: { _attr: { ref: this.autoFilter } } });\n }\n\n // Merge cells (after autoFilter)\n if (this.mergeCells.length > 0) {\n const mergeElements: IXmlableObject[] = [{ _attr: { count: this.mergeCells.length } }];\n for (const mc of this.mergeCells) {\n const fromRef = this.defaultCellRef(mc.from.row, mc.from.col);\n const toRef = this.defaultCellRef(mc.to.row, mc.to.col);\n mergeElements.push({\n mergeCell: { _attr: { ref: `${fromRef}:${toRef}` } },\n });\n }\n children.push({ mergeCells: mergeElements });\n }\n\n // Conditional formatting (after autoFilter, before dataValidations)\n if (this.conditionalFormats.length > 0) {\n for (const cf of this.conditionalFormats) {\n const rules: IXmlableObject[] = [];\n for (let ri = 0; ri < cf.rules.length; ri++) {\n const rule = cf.rules[ri];\n const ruleAttrs: Record<string, string | number> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n\n const ruleChildren: IXmlableObject[] = [{ _attr: ruleAttrs }];\n\n if (rule.formulas) {\n for (const f of rule.formulas) {\n ruleChildren.push({ formula: [f] });\n }\n }\n rules.push({ cfRule: ruleChildren });\n }\n children.push({ conditionalFormatting: [{ _attr: { sqref: cf.sqref } }, ...rules] });\n }\n }\n\n // Data validations (after conditionalFormatting)\n if (this.dataValidations.length > 0) {\n const dvElements: IXmlableObject[] = [{ _attr: { count: this.dataValidations.length } }];\n for (const dv of this.dataValidations) {\n const dvAttrs: Record<string, string | number> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n\n const dvChildren: IXmlableObject[] = [{ _attr: dvAttrs }];\n if (dv.formula1 !== undefined) dvChildren.push({ formula1: [dv.formula1] });\n if (dv.formula2 !== undefined) dvChildren.push({ formula2: [dv.formula2] });\n dvElements.push({ dataValidation: dvChildren });\n }\n children.push({ dataValidations: dvElements });\n }\n\n return { worksheet: children };\n }\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the IXmlableObject intermediate tree entirely.\n */\n public override toXml(context: Context): string {\n const fileData = context.fileData as\n | { sharedStrings?: SharedStrings; styles?: Styles }\n | undefined;\n const sharedStrings = fileData?.sharedStrings;\n const styles = fileData?.styles;\n\n const p: string[] = [\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // Sheet views (freeze panes)\n if (this.freezePanes) {\n const fp = this.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = this.defaultCellRef(topRow, leftCol);\n const activePane =\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\";\n p.push(\n '<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\">',\n `<pane ySplit=\"${ySplit}\" xSplit=\"${xSplit}\" topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/>`,\n \"</sheetView></sheetViews>\",\n );\n }\n\n // Column definitions\n if (this.columns.length > 0) {\n p.push(\"<cols>\");\n for (const col of this.columns) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n p.push(selfCloseElement(\"col\", attrs(colAttrs)));\n }\n p.push(\"</cols>\");\n }\n\n // Sheet data (rows + cells) — the hot path\n p.push(\"<sheetData>\");\n for (let i = 0; i < this.rows.length; i++) {\n const rowOpts = this.rows[i];\n const rowNumber = rowOpts.rowNumber ?? i + 1;\n const rowAttrs: Record<string, string | number | boolean | undefined> = { r: rowNumber };\n if (rowOpts.height !== undefined) {\n rowAttrs.ht = rowOpts.height;\n rowAttrs.customHeight = 1;\n }\n if (rowOpts.hidden) {\n rowAttrs.hidden = 1;\n }\n\n if (rowOpts.cells) {\n const rowParts: string[] = [];\n for (let j = 0; j < rowOpts.cells.length; j++) {\n const cell = rowOpts.cells[j];\n const ref = cell.reference ?? this.defaultCellRef(rowNumber, j + 1);\n const cellStr = this.buildCellString(ref, cell, sharedStrings, styles);\n if (cellStr) rowParts.push(cellStr);\n }\n p.push(`<row${attrs(rowAttrs)}>`, ...rowParts, \"</row>\");\n } else {\n p.push(`<row${attrs(rowAttrs)}></row>`);\n }\n }\n p.push(\"</sheetData>\");\n\n // Auto filter\n if (this.autoFilter) {\n p.push(selfCloseElement(\"autoFilter\", attrs({ ref: this.autoFilter })));\n }\n\n // Merge cells\n if (this.mergeCells.length > 0) {\n p.push(`<mergeCells count=\"${this.mergeCells.length}\">`);\n for (const mc of this.mergeCells) {\n const fromRef = this.defaultCellRef(mc.from.row, mc.from.col);\n const toRef = this.defaultCellRef(mc.to.row, mc.to.col);\n p.push(selfCloseElement(\"mergeCell\", attrs({ ref: `${fromRef}:${toRef}` })));\n }\n p.push(\"</mergeCells>\");\n }\n\n // Conditional formatting\n if (this.conditionalFormats.length > 0) {\n for (const cf of this.conditionalFormats) {\n p.push(`<conditionalFormatting sqref=\"${cf.sqref}\">`);\n for (let ri = 0; ri < cf.rules.length; ri++) {\n const rule = cf.rules[ri];\n const ruleAttrs: Record<string, string | number | boolean | undefined> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n if (rule.formulas && rule.formulas.length > 0) {\n const formulaParts = rule.formulas.map((f) => `<formula>${escapeXml(f)}</formula>`);\n p.push(`<cfRule${attrs(ruleAttrs)}>`, ...formulaParts, \"</cfRule>\");\n } else {\n p.push(selfCloseElement(\"cfRule\", attrs(ruleAttrs)));\n }\n }\n p.push(\"</conditionalFormatting>\");\n }\n }\n\n // Data validations\n if (this.dataValidations.length > 0) {\n p.push(`<dataValidations count=\"${this.dataValidations.length}\">`);\n for (const dv of this.dataValidations) {\n const dvAttrs: Record<string, string | number | boolean | undefined> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n const inner: string[] = [];\n if (dv.formula1 !== undefined) inner.push(`<formula1>${escapeXml(dv.formula1)}</formula1>`);\n if (dv.formula2 !== undefined) inner.push(`<formula2>${escapeXml(dv.formula2)}</formula2>`);\n if (inner.length > 0) {\n p.push(`<dataValidation${attrs(dvAttrs)}>`, ...inner, \"</dataValidation>\");\n } else {\n p.push(selfCloseElement(\"dataValidation\", attrs(dvAttrs)));\n }\n }\n p.push(\"</dataValidations>\");\n }\n\n p.push(\"</worksheet>\");\n return p.join(\"\");\n }\n\n /**\n * Direct string serialization of a single cell — zero intermediate objects.\n */\n private buildCellString(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n ): string {\n const cellAttrs: Record<string, string | number | boolean | undefined> = { r: ref };\n\n // Resolve style\n if (cell.style !== undefined && styles) {\n cellAttrs.s = styles.register(cell.style);\n } else if (cell.styleIndex !== undefined) {\n cellAttrs.s = cell.styleIndex;\n }\n\n const value = cell.value;\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return selfCloseElement(\"c\", attrs(cellAttrs));\n }\n return \"\";\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n cellAttrs.t = \"s\";\n const idx = sharedStrings.register(value);\n return `<c${attrs(cellAttrs)}><v>${idx}</v></c>`;\n }\n cellAttrs.t = \"inlineStr\";\n return `<c${attrs(cellAttrs)}><is><t>${escapeXml(value)}</t></is></c>`;\n }\n\n if (typeof value === \"number\") {\n return `<c${attrs(cellAttrs)}><v>${value}</v></c>`;\n }\n\n if (typeof value === \"boolean\") {\n cellAttrs.t = \"b\";\n return `<c${attrs(cellAttrs)}><v>${value ? 1 : 0}</v></c>`;\n }\n\n if (value instanceof Date) {\n const serial = this.dateToSerialNumber(value);\n return `<c${attrs(cellAttrs)}><v>${serial}</v></c>`;\n }\n\n return \"\";\n }\n\n private defaultCellRef(row: number, col: number): string {\n return this.columnToLetter(col) + row;\n }\n\n private columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n }\n\n private buildCell(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n ): IXmlableObject | undefined {\n const attrs: Record<string, string | number> = { r: ref };\n\n // Resolve style: either direct index or register options\n if (cell.style !== undefined && styles) {\n attrs.s = styles.register(cell.style);\n } else if (cell.styleIndex !== undefined) {\n attrs.s = cell.styleIndex;\n }\n\n const value = cell.value;\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return { c: [{ _attr: attrs }] };\n }\n return undefined;\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n attrs.t = \"s\";\n const idx = sharedStrings.register(value);\n return { c: [{ _attr: attrs }, { v: [idx] }] };\n }\n // Fallback: inline string\n attrs.t = \"inlineStr\";\n return { c: [{ _attr: attrs }, { is: [{ t: [value] }] }] };\n }\n\n if (typeof value === \"number\") {\n return { c: [{ _attr: attrs }, { v: [value] }] };\n }\n\n if (typeof value === \"boolean\") {\n attrs.t = \"b\";\n return { c: [{ _attr: attrs }, { v: [value ? 1 : 0] }] };\n }\n\n if (value instanceof Date) {\n const serial = this.dateToSerialNumber(value);\n return { c: [{ _attr: attrs }, { v: [serial] }] };\n }\n\n return undefined;\n }\n\n private dateToSerialNumber(date: Date): number {\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n return (date.getTime() - epoch.getTime()) / msPerDay;\n }\n}\n","import { ContentTypes } from \"@file/content-types\";\nimport { CoreProperties, type CorePropertiesOptions } from \"@file/core-properties\";\nimport { Media } from \"@file/media/media\";\nimport { SharedStrings } from \"@file/shared-strings\";\nimport { Styles } from \"@file/styles\";\nimport { DefaultTheme } from \"@file/theme\";\nimport { WorkbookXml, type SheetDefinition } from \"@file/workbook\";\nimport { Worksheet, type WorksheetOptions } from \"@file/worksheet\";\n/**\n * File class (exported as Workbook) — the top-level container for XLSX documents.\n *\n * @module\n */\nimport { AppProperties, ChartCollection, Relationships } from \"@office-open/core\";\n\nexport interface WorkbookOptions extends CorePropertiesOptions {\n readonly worksheets?: readonly WorksheetOptions[];\n}\n\nexport class File {\n private readonly worksheetOptions: readonly WorksheetOptions[];\n private readonly corePropsOptions: CorePropertiesOptions;\n\n // Lazy components\n private _coreProperties?: CoreProperties;\n private _appProperties?: AppProperties;\n private _contentTypes?: ContentTypes;\n private _styles?: Styles;\n private _theme?: DefaultTheme;\n private _workbookXml?: WorkbookXml;\n private _worksheets?: Worksheet[];\n private _sharedStrings?: SharedStrings;\n private _media?: Media;\n private _fileRels?: Relationships;\n private _workbookRels?: Relationships;\n private _charts?: ChartCollection;\n\n public constructor(options: WorkbookOptions) {\n this.worksheetOptions = options.worksheets ?? [];\n this.corePropsOptions = options;\n }\n\n // ── Lazy getters ──\n\n public get coreProperties(): CoreProperties {\n return (this._coreProperties ??= new CoreProperties(this.corePropsOptions));\n }\n\n public get appProperties(): AppProperties {\n return (this._appProperties ??= new AppProperties());\n }\n\n public get contentTypes(): ContentTypes {\n if (!this._contentTypes) {\n this._contentTypes = new ContentTypes();\n for (let i = 0; i < this.worksheetOptions.length; i++) {\n this._contentTypes.addWorksheet(i + 1);\n }\n this._contentTypes.addStyles();\n this._contentTypes.addSharedStrings();\n this._contentTypes.addTheme();\n }\n return this._contentTypes;\n }\n\n public get styles(): Styles {\n return (this._styles ??= new Styles());\n }\n\n public get theme(): DefaultTheme {\n return (this._theme ??= new DefaultTheme());\n }\n\n public get workbookXml(): WorkbookXml {\n if (!this._workbookXml) {\n const sheets: SheetDefinition[] = this.worksheetOptions.map((ws, i) => ({\n name: ws.name ?? `Sheet${i + 1}`,\n sheetId: i + 1,\n rId: `rId${i + 1}`,\n }));\n this._workbookXml = new WorkbookXml(sheets);\n }\n return this._workbookXml;\n }\n\n public get sharedStrings(): SharedStrings {\n return (this._sharedStrings ??= new SharedStrings());\n }\n\n public get media(): Media {\n return (this._media ??= new Media());\n }\n\n public get charts(): ChartCollection {\n return (this._charts ??= new ChartCollection());\n }\n\n public get worksheets(): readonly Worksheet[] {\n if (!this._worksheets) {\n this._worksheets = this.worksheetOptions.map((ws) => new Worksheet(ws));\n }\n return this._worksheets;\n }\n\n public get fileRelationships(): Relationships {\n if (!this._fileRels) {\n this._fileRels = new Relationships();\n this._fileRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n \"xl/workbook.xml\",\n );\n this._fileRels.addRelationship(\n 2,\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n \"docProps/core.xml\",\n );\n this._fileRels.addRelationship(\n 3,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n \"docProps/app.xml\",\n );\n }\n return this._fileRels;\n }\n\n public get workbookRelationships(): Relationships {\n if (!this._workbookRels) {\n this._workbookRels = new Relationships();\n let rid = 1;\n for (let i = 0; i < this.worksheetOptions.length; i++) {\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n this._workbookRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n \"sharedStrings.xml\",\n );\n }\n return this._workbookRels;\n }\n}\n","/**\n * XLSX Drawing component — generates xl/drawings/drawing{n}.xml.\n *\n * Uses the spreadsheetDrawing namespace (default, no prefix) for anchoring\n * images and charts to worksheet cells.\n *\n * @module\n */\nimport { BaseXmlComponent } from \"@file/xml-components\";\nimport type { Context, IXmlableObject } from \"@file/xml-components\";\n\nexport interface ImageOptions {\n /** 1-based column */\n readonly col: number;\n /** Column offset in EMU (default 0) */\n readonly colOffset?: number;\n /** 1-based row */\n readonly row: number;\n /** Row offset in EMU (default 0) */\n readonly rowOffset?: number;\n /** Relationship ID for the image */\n readonly rId: string;\n}\n\nexport interface ChartAnchorOptions {\n /** 1-based column */\n readonly col: number;\n /** Column offset in EMU (default 0) */\n readonly colOffset?: number;\n /** 1-based row */\n readonly row: number;\n /** Row offset in EMU (default 0) */\n readonly rowOffset?: number;\n /** Relationship ID for the chart */\n readonly rId: string;\n}\n\nconst XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst A_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst C_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\n\nexport class Drawing extends BaseXmlComponent {\n private readonly images: readonly ImageOptions[];\n private readonly charts: readonly ChartAnchorOptions[];\n\n public constructor(images: readonly ImageOptions[], charts: readonly ChartAnchorOptions[] = []) {\n super(\"wsDr\");\n this.images = images;\n this.charts = charts;\n }\n\n public override prepForXml(_context: Context): IXmlableObject {\n const children: IXmlableObject[] = [\n {\n _attr: {\n xmlns: XDR_NS,\n \"xmlns:a\": A_NS,\n \"xmlns:r\": R_NS,\n },\n },\n ];\n\n let nextId = 1;\n for (const img of this.images) {\n children.push(this.buildImageAnchor(img, nextId++));\n }\n\n for (const chart of this.charts) {\n children.push(this.buildChartAnchor(chart, nextId++));\n }\n\n return { wsDr: children };\n }\n\n private buildFromAnchor(\n col: number,\n row: number,\n colOffset?: number,\n rowOffset?: number,\n ): IXmlableObject {\n return {\n from: [\n { col: [col - 1] },\n { colOff: [colOffset ?? 0] },\n { row: [row - 1] },\n { rowOff: [rowOffset ?? 0] },\n ],\n };\n }\n\n private buildToAnchor(col: number, row: number): IXmlableObject {\n return {\n to: [{ col: [col] }, { colOff: [0] }, { row: [row] }, { rowOff: [0] }],\n };\n }\n\n private buildImageAnchor(img: ImageOptions, id: number): IXmlableObject {\n return {\n twoCellAnchor: [\n { _attr: { editAs: \"oneCell\" } },\n this.buildFromAnchor(img.col, img.row, img.colOffset, img.rowOffset),\n this.buildToAnchor(img.col, img.row),\n {\n pic: [\n {\n nvPicPr: [\n { cNvPr: { _attr: { id, name: `Picture ${id}` } } },\n { cNvPicPr: [{ _attr: { preferRelativeResize: 1 } }] },\n ],\n },\n {\n blipFill: [\n { \"a:blip\": { _attr: { \"r:embed\": img.rId } } },\n { \"a:stretch\": [{ \"a:fillRect\": [] }] },\n ],\n },\n {\n spPr: [\n {\n \"a:xfrm\": [\n { \"a:off\": { _attr: { x: 0, y: 0 } } },\n { \"a:ext\": { _attr: { cx: 400000, cy: 300000 } } },\n ],\n },\n { \"a:prstGeom\": [{ _attr: { prst: \"rect\" } }, { \"a:avLst\": [] }] },\n ],\n },\n ],\n },\n { clientData: [] },\n ],\n };\n }\n\n private buildChartAnchor(chart: ChartAnchorOptions, id: number): IXmlableObject {\n return {\n twoCellAnchor: [\n { _attr: { editAs: \"oneCell\" } },\n this.buildFromAnchor(chart.col, chart.row, chart.colOffset, chart.rowOffset),\n this.buildToAnchor(chart.col + 8, chart.row + 15),\n {\n graphicFrame: [\n {\n nvGraphicFramePr: [\n { cNvPr: { _attr: { id, name: `Chart ${id}` } } },\n { cNvGraphicFramePr: [{ \"a:graphicFrameLocks\": { _attr: { noGrp: 1 } } }] },\n ],\n },\n {\n xfrm: [\n { \"a:off\": { _attr: { x: 0, y: 0 } } },\n { \"a:ext\": { _attr: { cx: 0, cy: 0 } } },\n ],\n },\n {\n \"a:graphic\": [\n {\n \"a:graphicData\": [\n { _attr: { uri: C_URI } },\n {\n \"c:chart\": {\n _attr: {\n \"xmlns:c\": \"http://schemas.openxmlformats.org/drawingml/2006/chart\",\n \"xmlns:r\": R_NS,\n \"r:id\": chart.rId,\n },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n { clientData: [] },\n ],\n };\n }\n}\n","/**\n * XLSX Compiler — compiles a File object into a Zippable structure.\n *\n * @module\n */\nimport { Formatter } from \"@export/formatter\";\nimport { Drawing, type ImageOptions, type ChartAnchorOptions } from \"@file/drawing/drawing\";\nimport type { File } from \"@file/file\";\nimport type { Context } from \"@file/xml-components\";\nimport {\n ChartSpace,\n Relationships,\n compileMapping,\n type XmlifyedFile,\n type Zippable,\n} from \"@office-open/core\";\n\nexport class Compiler {\n private readonly formatter = new Formatter();\n\n public compile(file: File, overrides: readonly XmlifyedFile[] = []): Zippable {\n const context: Context = { fileData: file, stack: [] };\n const f = this.formatter;\n\n const mapping: Record<string, { data: string; path: string }> = {};\n\n const fmt = (component: any, declaration?: boolean | object) =>\n f.formatToXml(component, context, declaration);\n\n // Core properties\n mapping[\"Properties\"] = {\n data: fmt(file.coreProperties, true),\n path: \"docProps/core.xml\",\n };\n\n // App properties\n mapping[\"AppProperties\"] = {\n data: fmt(file.appProperties, true),\n path: \"docProps/app.xml\",\n };\n\n // File-level relationships (_rels/.rels)\n mapping[\"FileRelationships\"] = {\n data: fmt(file.fileRelationships),\n path: \"_rels/.rels\",\n };\n\n // Workbook\n mapping[\"Workbook\"] = {\n data: fmt(file.workbookXml, true),\n path: \"xl/workbook.xml\",\n };\n\n // Workbook relationships\n mapping[\"WorkbookRelationships\"] = {\n data: fmt(file.workbookRelationships),\n path: \"xl/_rels/workbook.xml.rels\",\n };\n\n // Worksheets — formatted BEFORE SharedStrings so strings are registered\n const worksheets = file.worksheets;\n let globalMediaIdx = 0;\n let globalChartIdx = 0;\n\n for (let i = 0; i < worksheets.length; i++) {\n const ws = worksheets[i];\n const imgOpts = ws.imageOptions;\n const chartOpts = ws.charts;\n\n // Worksheet uses toXml() fast path (zero-allocation string concat)\n let sheetXml = fmt(ws, true);\n\n const hasMedia = imgOpts.length > 0 || chartOpts.length > 0;\n\n if (hasMedia) {\n const drawingImages: ImageOptions[] = [];\n const drawingCharts: ChartAnchorOptions[] = [];\n const drawingRels = new Relationships();\n let rid = 1;\n\n // Process images\n for (const img of imgOpts) {\n const mediaKey = `image_${globalMediaIdx}`;\n const ext = img.type === \"jpeg\" || img.type === \"jpg\" ? \"jpeg\" : \"png\";\n file.media.addImage(mediaKey, {\n fileName: `image${globalMediaIdx + 1}.${ext}`,\n type: ext,\n data: img.data,\n width: 0,\n height: 0,\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `../media/image${globalMediaIdx + 1}.${ext}`,\n );\n\n drawingImages.push({\n col: img.col,\n row: img.row,\n rId: `rId${rid}`,\n });\n rid++;\n globalMediaIdx++;\n }\n\n // Process charts\n for (const chart of chartOpts) {\n const chartKey = `chart_${globalChartIdx}`;\n file.charts.addChart(chartKey, {\n key: chartKey,\n chartSpace: new ChartSpace(chart),\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${globalChartIdx + 1}.xml`,\n );\n\n drawingCharts.push({\n col: chart.col,\n row: chart.row,\n rId: `rId${rid}`,\n });\n rid++;\n globalChartIdx++;\n }\n\n // Generate drawing XML\n const drawing = new Drawing(drawingImages, drawingCharts);\n const drawingIdx = i + 1;\n mapping[`Drawing${i}`] = {\n data: fmt(drawing, true),\n path: `xl/drawings/drawing${drawingIdx}.xml`,\n };\n\n // Drawing relationships\n mapping[`DrawingRels${i}`] = {\n data: fmt(drawingRels),\n path: `xl/drawings/_rels/drawing${drawingIdx}.xml.rels`,\n };\n\n // Insert drawing reference before the closing </worksheet> tag.\n // Use slice instead of replace to avoid O(n) full-string scan.\n const closingTag = \"</worksheet>\";\n sheetXml =\n sheetXml.slice(0, -closingTag.length) + `<drawing r:id=\"rId${rid}\"/>` + closingTag;\n\n // Worksheet needs its own rels for drawing reference\n const wsRels = new Relationships();\n wsRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${drawingIdx}.xml`,\n );\n mapping[`WorksheetRels${i}`] = {\n data: fmt(wsRels),\n path: `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n };\n\n file.contentTypes.addDrawing(drawingIdx);\n }\n\n mapping[`Worksheet${i}`] = {\n data: sheetXml,\n path: `xl/worksheets/sheet${i + 1}.xml`,\n };\n }\n\n // Shared Strings — AFTER worksheets so all strings are collected\n const sharedStrings = file.sharedStrings;\n if (sharedStrings.count > 0) {\n mapping[\"SharedStrings\"] = {\n data: fmt(sharedStrings, true),\n path: \"xl/sharedStrings.xml\",\n };\n }\n\n // Styles\n mapping[\"Styles\"] = {\n data: fmt(file.styles, true),\n path: \"xl/styles.xml\",\n };\n\n // Theme\n mapping[\"Theme\"] = {\n data: fmt(file.theme, true),\n path: \"xl/theme/theme1.xml\",\n };\n\n // Charts — AFTER worksheets so charts are registered\n for (let i = 0; i < file.charts.array.length; i++) {\n const chartData = file.charts.array[i];\n mapping[`Chart${i}`] = {\n data: fmt(chartData.chartSpace, true),\n path: `xl/charts/chart${i + 1}.xml`,\n };\n file.contentTypes.addChart(i + 1);\n }\n\n // Content Types — must be last\n mapping[\"ContentTypes\"] = {\n data: fmt(file.contentTypes),\n path: \"[Content_Types].xml\",\n };\n\n // Convert mapping to Zippable\n const mediaFiles = file.media.array.map((img) => ({\n data: img.data,\n path: `xl/media/${img.fileName}`,\n }));\n\n return compileMapping(mapping, overrides, mediaFiles);\n }\n}\n","import type { File } from \"@file/file\";\n/**\n * Packer module — export API for XLSX files.\n *\n * @module\n */\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\n\nimport { Compiler } from \"./next-compiler\";\n\nconst compiler = new Compiler();\n\nexport const Packer = createPacker<File>({\n compile: (file, overrides) => compiler.compile(file, overrides),\n mimeType: OoxmlMimeType.XLSX,\n});\n","/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert Excel column letter(s) to a 1-based column number.\n * \"A\" → 1, \"Z\" → 26, \"AA\" → 27\n */\nexport function letterToColumn(s: string): number {\n let result = 0;\n for (let i = 0; i < s.length; i++) {\n result = result * 26 + (s.charCodeAt(i) - 64);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n","/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport { parseArchive, parseCorePropsElement } from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, findChild, textOf } from \"@office-open/xml\";\nimport { toUint8Array } from \"undio\";\nimport type { DataType } from \"undio\";\n\nimport type { WorkbookOptions } from \"./file/file\";\nimport type {\n WorksheetOptions,\n RowOptions,\n CellOptions,\n ColumnOptions,\n MergeCellOptions,\n} from \"./file/worksheet\";\nimport { letterToColumn } from \"./util\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/core-properties\")) coreProps = target;\n else if (type.includes(\"/extended-properties\")) appProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n };\n}\n\n// ── Shared strings helper ──\n\nfunction parseSharedStrings(el: Element | undefined): string[] {\n if (!el) return [];\n const strings: string[] = [];\n for (const si of el.elements ?? []) {\n if (si.name !== \"si\") continue;\n // Handle both <si><t>text</t></si> and <si><r><t>text</t></r>...</si>\n const t = findChild(si, \"t\");\n if (t) {\n strings.push(textOf(t) ?? \"\");\n } else {\n // Rich text: concatenate all <r><t> segments\n const parts: string[] = [];\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findChild(r, \"t\");\n if (rt) parts.push(textOf(rt) ?? \"\");\n }\n strings.push(parts.join(\"\"));\n }\n }\n return strings;\n}\n\n// ── Cell reference helpers ──\n\nfunction colFromRef(ref: string): number {\n const match = ref.match(/^([A-Z]+)/);\n return match ? letterToColumn(match[1]) : 1;\n}\n\nfunction rowFromRef(ref: string): number {\n const match = ref.match(/(\\d+)$/);\n return match ? parseInt(match[1], 10) : 1;\n}\n\n// ── Worksheet parsing ──\n\nfunction parseWorksheetElement(wsEl: Element, strings: string[]): WorksheetOptions {\n const opts: Record<string, unknown> = {};\n\n // Sheet name from the parent workbook's sheet element (not available here)\n // Caller should set it\n\n // Columns\n // Elements might be prefixed or unprefixed depending on how the XML parser handles default namespaces.\n const colsEl = findChild(wsEl, \"cols\") ?? findChildByLocalName(wsEl, \"cols\");\n if (colsEl) {\n const columns: ColumnOptions[] = [];\n for (const col of colsEl.elements ?? []) {\n if (localName(col) !== \"col\") continue;\n const min = attrNum(col, \"min\");\n const max = attrNum(col, \"max\");\n if (min === undefined || max === undefined) continue;\n const colOpts: Record<string, unknown> = { min, max };\n const width = attrNum(col, \"width\");\n if (width !== undefined) colOpts.width = width;\n if (attr(col, \"hidden\") === \"1\") colOpts.hidden = true;\n columns.push(colOpts as unknown as ColumnOptions);\n }\n if (columns.length > 0) opts.columns = columns;\n }\n\n // Freeze panes\n const sheetViews = findChildByLocalName(wsEl, \"sheetViews\");\n if (sheetViews) {\n const sheetView = findChildByLocalName(sheetViews, \"sheetView\");\n if (sheetView) {\n const pane = findChildByLocalName(sheetView, \"pane\");\n if (pane) {\n const state = attr(pane, \"state\");\n if (state === \"frozen\") {\n const freezePanes: Record<string, unknown> = {};\n const ySplit = attrNum(pane, \"ySplit\");\n const xSplit = attrNum(pane, \"xSplit\");\n if (ySplit && ySplit > 0) freezePanes.row = ySplit;\n if (xSplit && xSplit > 0) freezePanes.col = xSplit;\n if (Object.keys(freezePanes).length > 0) opts.freezePanes = freezePanes;\n }\n }\n }\n }\n\n // Sheet data (rows)\n const sheetData = findChildByLocalName(wsEl, \"sheetData\");\n const rows: RowOptions[] = [];\n if (sheetData) {\n for (const rowEl of sheetData.elements ?? []) {\n if (localName(rowEl) !== \"row\") continue;\n const rowNumber = attrNum(rowEl, \"r\");\n const rowOpts: Record<string, unknown> = {};\n if (rowNumber !== undefined) rowOpts.rowNumber = rowNumber;\n\n const ht = attrNum(rowEl, \"ht\");\n if (ht !== undefined) rowOpts.height = ht;\n if (attr(rowEl, \"hidden\") === \"1\") rowOpts.hidden = true;\n\n const cells: CellOptions[] = [];\n for (const cellEl of rowEl.elements ?? []) {\n if (localName(cellEl) !== \"c\") continue;\n const ref = attr(cellEl, \"r\");\n const type = attr(cellEl, \"t\");\n const cellOpts: Record<string, unknown> = {};\n if (ref) cellOpts.reference = ref;\n\n const styleIdx = attrNum(cellEl, \"s\");\n if (styleIdx !== undefined) cellOpts.styleIndex = styleIdx;\n\n // Cell value\n const vEl = findChildByLocalName(cellEl, \"v\");\n const isEl = findChildByLocalName(cellEl, \"is\");\n\n if (type === \"s\" && vEl) {\n // Shared string\n const idx = parseInt(textOf(vEl) ?? \"\", 10);\n cellOpts.value = strings[idx] ?? \"\";\n } else if (type === \"b\" && vEl) {\n cellOpts.value = textOf(vEl) === \"1\";\n } else if (type === \"inlineStr\" && isEl) {\n const t = findChildByLocalName(isEl, \"t\");\n cellOpts.value = textOf(t) ?? \"\";\n } else if (vEl) {\n const raw = textOf(vEl) ?? \"\";\n const num = Number(raw);\n cellOpts.value = isNaN(num) ? raw : num;\n }\n\n cells.push(cellOpts as CellOptions);\n }\n\n rowOpts.cells = cells;\n rows.push(rowOpts as RowOptions);\n }\n }\n opts.children = rows;\n\n // Merge cells\n const mergeCellsEl = findChildByLocalName(wsEl, \"mergeCells\");\n if (mergeCellsEl) {\n const mergeCells: MergeCellOptions[] = [];\n for (const mc of mergeCellsEl.elements ?? []) {\n if (localName(mc) !== \"mergeCell\") continue;\n const ref = attr(mc, \"ref\");\n if (!ref) continue;\n const parts = ref.split(\":\");\n if (parts.length === 2) {\n mergeCells.push({\n from: { row: rowFromRef(parts[0]), col: colFromRef(parts[0]) },\n to: { row: rowFromRef(parts[1]), col: colFromRef(parts[1]) },\n });\n }\n }\n if (mergeCells.length > 0) opts.mergeCells = mergeCells;\n }\n\n // Auto filter\n const autoFilterEl = findChildByLocalName(wsEl, \"autoFilter\");\n if (autoFilterEl) {\n const ref = attr(autoFilterEl, \"ref\");\n if (ref) opts.autoFilter = ref;\n }\n\n return opts as WorksheetOptions;\n}\n\n// ── Helpers ──\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findChildByLocalName(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n const xlsx = parseXlsx(data);\n\n const opts: Record<string, unknown> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision) opts.revision = parseInt(cp.revision, 10);\n }\n }\n\n // Shared strings\n const strings = parseSharedStrings(xlsx.sharedStrings);\n\n // Sheet names from workbook\n const sheetNames: string[] = [];\n if (xlsx.workbook) {\n const sheetsEl = findChildByLocalName(xlsx.workbook, \"sheets\");\n if (sheetsEl) {\n for (const s of sheetsEl.elements ?? []) {\n if (localName(s) !== \"sheet\") continue;\n sheetNames.push(attr(s, \"name\") ?? \"\");\n }\n }\n }\n\n // Parse worksheets\n const worksheets: WorksheetOptions[] = [];\n for (let i = 0; i < xlsx.worksheets.length; i++) {\n const wsPath = xlsx.worksheets[i];\n const wsEl = xlsx.doc.get(wsPath);\n if (!wsEl) continue;\n\n const wsOpts = parseWorksheetElement(wsEl, strings) as Record<string, unknown>;\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n return opts as WorkbookOptions;\n}\n","/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - Replaces placeholders in the shared strings table (most common)\n * - Replaces placeholders in inline strings within worksheet cells\n *\n * @module\n */\nimport { OoxmlMimeType, unzipSync, zipAndConvert, strFromU8, toJson } from \"@office-open/core\";\nimport type { OutputByType, OutputType } from \"@office-open/core\";\nimport { js2xml } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { toUint8Array } from \"undio\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\nexport type InputDataType = Buffer | string | number[] | Uint8Array | ArrayBuffer | Blob;\n\nexport type PatchDocumentOutputType = OutputType;\n\nexport const PatchType = {\n CELL: \"cell\",\n} as const;\n\nexport interface CellPatch {\n /** Replacement value (string, number, boolean, or Date) */\n readonly value: string | number | boolean | Date;\n}\n\nexport type IPatch = CellPatch;\n\nexport interface PatchWorkbookOptions<T extends PatchDocumentOutputType = PatchDocumentOutputType> {\n readonly outputType: T;\n readonly data: InputDataType;\n readonly patches: Readonly<Record<string, IPatch>>;\n readonly placeholderDelimiters?: Readonly<{\n readonly start: string;\n readonly end: string;\n }>;\n}\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * Placeholders are matched in shared strings and inline strings.\n * For string replacements, the shared string value is updated in-place.\n * For non-string replacements, the cell type and value are updated.\n */\nexport const patchWorkbook = async <T extends PatchDocumentOutputType = PatchDocumentOutputType>({\n outputType,\n data,\n patches,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n const { start, end } = placeholderDelimiters;\n\n // Build placeholder → patch map\n const patchMap = new Map<string, IPatch>();\n for (const [key, patch] of Object.entries(patches)) {\n patchMap.set(`${start}${key}${end}`, patch);\n }\n\n // 1. Patch shared strings\n const sst = xmlMap.get(\"xl/sharedStrings.xml\");\n if (sst) {\n patchSharedStrings(sst, patchMap);\n }\n\n // 2. Patch inline strings in worksheets\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) patchWorksheetInlineStrings(ws, patchMap);\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n for (const [key, value] of xmlMap) {\n files[key] = encoder.encode(js2xml(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, IPatch>): void {\n // toJson returns {elements: [{name: \"sst\", ...}]} — unwrap to actual root\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, IPatch>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Check inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nfunction patchTextElement(tEl: Element, patchMap: Map<string, IPatch>): void {\n const text = tEl.elements?.[0]?.text;\n if (typeof text !== \"string\") return;\n\n for (const [placeholder, patch] of patchMap) {\n if (text.includes(placeholder)) {\n const newValue = String(patch.value);\n const replaced = text.replace(placeholder, newValue);\n if (tEl.elements) {\n tEl.elements[0] = { ...tEl.elements[0], text: replaced };\n }\n }\n }\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n"],"mappings":"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"}
|