@office-open/xlsx 0.9.0 → 0.9.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-a1lzscdy.mjs","names":[],"sources":["../src/parts/shared-strings.ts","../src/parts/styles.ts","../src/parts/worksheet.ts","../src/parts/content-types.ts","../src/parts/media.ts","../src/context.ts"],"sourcesContent":["/**\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 type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { escapeXml, findChild, textOf } from \"@office-open/xml\";\n\nimport type { RichTextOptions } from \"./worksheet\";\n\n/** String or rich text entry in the SST. */\ntype SstEntry = string | RichTextOptions;\n\n/**\n * Build rich text run properties XML (CT_RPrElt).\n * Exported for reuse by Comments and other components.\n */\nexport function buildRPrXml(\n pr: NonNullable<RichTextOptions[\"runs\"]>[number][\"properties\"],\n): string {\n if (!pr) return \"\";\n const parts: string[] = [];\n if (pr.font) parts.push(`<rFont val=\"${escapeXml(pr.font)}\"/>`);\n if (pr.charset !== undefined) parts.push(`<charset val=\"${pr.charset}\"/>`);\n if (pr.family !== undefined) parts.push(`<family val=\"${pr.family}\"/>`);\n if (pr.bold) parts.push(\"<b/>\");\n if (pr.italic) parts.push(\"<i/>\");\n if (pr.strike) parts.push(\"<strike/>\");\n if (pr.outline) parts.push(\"<outline/>\");\n if (pr.shadow) parts.push(\"<shadow/>\");\n if (pr.condense) parts.push(\"<condense/>\");\n if (pr.extend) parts.push(\"<extend/>\");\n if (pr.color) {\n // ST_UnsignedIntHex requires 8 hex chars (AARRGGBB).\n // Auto-prefix FF (fully opaque) when user provides 6-char RGB.\n const rgb = pr.color.length === 6 ? `FF${pr.color}` : pr.color;\n parts.push(`<color rgb=\"${escapeXml(rgb)}\"/>`);\n }\n if (pr.size !== undefined) parts.push(`<sz val=\"${pr.size}\"/>`);\n if (pr.underline) {\n if (pr.underline === \"none\") {\n parts.push(\"<u/>\");\n } else {\n parts.push(`<u val=\"${pr.underline}\"/>`);\n }\n }\n if (pr.vertAlign) parts.push(`<vertAlign val=\"${pr.vertAlign}\"/>`);\n if (pr.scheme) parts.push(`<scheme val=\"${pr.scheme}\"/>`);\n return parts.length > 0 ? `<rPr>${parts.join(\"\")}</rPr>` : \"\";\n}\n\n/** Build a CT_Rst XML string from RichTextOptions. */\nexport function buildRstXml(rst: RichTextOptions): string {\n const parts: string[] = [];\n if (rst.runs && rst.runs.length > 0) {\n for (const run of rst.runs) {\n const rPr = buildRPrXml(run.properties);\n parts.push(`<r>${rPr}<t>${escapeXml(run.text)}</t></r>`);\n }\n } else if (rst.text !== undefined) {\n parts.push(`<t>${escapeXml(rst.text)}</t>`);\n }\n // rPh (phonetics)\n if (rst.phonetics) {\n for (const ph of rst.phonetics) {\n parts.push(`<rPh sb=\"${ph.sb}\" eb=\"${ph.eb}\"><t>${escapeXml(ph.text)}</t></rPh>`);\n }\n }\n return parts.join(\"\");\n}\n\nexport class SharedStrings {\n private entries: SstEntry[] = [];\n /** Dedup map for plain strings only. Rich text is not deduped. */\n private indexMap = new Map<string, number>();\n\n /**\n * Register a plain 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.entries.length;\n this.entries.push(s);\n this.indexMap.set(s, idx);\n return idx;\n }\n\n /**\n * Register a rich text entry and return its index.\n * Rich text is not deduped (each call creates a new entry).\n */\n public registerRich(rst: RichTextOptions): number {\n const idx = this.entries.length;\n this.entries.push(rst);\n return idx;\n }\n\n public get count(): number {\n return this.entries.length;\n }\n\n /** Return a serializable snapshot for the descriptor. */\n public toDescriptorOptions(): { entries: SstEntry[]; uniqueCount: number } {\n return { entries: this.entries, uniqueCount: this.indexMap.size };\n }\n\n /** Serialize to xl/sharedStrings.xml content (without XML declaration). */\n public serialize(): string {\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${this.entries.length}\" uniqueCount=\"${this.indexMap.size}\">`,\n ];\n for (const entry of this.entries) {\n if (typeof entry === \"string\") {\n p.push(`<si><t>${escapeXml(entry)}</t></si>`);\n } else {\n // Rich text (CT_Rst)\n p.push(`<si>${buildRstXml(entry)}</si>`);\n }\n }\n p.push(\"</sst>\");\n return p.join(\"\");\n }\n}\n\n// ── Descriptor Types ──\n\n/** Serializable snapshot of the shared string table. */\nexport interface SharedStringsDocOptions {\n /** All entries (plain strings and rich text), in registration order. */\n entries: (string | RichTextOptions)[];\n /** Number of unique plain-string entries (for uniqueCount attribute). */\n uniqueCount: number;\n}\n\n// ── Descriptor ──\n\nexport const sharedStringsDesc: CustomDescriptor<SharedStringsDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.entries.length === 0) return undefined;\n\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${opts.entries.length}\" uniqueCount=\"${opts.uniqueCount}\">`,\n ];\n\n for (const entry of opts.entries) {\n if (typeof entry === \"string\") {\n p.push(`<si><t>${escapeXml(entry)}</t></si>`);\n } else {\n p.push(`<si>${buildRstXml(entry)}</si>`);\n }\n }\n\n p.push(\"</sst>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const entries: (string | RichTextOptions)[] = [];\n\n for (const si of el.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findChild(si, \"t\");\n if (t) {\n entries.push(textOf(t) ?? \"\");\n continue;\n }\n\n // Rich text: <si><r>...</r>...</si>\n const runs: { text: string }[] = [];\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findChild(r, \"t\");\n if (rt) {\n runs.push({ text: textOf(rt) ?? \"\" });\n }\n }\n if (runs.length > 0) {\n entries.push({ runs });\n }\n }\n\n return {\n entries,\n uniqueCount: entries.length,\n } as Record<string, unknown>;\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 type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, findChild, attr, attrNum } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\n// ── Sub-style option interfaces ──\n\nexport interface FontOptions {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n size?: number;\n color?: string;\n font?: string;\n /** Character set (CT_Font/charset @val) */\n charset?: number;\n /** Font family (CT_Font/family @val) */\n family?: number;\n /** Condense (macOS, CT_Font/condense) */\n condense?: boolean;\n /** Extend (macOS, CT_Font/extend) */\n extend?: boolean;\n /** Vertical alignment: superscript/subscript (CT_Font/vertAlign @val) */\n vertAlign?: \"superscript\" | \"subscript\" | \"baseline\";\n /** Font scheme (CT_Font/scheme @val) */\n scheme?: \"major\" | \"minor\" | \"none\";\n /** Font shadow (CT_Font/shadow) */\n shadow?: boolean;\n /** Font outline (CT_Font/outline) */\n outline?: boolean;\n}\n\n/** Gradient stop (CT_GradientStop) */\nexport interface GradientStopOptions {\n /** Position (0.0–1.0) */\n position: number;\n /** RGB color hex without alpha, e.g. \"FF0000\" */\n color: string;\n}\n\nexport interface FillOptions {\n type?: \"solid\" | \"pattern\" | \"gradient\";\n color?: string;\n patternType?: string;\n /** Background color for pattern fill (CT_PatternFill/bgColor) */\n bgColor?: string;\n /** Background color indexed (CT_Color @indexed) */\n colorIndexed?: number;\n /** Gradient stops (CT_GradientFill/stop) */\n stops?: GradientStopOptions[];\n /** Gradient type (CT_GradientFill @type) */\n gradientType?: \"linear\" | \"path\";\n /** Gradient degree for linear (CT_GradientFill @degree) */\n gradientDegree?: number;\n /** Gradient left position for path (CT_GradientFill @left) */\n gradientLeft?: number;\n /** Gradient right position for path (CT_GradientFill @right) */\n gradientRight?: number;\n /** Gradient top position for path (CT_GradientFill @top) */\n gradientTop?: number;\n /** Gradient bottom position for path (CT_GradientFill @bottom) */\n gradientBottom?: number;\n}\n\nexport interface BorderOptions {\n style?: \"thin\" | \"medium\" | \"thick\" | \"dotted\" | \"dashed\" | \"hair\" | \"none\";\n color?: string;\n}\n\nexport interface BorderSideOptions {\n top?: BorderOptions;\n bottom?: BorderOptions;\n left?: BorderOptions;\n right?: BorderOptions;\n diagonal?: BorderOptions;\n /** Diagonal up (CT_Border @diagonalUp) — on the parent border element */\n diagonalUp?: boolean;\n /** Diagonal down (CT_Border @diagonalDown) — on the parent border element */\n diagonalDown?: boolean;\n /** Leading edge border (CT_Border/start, for RTL support) */\n start?: BorderOptions;\n /** Trailing edge border (CT_Border/end, for RTL support) */\n end?: BorderOptions;\n /** Vertical inner border (CT_Border/vertical, for cell range borders) */\n vertical?: BorderOptions;\n /** Horizontal inner border (CT_Border/horizontal, for cell range borders) */\n horizontal?: BorderOptions;\n}\n\nexport interface AlignmentOptions {\n horizontal?: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\";\n vertical?: \"top\" | \"center\" | \"bottom\";\n wrapText?: boolean;\n textRotation?: number;\n indent?: number;\n /** Relative indent (CT_CellAlignment @relativeIndent) */\n relativeIndent?: number;\n /** Justify last line (CT_CellAlignment @justifyLastLine) */\n justifyLastLine?: boolean;\n /** Shrink to fit (CT_CellAlignment @shrinkToFit) */\n shrinkToFit?: boolean;\n /** Reading order (CT_CellAlignment @readingOrder) */\n readingOrder?: number;\n}\n\nexport interface StyleOptions {\n font?: FontOptions;\n fill?: FillOptions;\n border?: BorderSideOptions;\n numFmt?: string;\n alignment?: AlignmentOptions;\n /** Quote prefix (CT_Xf @quotePrefix) */\n quotePrefix?: boolean;\n /** Pivot button (CT_Xf @pivotButton) */\n pivotButton?: boolean;\n /** Apply protection (CT_Xf @applyProtection) */\n applyProtection?: boolean;\n /** Cell protection (CT_CellProtection) */\n protection?: CellProtectionOptions;\n}\n\n/** Cell-level protection settings (CT_CellProtection) */\nexport interface CellProtectionOptions {\n /** Cell is locked (CT_CellProtection @locked) */\n locked?: boolean;\n /** Cell formula is hidden (CT_CellProtection @hidden) */\n hidden?: boolean;\n}\n\n/** Indexed color entry (CT_RgbColor) */\nexport interface IndexedColorOptions {\n /** RGB hex value, e.g. \"FF000000\" */\n rgb: string;\n}\n\n/** Colors palette (CT_Colors) */\nexport interface ColorsOptions {\n /** Indexed color palette (CT_IndexedColors) */\n indexedColors?: IndexedColorOptions[];\n /** Most recently used colors (CT_MRUColors) */\n mruColors?: string[];\n}\n\n/** Differential format — used by conditional formatting to specify what changes. */\nexport interface DxfOptions {\n font?: FontOptions;\n fill?: FillOptions;\n border?: BorderSideOptions;\n numFmt?: string;\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.font ?? \"\"}cs${f.charset ?? \"\"}fm${f.family ?? \"\"}co${f.condense ? 1 : 0}ex${f.extend ? 1 : 0}va${f.vertAlign ?? \"\"}sc${f.scheme ?? \"\"}sh${f.shadow ? 1 : 0}ol${f.outline ? 1 : 0}`;\n}\n\nfunction fillKey(f: FillOptions): string {\n return `t${f.type ?? \"\"}c${f.color ?? \"\"}p${f.patternType ?? \"\"}bg${f.bgColor ?? \"\"}g${f.stops?.map((s) => `${s.position}_${s.color}`).join(\"|\") ?? \"\"}`;\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)}du${b.diagonalUp ? 1 : 0}dd${b.diagonalDown ? 1 : 0}st${sk(b.start)}en${sk(b.end)}v${sk(b.vertical)}h${sk(b.horizontal)}`;\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\n/** Table style element type (ST_TableStyleType). */\nexport type TableStyleElementType =\n | \"wholeTable\"\n | \"headerRow\"\n | \"totalRow\"\n | \"firstColumn\"\n | \"lastColumn\"\n | \"firstRowStripe\"\n | \"secondRowStripe\"\n | \"firstColumnStripe\"\n | \"secondColumnStripe\"\n | \"firstHeaderCell\"\n | \"lastHeaderCell\"\n | \"firstTotalCell\"\n | \"lastTotalCell\"\n | \"subtotalRow1\"\n | \"subtotalRow2\"\n | \"subtotalRow3\"\n | \"subtotalColumn1\"\n | \"subtotalColumn2\"\n | \"subtotalColumn3\"\n | \"blankRow\"\n | \"firstColumnSubheading\"\n | \"secondColumnSubheading\"\n | \"thirdColumnSubheading\"\n | \"firstRowSubheading\"\n | \"secondRowSubheading\"\n | \"thirdRowSubheading\"\n | \"pageFieldLabels\"\n | \"pageFieldValues\";\n\n/** Table style element (CT_TableStyleElement). */\nexport interface TableStyleElementOptions {\n /** Element type */\n type: TableStyleElementType;\n /** Differential format index (dxf) */\n dxfId?: number;\n /** Button style (for pivot tables) */\n button?: boolean;\n}\n\n/** Custom table/pivot table style (CT_TableStyle). */\n/** Style sheet extension (CT_Extension) */\nexport interface StyleExtensionOptions {\n /** Extension URI (required) */\n uri: string;\n /** Extension content (raw XML fragment) */\n content?: string;\n}\n\nexport interface CustomTableStyleOptions {\n /** Style name (must be unique) */\n name: string;\n /** Pivot style (vs table style) */\n pivot?: boolean;\n /** Table style elements */\n elements?: TableStyleElementOptions[];\n}\n\n/** Custom cell style (CT_CellStyle) */\nexport interface CustomCellStyleOptions {\n /** Style name */\n name: string;\n /** XF index to apply */\n xfId: number;\n /** Built-in ID */\n builtinId?: number;\n /** Custom built-in (CT_CellStyle @customBuiltin) */\n customBuiltin?: boolean;\n /** Outline level (CT_CellStyle @iLevel) */\n iLevel?: number;\n /** Hidden style (CT_CellStyle @hidden) */\n hidden?: boolean;\n}\n\n/** Cell XF entry exposed by Styles.toDescriptorOptions(). */\nexport interface CellXfEntry {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n}\n\n/** Snapshot of Styles internal state for descriptor-based XML generation. */\nexport interface StylesState {\n customNumFmts: ReadonlyMap<string, number>;\n fonts: FontOptions[];\n fills: FillOptions[];\n borders: BorderSideOptions[];\n cellXfs: CellXfEntry[];\n dxfs: DxfOptions[];\n colors?: ColorsOptions;\n tableStyles?: CustomTableStyleOptions[];\n customCellStyles?: CustomCellStyleOptions[];\n styleExtensions?: StyleExtensionOptions[];\n}\n\nexport class Styles {\n private fonts: FontOptions[] = [\n { size: 11, font: \"Calibri\" }, // default font (index 0)\n ];\n private fontKeys = new Map<string, number>();\n\n private fills: FillOptions[] = [\n { patternType: \"none\" }, // default fill (index 0)\n { patternType: \"gray125\" }, // required fill (index 1)\n ];\n private fillKeys = new Map<string, number>();\n\n private borders: BorderSideOptions[] = [\n {}, // default empty border (index 0)\n ];\n private borderKeys = new Map<string, number>();\n\n private customNumFmts = new Map<string, number>();\n private nextCustomNumFmtId = 164; // custom numFmts start at 164\n\n private cellXfs: Array<{\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n }> = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // default xf (index 0)\n ];\n private cellXfKeys = new Map<string, number>();\n\n private dxfs: DxfOptions[] = [];\n\n private colors?: ColorsOptions;\n private tableStyles?: CustomTableStyleOptions[];\n /** Custom cell styles (CT_CellStyles) */\n private customCellStyles?: CustomCellStyleOptions[];\n /** Style sheet extensions (CT_ExtensionList) */\n private styleExtensions?: StyleExtensionOptions[];\n\n public constructor() {\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 quotePrefix: opts.quotePrefix,\n pivotButton: opts.pivotButton,\n applyProtection: opts.applyProtection,\n protection: opts.protection,\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 /**\n * Register a differential format and return its index (dxfId).\n * Used by conditional formatting rules.\n */\n public registerDxf(opts: DxfOptions): number {\n const idx = this.dxfs.length;\n this.dxfs.push(opts);\n return idx;\n }\n\n /**\n * Set color palette (indexed colors and MRU colors).\n */\n public setColors(opts: ColorsOptions): void {\n this.colors = opts;\n }\n\n public setTableStyles(styles: CustomTableStyleOptions[]): void {\n this.tableStyles = styles;\n }\n\n public setExtensions(extensions: StyleExtensionOptions[]): void {\n this.styleExtensions = extensions;\n }\n\n public setCustomCellStyles(styles: CustomCellStyleOptions[]): void {\n this.customCellStyles = styles;\n }\n\n /**\n * Expose internal state for descriptor-based XML generation.\n * The descriptor reads this snapshot to produce xl/styles.xml.\n */\n public toDescriptorOptions(): StylesState {\n return {\n customNumFmts: new Map(this.customNumFmts),\n fonts: [...this.fonts],\n fills: [...this.fills],\n borders: [...this.borders],\n cellXfs: [...this.cellXfs],\n dxfs: [...this.dxfs],\n colors: this.colors,\n tableStyles: this.tableStyles,\n customCellStyles: this.customCellStyles,\n styleExtensions: this.styleExtensions,\n };\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 fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\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 ?? \"\"}ri${a.relativeIndent ?? \"\"}jl${a.justifyLastLine ? 1 : 0}st${a.shrinkToFit ? 1 : 0}ro${a.readingOrder ?? \"\"}`\n : \"\";\n const pr = xf.protection;\n const pk = pr ? `l${pr.locked ?? \"\"}h${pr.hidden ?? \"\"}` : \"\";\n return `${xf.fontId}|${xf.fillId}|${xf.borderId}|${xf.numFmtId}|${ak}|qp${xf.quotePrefix ? 1 : 0}|pb${xf.pivotButton ? 1 : 0}|${pk}`;\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 /** Serialize to xl/styles.xml content (without XML declaration). */\n public serialize(): 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 if (f.type === \"gradient\" && f.stops && f.stops.length > 0) {\n const gfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (f.gradientType && f.gradientType !== \"linear\") gfAttrs.type = f.gradientType;\n if (f.gradientDegree !== undefined) gfAttrs.degree = f.gradientDegree;\n if (f.gradientLeft !== undefined) gfAttrs.left = f.gradientLeft;\n if (f.gradientRight !== undefined) gfAttrs.right = f.gradientRight;\n if (f.gradientTop !== undefined) gfAttrs.top = f.gradientTop;\n if (f.gradientBottom !== undefined) gfAttrs.bottom = f.gradientBottom;\n const stopParts = f.stops\n .map((s) => `<stop position=\"${s.position}\"><color rgb=\"FF${s.color}\"/></stop>`)\n .join(\"\");\n p.push(`<fill><gradientFill${attrs(gfAttrs)}>${stopParts}</gradientFill></fill>`);\n } else {\n const patternAttrs = attrs({ patternType: f.patternType ?? \"solid\" });\n const fgColor = f.color\n ? `<fgColor rgb=\"FF${f.color}\"/>`\n : f.colorIndexed !== undefined\n ? `<fgColor indexed=\"${f.colorIndexed}\"/>`\n : \"\";\n const bgColor = f.bgColor ? `<bgColor rgb=\"FF${f.bgColor}\"/>` : \"\";\n const colorContent = fgColor + bgColor;\n p.push(\n colorContent\n ? `<fill><patternFill${patternAttrs}>${colorContent}</patternFill></fill>`\n : `<fill><patternFill${patternAttrs}/></fill>`,\n );\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 const bAttrs: string[] = [];\n if (b.diagonalUp) bAttrs.push('diagonalUp=\"1\"');\n if (b.diagonalDown) bAttrs.push('diagonalDown=\"1\"');\n const bAttr = bAttrs.length ? ` ${bAttrs.join(\" \")}` : \"\";\n p.push(`<border${bAttr}>${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 if (xf.numFmtId > 0) xAttrs.applyNumberFormat = 1;\n if (xf.quotePrefix) xAttrs.quotePrefix = 1;\n if (xf.pivotButton) xAttrs.pivotButton = 1;\n if (xf.applyProtection) xAttrs.applyProtection = 1;\n if (xf.protection) xAttrs.applyProtection = xAttrs.applyProtection ?? 1;\n\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n const protStr = xf.protection ? this.protectionXmlStr(xf.protection) : \"\";\n const inner = alignStr + protStr;\n p.push(inner ? `<xf${attrs(xAttrs)}>${inner}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellXfs>\");\n\n // cellStyles\n if (this.customCellStyles && this.customCellStyles.length > 0) {\n const csAttrs: string[] = [`count=\"${this.customCellStyles.length + 1}\"`];\n const csParts: string[] = [`<cellStyles ${csAttrs.join(\" \")}>`];\n csParts.push('<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>');\n for (const cs of this.customCellStyles) {\n const attrs: string[] = [`name=\"${escapeXml(cs.name)}\"`, `xfId=\"${cs.xfId}\"`];\n if (cs.builtinId !== undefined) attrs.push(`builtinId=\"${cs.builtinId}\"`);\n if (cs.customBuiltin) attrs.push('customBuiltin=\"1\"');\n if (cs.iLevel !== undefined) attrs.push(`iLevel=\"${cs.iLevel}\"`);\n if (cs.hidden) attrs.push('hidden=\"1\"');\n csParts.push(`<cellStyle ${attrs.join(\" \")}/>`);\n }\n csParts.push(\"</cellStyles>\");\n p.push(csParts.join(\"\"));\n } else {\n p.push(\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>',\n );\n }\n\n // dxfs\n if (this.dxfs.length > 0) {\n p.push(`<dxfs count=\"${this.dxfs.length}\">`);\n for (const dxf of this.dxfs) {\n const dParts: string[] = [];\n if (dxf.font) dParts.push(`<font>${this.fontXmlStr(dxf.font)}</font>`);\n if (dxf.fill) {\n const bgColor = dxf.fill.color ? `<bgColor rgb=\"FF${dxf.fill.color}\"/>` : \"\";\n const patAttrs = attrs({ patternType: dxf.fill.patternType ?? \"solid\" });\n dParts.push(`<fill><patternFill${patAttrs}>${bgColor}</patternFill></fill>`);\n }\n if (dxf.numFmt) dParts.push(`<numFmt formatCode=\"${escapeXml(dxf.numFmt)}\"/>`);\n if (dxf.border) dParts.push(`<border>${this.borderXmlStr(dxf.border)}</border>`);\n if (dParts.length > 0) {\n p.push(`<dxf>${dParts.join(\"\")}</dxf>`);\n } else {\n p.push(\"<dxf/>\");\n }\n }\n p.push(\"</dxfs>\");\n } else {\n p.push('<dxfs count=\"0\"/>');\n }\n // tableStyles (CT_TableStyles)\n if (this.tableStyles && this.tableStyles.length > 0) {\n const tsParts: string[] = [\n `<tableStyles count=\"${this.tableStyles.length}\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\">`,\n ];\n for (const ts of this.tableStyles) {\n const tsAttrs: string[] = [`name=\"${escapeXml(ts.name)}\"`];\n if (ts.pivot) tsAttrs.push('pivot=\"1\"');\n if (ts.elements && ts.elements.length > 0) {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}>`);\n for (const el of ts.elements) {\n const elAttrs: string[] = [`type=\"${el.type}\"`];\n if (el.dxfId !== undefined) elAttrs.push(`dxfId=\"${el.dxfId}\"`);\n if (el.button) elAttrs.push('button=\"1\"');\n tsParts.push(`<tableStyleElement ${elAttrs.join(\" \")}/>`);\n }\n tsParts.push(\"</tableStyle>\");\n } else {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}/>`);\n }\n }\n tsParts.push(\"</tableStyles>\");\n p.push(tsParts.join(\"\"));\n } else {\n p.push(\n '<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>',\n );\n }\n\n // colors (optional color palette)\n if (this.colors) {\n const c = this.colors;\n const colorParts: string[] = [\"<colors>\"];\n if (c.indexedColors && c.indexedColors.length > 0) {\n colorParts.push(\"<indexedColors>\");\n for (const ic of c.indexedColors) {\n colorParts.push(`<rgbColor rgb=\"${ic.rgb}\"/>`);\n }\n colorParts.push(\"</indexedColors>\");\n }\n if (c.mruColors && c.mruColors.length > 0) {\n colorParts.push(\"<mruColors>\");\n for (const mc of c.mruColors) {\n colorParts.push(`<color rgb=\"FF${mc}\"/>`);\n }\n colorParts.push(\"</mruColors>\");\n }\n colorParts.push(\"</colors>\");\n p.push(colorParts.join(\"\"));\n }\n\n // extLst — style sheet extensions\n if (this.styleExtensions && this.styleExtensions.length > 0) {\n const extParts: string[] = [\"<extLst>\"];\n for (const ext of this.styleExtensions) {\n if (ext.content) {\n extParts.push(`<ext uri=\"${ext.uri}\">${ext.content}</ext>`);\n } else {\n extParts.push(`<ext uri=\"${ext.uri}\"/>`);\n }\n }\n extParts.push(\"</extLst>\");\n p.push(extParts.join(\"\"));\n } else {\n p.push(\"<extLst/>\");\n }\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.outline) parts.push(\"<outline/>\");\n if (f.shadow) parts.push(\"<shadow/>\");\n if (f.condense) parts.push(\"<condense/>\");\n if (f.extend) parts.push(\"<extend/>\");\n if (f.size) parts.push(`<sz val=\"${f.size}\"/>`);\n if (f.color) parts.push(`<color rgb=\"FF${f.color}\"/>`);\n if (f.font) parts.push(`<name val=\"${escapeXml(f.font)}\"/>`);\n if (f.charset !== undefined) parts.push(`<charset val=\"${f.charset}\"/>`);\n if (f.family !== undefined) parts.push(`<family val=\"${f.family}\"/>`);\n if (f.vertAlign) parts.push(`<vertAlign val=\"${f.vertAlign}\"/>`);\n if (f.scheme) parts.push(`<scheme val=\"${f.scheme}\"/>`);\n return parts.join(\"\");\n }\n\n private borderXmlStr(b: BorderSideOptions): string {\n const parts: string[] = [];\n const renderSide = (name: string, opts: BorderOptions | undefined, required = true) => {\n if (opts && opts.style && opts.style !== \"none\") {\n const colorStr = opts.color ? `<color rgb=\"FF${opts.color}\"/>` : \"\";\n parts.push(`<${name} style=\"${opts.style}\">${colorStr}</${name}>`);\n } else if (required) {\n parts.push(`<${name}/>`);\n }\n };\n for (const side of [\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"diagonal\",\n \"vertical\",\n \"horizontal\",\n ] as const) {\n renderSide(side, b[side] as BorderOptions | undefined);\n }\n // start/end not in transitional XSD — only emit when styled\n renderSide(\"start\", b.start, false);\n renderSide(\"end\", b.end, false);\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 if (a.relativeIndent !== undefined) aAttrs.relativeIndent = a.relativeIndent;\n if (a.justifyLastLine) aAttrs.justifyLastLine = 1;\n if (a.shrinkToFit) aAttrs.shrinkToFit = 1;\n if (a.readingOrder !== undefined) aAttrs.readingOrder = a.readingOrder;\n return `<alignment${attrs(aAttrs)}/>`;\n }\n\n private protectionXmlStr(pr: CellProtectionOptions): string {\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (pr.locked !== undefined) prAttrs.locked = pr.locked ? 1 : 0;\n if (pr.hidden !== undefined) prAttrs.hidden = pr.hidden ? 1 : 0;\n return `<protection${attrs(prAttrs)}/>`;\n }\n}\n\n// ── Descriptor Types ──\n\nexport interface StylesDocOptions {\n /** The Styles accumulator instance (for stringify). */\n styles: Styles;\n}\n\n// ── Descriptor ──\n\nexport const stylesDesc: CustomDescriptor<StylesDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return opts.styles.serialize();\n },\n\n parse(el, _ctx) {\n const result: Record<string, unknown> = {};\n\n // numFmts\n const numFmtsEl = findChild(el, \"numFmts\");\n if (numFmtsEl) {\n const numFmts: Record<string, number> = {};\n for (const nf of numFmtsEl.elements ?? []) {\n if (nf.name !== \"numFmt\") continue;\n const id = attrNum(nf, \"numFmtId\");\n const code = attr(nf, \"formatCode\");\n if (id !== undefined && code) numFmts[code] = id;\n }\n result.customNumFmts = numFmts;\n }\n\n // fonts\n const fontsEl = findChild(el, \"fonts\");\n if (fontsEl) {\n const fonts: FontOptions[] = [];\n for (const f of fontsEl.elements ?? []) {\n if (f.name !== \"font\") continue;\n fonts.push(parseFont(f));\n }\n result.fonts = fonts;\n }\n\n // fills\n const fillsEl = findChild(el, \"fills\");\n if (fillsEl) {\n const fills: FillOptions[] = [];\n for (const f of fillsEl.elements ?? []) {\n if (f.name !== \"fill\") continue;\n fills.push(parseFill(f));\n }\n result.fills = fills;\n }\n\n // borders\n const bordersEl = findChild(el, \"borders\");\n if (bordersEl) {\n const borders: BorderSideOptions[] = [];\n for (const b of bordersEl.elements ?? []) {\n if (b.name !== \"border\") continue;\n borders.push(parseBorder(b));\n }\n result.borders = borders;\n }\n\n // cellXfs\n const cellXfsEl = findChild(el, \"cellXfs\");\n if (cellXfsEl) {\n const xfs: StyleOptions[] = [];\n for (const xf of cellXfsEl.elements ?? []) {\n if (xf.name !== \"xf\") continue;\n const fontId = attrNum(xf, \"fontId\") ?? 0;\n const fillId = attrNum(xf, \"fillId\") ?? 0;\n const borderId = attrNum(xf, \"borderId\") ?? 0;\n const numFmtId = attrNum(xf, \"numFmtId\") ?? 0;\n\n const alignmentEl = findChild(xf, \"alignment\");\n const alignment = alignmentEl ? parseAlignment(alignmentEl) : undefined;\n\n const protectionEl = findChild(xf, \"protection\");\n const protection = protectionEl ? parseProtection(protectionEl) : undefined;\n\n const style: Record<string, unknown> = {};\n if (fontId > 0) style.fontIdx = fontId;\n if (fillId > 0) style.fillIdx = fillId;\n if (borderId > 0) style.borderIdx = borderId;\n if (numFmtId > 0) style.numFmtIdx = numFmtId;\n if (alignment) style.alignment = alignment;\n if (protection) style.protection = protection;\n if (attr(xf, \"quotePrefix\") === \"1\") style.quotePrefix = true;\n if (attr(xf, \"pivotButton\") === \"1\") style.pivotButton = true;\n\n xfs.push(style as StyleOptions);\n }\n result.cellXfs = xfs;\n }\n\n return result as Record<string, unknown>;\n },\n};\n\n// ── Parse helpers ──\n\nfunction parseFont(el: XmlElement): FontOptions {\n const result: Record<string, unknown> = {};\n for (const child of el.elements ?? []) {\n switch (child.name) {\n case \"b\":\n result.bold = true;\n break;\n case \"i\":\n result.italic = true;\n break;\n case \"u\":\n result.underline = true;\n break;\n case \"strike\":\n result.strike = true;\n break;\n case \"outline\":\n result.outline = true;\n break;\n case \"shadow\":\n result.shadow = true;\n break;\n case \"condense\":\n result.condense = true;\n break;\n case \"extend\":\n result.extend = true;\n break;\n case \"sz\":\n result.size = attrNum(child, \"val\");\n break;\n case \"color\":\n result.color = parseColorHex(child);\n break;\n case \"name\":\n result.font = attr(child, \"val\") ?? undefined;\n break;\n case \"charset\":\n result.charset = attrNum(child, \"val\");\n break;\n case \"family\":\n result.family = attrNum(child, \"val\");\n break;\n case \"vertAlign\":\n result.vertAlign = (attr(child, \"val\") as FontOptions[\"vertAlign\"]) ?? undefined;\n break;\n case \"scheme\":\n result.scheme = (attr(child, \"val\") as FontOptions[\"scheme\"]) ?? undefined;\n break;\n }\n }\n return result as FontOptions;\n}\n\nfunction parseFill(el: XmlElement): FillOptions {\n const patternFill = findChild(el, \"patternFill\");\n if (patternFill) {\n const result: Record<string, unknown> = {};\n result.patternType = attr(patternFill, \"patternType\") ?? undefined;\n const fg = findChild(patternFill, \"fgColor\");\n if (fg) result.color = parseColorHex(fg);\n const bg = findChild(patternFill, \"bgColor\");\n if (bg) result.bgColor = parseColorHex(bg);\n const indexed = fg ? attrNum(fg, \"indexed\") : undefined;\n if (indexed !== undefined) result.colorIndexed = indexed;\n return result as FillOptions;\n }\n\n const gradientFill = findChild(el, \"gradientFill\");\n if (gradientFill) {\n const result: Record<string, unknown> = { type: \"gradient\" };\n const gType = attr(gradientFill, \"type\");\n if (gType) result.gradientType = gType as FillOptions[\"gradientType\"];\n const degree = attrNum(gradientFill, \"degree\");\n if (degree !== undefined) result.gradientDegree = degree;\n const stops: { position: number; color: string }[] = [];\n for (const s of gradientFill.elements ?? []) {\n if (s.name !== \"stop\") continue;\n const pos = attrNum(s, \"position\");\n const color = findChild(s, \"color\");\n if (pos !== undefined && color) {\n stops.push({ position: pos, color: parseColorHex(color) ?? \"\" });\n }\n }\n if (stops.length > 0) result.stops = stops;\n return result as FillOptions;\n }\n\n return {} as FillOptions;\n}\n\nfunction parseBorder(el: XmlElement): BorderSideOptions {\n const result: Record<string, unknown> = {};\n if (attr(el, \"diagonalUp\") === \"1\") result.diagonalUp = true;\n if (attr(el, \"diagonalDown\") === \"1\") result.diagonalDown = true;\n\n for (const side of [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const) {\n const sideEl = findChild(el, side);\n if (sideEl) {\n const opts: Record<string, unknown> = {};\n const style = attr(sideEl, \"style\");\n if (style) opts.style = style as BorderOptions[\"style\"];\n const color = findChild(sideEl, \"color\");\n if (color) opts.color = parseColorHex(color);\n if (Object.keys(opts).length > 0) result[side] = opts;\n }\n }\n\n return result as BorderSideOptions;\n}\n\nfunction parseAlignment(el: XmlElement): AlignmentOptions {\n const result: Record<string, unknown> = {};\n const h = attr(el, \"horizontal\");\n if (h) result.horizontal = h as AlignmentOptions[\"horizontal\"];\n const v = attr(el, \"vertical\");\n if (v) result.vertical = v as AlignmentOptions[\"vertical\"];\n if (attr(el, \"wrapText\") === \"1\") result.wrapText = true;\n const rotation = attrNum(el, \"textRotation\");\n if (rotation !== undefined) result.textRotation = rotation;\n const indent = attrNum(el, \"indent\");\n if (indent !== undefined) result.indent = indent;\n return result as AlignmentOptions;\n}\n\nfunction parseProtection(el: XmlElement): CellProtectionOptions {\n const result: Record<string, unknown> = {};\n const locked = attr(el, \"locked\");\n if (locked !== undefined) result.locked = locked !== \"0\";\n const hidden = attr(el, \"hidden\");\n if (hidden !== undefined) result.hidden = hidden !== \"0\";\n return result as CellProtectionOptions;\n}\n\nfunction parseColorHex(el: XmlElement): string | undefined {\n const rgb = attr(el, \"rgb\");\n if (rgb) {\n // Strip alpha prefix if present (FF000000 → 000000)\n return rgb.length === 8 ? rgb.slice(2) : rgb;\n }\n return undefined;\n}\n","/**\n * Worksheet XML generation — pure functions for xl/worksheets/sheet{n}.xml.\n *\n * All interfaces and the zero-allocation string concatenation fast path\n * are preserved. The `Worksheet` class has been replaced by `buildWorksheetXml()`.\n *\n * @module\n */\n\nimport { derivePasswordHash } from \"@office-open/core\";\nimport type { ChartSpaceOptions } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, selfCloseElement } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\nimport { findChild, attr, attrNum, textOf } from \"@office-open/xml\";\n\nimport type { PivotTableOptions } from \"./pivot\";\nimport { buildRstXml } from \"./shared-strings\";\nimport type { SharedStrings } from \"./shared-strings\";\nimport type { Styles, StyleOptions } from \"./styles\";\nimport type { TableOptions } from \"./table\";\n\n// ── Option interfaces ──\n\nexport interface ColumnOptions {\n min: number;\n max: number;\n width?: number;\n hidden?: boolean;\n customWidth?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n /** Best-fit column width (CT_Col @bestFit) */\n bestFit?: boolean;\n /** Phonetic text for CJK (CT_Col @phonetic) */\n phonetic?: boolean;\n}\n\nexport interface RowOptions {\n cells?: CellOptions[];\n height?: number;\n hidden?: boolean;\n rowNumber?: number;\n /** Spans for the row, e.g. \"1:15\" (CT_Row @spans) */\n spans?: string;\n /** Custom format applied (CT_Row @customFormat) */\n customFormat?: boolean;\n /** Thick top border (CT_Row @thickTop) */\n thickTop?: boolean;\n /** Thick bottom border (CT_Row @thickBot) */\n thickBot?: boolean;\n /** Phonetic text (CT_Row @ph) */\n ph?: boolean;\n}\n\n/** Rich text run properties (CT_RPrElt). */\nexport interface RichTextRunPrOptions {\n /** Font name (CT_FontName → rFont) */\n font?: string;\n /** Character set (CT_IntProperty) */\n charset?: number;\n /** Font family (CT_IntProperty) */\n family?: number;\n /** Bold */\n bold?: boolean;\n /** Italic */\n italic?: boolean;\n /** Strikethrough */\n strike?: boolean;\n /** Outline */\n outline?: boolean;\n /** Shadow */\n shadow?: boolean;\n /** Condense */\n condense?: boolean;\n /** Extend */\n extend?: boolean;\n /** Font color (hex RGB, e.g. \"FF0000\") */\n color?: string;\n /** Font size in points */\n size?: number;\n /** Underline type */\n underline?: \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\" | \"none\";\n /** Vertical alignment */\n vertAlign?: \"superscript\" | \"subscript\" | \"baseline\";\n /** Font scheme */\n scheme?: \"major\" | \"minor\" | \"none\";\n}\n\n/** A single rich text run (CT_RElt). */\nexport interface RichTextRunOptions {\n /** Run properties (optional = inherits from parent) */\n properties?: RichTextRunPrOptions;\n /** Run text content */\n text: string;\n}\n\n/** Phonetics run for CJK (CT_PhoneticRun → rPh). */\nexport interface PhoneticRunOptions {\n /** Start byte offset in base text */\n sb: number;\n /** End byte offset in base text */\n eb: number;\n /** Phonetic text */\n text: string;\n}\n\n/** Rich text content (CT_Rst). Either plain text or rich runs. */\nexport interface RichTextOptions {\n /** Plain text (mutually exclusive with runs) */\n text?: string;\n /** Rich text runs (mutually exclusive with text) */\n runs?: RichTextRunOptions[];\n /** Phonetic runs for CJK (CT_PhoneticRun) */\n phonetics?: PhoneticRunOptions[];\n}\n\nexport interface CellOptions {\n value?: string | number | boolean | Date | RichTextOptions | null;\n reference?: string;\n /** Direct style index (for pre-resolved styles) */\n styleIndex?: number;\n /** Style options (resolved to index at compile time) */\n style?: StyleOptions;\n /** Formula options. When set, value becomes the cached result. */\n formula?: FormulaOptions;\n}\n\n/** Cell formula type (maps to ST_CellFormulaType). */\nexport const FormulaType = {\n NORMAL: \"normal\",\n ARRAY: \"array\",\n SHARED: \"shared\",\n} as const;\n\nexport type FormulaType = (typeof FormulaType)[keyof typeof FormulaType];\n\n/** Options for a cell formula (maps to CT_CellFormula). */\nexport interface FormulaOptions {\n /** Formula expression, e.g. \"SUM(A1:B1)\" */\n formula: string;\n /** Formula type (default: \"normal\") */\n type?: FormulaType;\n /** Reference range for array/shared formulas, e.g. \"C1:C10\" */\n reference?: string;\n /** Shared formula group index (required for shared formulas) */\n sharedIndex?: number;\n /** Always calculate array (CT_CellFormula @aca) */\n aca?: boolean;\n /** 2-D data table (CT_CellFormula @dt2D) */\n dt2D?: boolean;\n /** Data table row (CT_CellFormula @dtr) */\n dtr?: boolean;\n /** Delete input cell 1 (CT_CellFormula @del1) */\n del1?: boolean;\n /** Delete input cell 2 (CT_CellFormula @del2) */\n del2?: boolean;\n /** Input cell 1 reference (CT_CellFormula @r1) */\n r1?: string;\n /** Input cell 2 reference (CT_CellFormula @r2) */\n r2?: string;\n /** Calculate cell (CT_CellFormula @ca) */\n ca?: boolean;\n /** Array formula context (CT_CellFormula @bx) */\n bx?: boolean;\n}\n\n/** Input cell for a what-if scenario (maps to CT_InputCells). */\nexport interface ScenarioCellOptions {\n /** Cell reference, e.g. \"B2\" */\n r: string;\n /** Cell value for this scenario */\n val: string | number;\n /** Whether the value is deleted */\n deleted?: boolean;\n /** Whether undone (CT_InputCells @undone) */\n undone?: boolean;\n}\n\n/** A single what-if scenario (maps to CT_Scenario). */\nexport interface ScenarioDefinition {\n /** Scenario name */\n name: string;\n /** Input cells with their values for this scenario */\n inputCells: ScenarioCellOptions[];\n /** Sort/order count */\n count?: number;\n /** Creator user name */\n user?: string;\n /** Comment */\n comment?: string;\n /** Whether the scenario is hidden */\n hidden?: boolean;\n /** Whether the scenario is locked */\n locked?: boolean;\n}\n\n/** Scenarios for what-if analysis (maps to CT_Scenarios). */\nexport interface ScenarioOptions {\n /** Named scenarios */\n scenarios: ScenarioDefinition[];\n /** Current scenario index (0-based) */\n current?: number;\n /** Show scenario index (0-based) */\n show?: number;\n}\n\nexport interface MergeCellOptions {\n from: { row: number; col: number };\n to: { row: number; col: number };\n}\n\nexport interface SheetProtectionOptions {\n /** Plain-text password — legacy Excel hash is computed automatically */\n password?: string;\n /** Modern encryption: algorithm name (e.g. \"SHA-512\") */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: string;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: string;\n /** Modern encryption: spin count for hash iteration */\n spinCount?: number;\n /** Set true to enable sheet protection (required for protection flags to take effect) */\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n selectLockedCells?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n selectUnlockedCells?: boolean;\n}\n\n/** A named protected range within a sheet (CT_ProtectedRange) */\nexport interface ProtectedRangeOptions {\n /** Range reference (required), e.g. \"A1:C10\" */\n sqref: string;\n /** Range name (required) */\n name: string;\n /** Plain-text password — legacy hash computed automatically */\n password?: string;\n /** Modern encryption: algorithm name */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: string;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: string;\n /** Modern encryption: spin count */\n spinCount?: number;\n /** Security descriptor (SID string) */\n securityDescriptor?: string;\n}\n\nexport interface FreezePaneOptions {\n /** Row split position (1-based, freezes rows above) */\n row?: number;\n /** Column split position (1-based, freezes columns to the left) */\n col?: number;\n}\n\nexport interface WorksheetImageOptions {\n data: Uint8Array;\n type: \"png\" | \"jpeg\" | \"jpg\";\n col: number;\n row: number;\n}\n\nexport interface WorksheetChartOptions extends ChartSpaceOptions {\n /** 1-based column position for the chart */\n col: number;\n /** 1-based row position for the chart */\n row: number;\n}\n\nexport interface SheetViewOptions {\n showGridLines?: boolean;\n showRowColHeaders?: boolean;\n showZeros?: boolean;\n zoomScale?: number;\n tabSelected?: boolean;\n rightToLeft?: boolean;\n /** Window protection (CT_SheetView @windowProtection) */\n windowProtection?: boolean;\n /** Show formulas instead of values (CT_SheetView @showFormulas) */\n showFormulas?: boolean;\n /** Show ruler (CT_SheetView @showRuler) */\n showRuler?: boolean;\n /** Show outline symbols (CT_SheetView @showOutlineSymbols) */\n showOutlineSymbols?: boolean;\n /** Default grid color (CT_SheetView @defaultGridColor) */\n defaultGridColor?: boolean;\n /** Show white space (CT_SheetView @showWhiteSpace) */\n showWhiteSpace?: boolean;\n /** View type (CT_SheetView @view) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n /** Tab color ID (CT_SheetView @colorId) */\n colorId?: number;\n /** Zoom scale for normal view (CT_SheetView @zoomScaleNormal) */\n zoomScaleNormal?: number;\n /** Zoom scale for sheet layout view (CT_SheetView @zoomScaleSheetLayoutView) */\n zoomScaleSheetLayoutView?: number;\n /** Zoom scale for page layout view (CT_SheetView @zoomScalePageLayoutView) */\n zoomScalePageLayoutView?: number;\n /** Pivot selections (CT_PivotSelection) */\n pivotSelections?: PivotSelectionOptions[];\n}\n\n/** Pivot selection in sheet view (CT_PivotSelection) */\nexport interface PivotSelectionOptions {\n /** Pane (default: \"topLeft\") */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Show header (default: false) */\n showHeader?: boolean;\n /** Label selected (default: false) */\n label?: boolean;\n /** Data selected (default: false) */\n data?: boolean;\n /** Extendable (default: false) */\n extendable?: boolean;\n /** Selection count */\n count?: number;\n /** Axis */\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n /** Dimension */\n dimension?: number;\n /** Start index */\n start?: number;\n /** Min index */\n min?: number;\n /** Max index */\n max?: number;\n /** Active row */\n activeRow?: number;\n /** Active column */\n activeCol?: number;\n /** Previous row */\n previousRow?: number;\n /** Previous column */\n previousCol?: number;\n /** Clicked row */\n click?: number;\n /** Relationship ID (maps to r:id in XML) */\n rId?: string;\n}\n\nexport type HyperlinkTarget =\n | { type: \"external\"; url: string }\n | { type: \"internal\"; location: string };\n\nexport interface HyperlinkOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** Hyperlink target */\n target: HyperlinkTarget;\n /** Tooltip text */\n tooltip?: string;\n /** Display text */\n display?: string;\n}\n\nexport interface HeaderFooterOptions {\n oddHeader?: string;\n oddFooter?: string;\n evenHeader?: string;\n evenFooter?: string;\n firstHeader?: string;\n firstFooter?: string;\n differentOddEven?: boolean;\n differentFirst?: boolean;\n /** Scale header/footer with document (CT_HeaderFooter @scaleWithDoc) */\n scaleWithDoc?: boolean;\n /** Align with page margins (CT_HeaderFooter @alignWithMargins) */\n alignWithMargins?: boolean;\n}\n\nexport type PageOrientation = \"default\" | \"portrait\" | \"landscape\";\n\nexport interface PageSetupOptions {\n paperSize?: number;\n orientation?: PageOrientation;\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n pageOrder?: \"downThenOver\" | \"overThenDown\";\n useFirstPageNumber?: boolean;\n firstPageNumber?: number;\n /** Paper height (CT_PageSetup @paperHeight) */\n paperHeight?: number;\n /** Paper width (CT_PageSetup @paperWidth) */\n paperWidth?: number;\n /** Use printer defaults (CT_PageSetup @usePrinterDefaults) */\n usePrinterDefaults?: boolean;\n /** Black and white printing (CT_PageSetup @blackAndWhite) */\n blackAndWhite?: boolean;\n /** Draft quality printing (CT_PageSetup @draft) */\n draft?: boolean;\n /** Print cell comments mode (CT_PageSetup @cellComments) */\n cellComments?: \"none\" | \"asDisplayed\" | \"atEnd\";\n /** Print error display mode (CT_PageSetup @errors) */\n errors?: \"displayed\" | \"blank\" | \"dash\" | \"NA\";\n /** Auto page breaks (CT_PageSetUpPr @autoPageBreaks) */\n autoPageBreaks?: boolean;\n}\n\nexport interface TabColorOptions {\n /** RGB color string, e.g. \"FF0000\" */\n rgb?: string;\n /** Theme color index (0-based) */\n theme?: number;\n /** Tint value (-1.0 to 1.0) */\n tint?: number;\n /** Indexed color (CT_Color @indexed) */\n indexed?: number;\n}\n\n/** Object anchor (CT_ObjectAnchor). */\nexport interface ObjectAnchorOptions {\n /** Move with cells (default: false) */\n moveWithCells?: boolean;\n /** Size with cells (default: false) */\n sizeWithCells?: boolean;\n}\n\n/** Comment property (CT_CommentPr). */\nexport interface CommentPrOptions {\n /** Locked */\n locked?: boolean;\n /** Default size */\n defaultSize?: boolean;\n /** Print */\n print?: boolean;\n /** Disabled */\n disabled?: boolean;\n /** Auto fill */\n autoFill?: boolean;\n /** Auto line */\n autoLine?: boolean;\n /** Alt text */\n altText?: string;\n /** Text horizontal alignment */\n textHAlign?: \"left\" | \"center\" | \"right\" | \"justify\" | \"distributed\";\n /** Text vertical alignment */\n textVAlign?: \"top\" | \"center\" | \"bottom\" | \"justify\" | \"distributed\";\n /** Lock text */\n lockText?: boolean;\n /** Justify last line */\n justLastX?: boolean;\n /** Auto scale */\n autoScale?: boolean;\n /** Object anchor position */\n anchor?: ObjectAnchorOptions;\n}\n\nexport interface CommentOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** Author name */\n author: string;\n /** Comment text (plain string or rich text) */\n text: string | RichTextOptions;\n /** Comment properties (CT_CommentPr) */\n commentPr?: CommentPrOptions;\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 sqref: string;\n type?: DataValidationType;\n operator?: DataValidationOperator;\n formula1?: string;\n formula2?: string;\n allowBlank?: boolean;\n showErrorMessage?: boolean;\n errorTitle?: string;\n error?: string;\n showInputMessage?: boolean;\n promptTitle?: string;\n prompt?: string;\n /** Error style (CT_DataValidation @errorStyle) */\n errorStyle?: \"stop\" | \"warning\" | \"information\";\n /** IME mode (CT_DataValidation @imeMode) */\n imeMode?:\n | \"noControl\"\n | \"on\"\n | \"off\"\n | \"disabled\"\n | \"hiragana\"\n | \"fullKatakana\"\n | \"halfKatakana\"\n | \"fullAlpha\"\n | \"halfAlpha\"\n | \"fullHangul\"\n | \"halfHangul\";\n /** Show drop-down (CT_DataValidation @showDropDown — note inverted semantics in OOXML) */\n showDropDown?: boolean;\n}\n\nexport type ConditionalFormatType =\n | \"cellIs\"\n | \"containsText\"\n | \"expression\"\n | \"top10\"\n | \"aboveAverage\"\n | \"colorScale\"\n | \"dataBar\"\n | \"iconSet\";\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\n/** Conditional format value object type (ST_CfvoType) */\nexport type CfvoType = \"num\" | \"percent\" | \"max\" | \"min\" | \"formula\" | \"percentile\";\n\n/** Conditional format value object */\nexport interface CfvoOptions {\n type: CfvoType;\n val?: string | number;\n /** Greater than or equal (default: true) */\n gte?: boolean;\n}\n\n/** Icon set type (ST_IconSetType) */\nexport type IconSetType =\n | \"3Arrows\"\n | \"3ArrowsGray\"\n | \"3Flags\"\n | \"3TrafficLights1\"\n | \"3TrafficLights2\"\n | \"3Signs\"\n | \"3Symbols\"\n | \"3Symbols2\"\n | \"4Arrows\"\n | \"4ArrowsGray\"\n | \"4RedToBlack\"\n | \"4Rating\"\n | \"4TrafficLights\"\n | \"5Arrows\"\n | \"5ArrowsGray\"\n | \"5Rating\"\n | \"5Quarters\";\n\n/** Color scale rule configuration */\nexport interface ColorScaleOptions {\n /** Conditional format values (minimum 2, typically 2 or 3) */\n cfvo: CfvoOptions[];\n /** Colors for each value (same count as cfvo) — RGB hex without alpha, e.g. \"FF0000\" */\n colors: string[];\n}\n\n/** Data bar rule configuration */\nexport interface DataBarOptions {\n /** Minimum and maximum value objects (exactly 2) */\n cfvo: [CfvoOptions, CfvoOptions];\n /** Bar color — RGB hex without alpha, e.g. \"638EC6\" */\n color: string;\n /** Minimum bar length as percentage (default: 10) */\n minLength?: number;\n /** Maximum bar length as percentage (default: 90) */\n maxLength?: number;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n}\n\n/** Icon set rule configuration */\nexport interface IconSetOptions {\n /** Conditional format values (minimum 2) */\n cfvo: CfvoOptions[];\n /** Icon set type (default: \"3TrafficLights1\") */\n iconSet?: IconSetType;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n /** Whether values are percentages (default: true) */\n percent?: boolean;\n /** Whether to reverse icon order (default: false) */\n reverse?: boolean;\n}\n\nexport interface ConditionalFormatRule {\n type: ConditionalFormatType;\n operator?: ConditionalFormatOperator;\n /** Formula(s) — up to 3 */\n formulas?: string[];\n priority?: number;\n /** Reference to a dxf (differential format) in the styles table */\n dxfId?: number;\n /** Color scale configuration (when type is \"colorScale\") */\n colorScale?: ColorScaleOptions;\n /** Data bar configuration (when type is \"dataBar\") */\n dataBar?: DataBarOptions;\n /** Icon set configuration (when type is \"iconSet\") */\n iconSet?: IconSetOptions;\n /** Stop if true — skip remaining rules (CT_CfRule @stopIfTrue) */\n stopIfTrue?: boolean;\n /** Time period for date-based highlighting (CT_CfRule @timePeriod) */\n timePeriod?:\n | \"today\"\n | \"yesterday\"\n | \"tomorrow\"\n | \"last7Days\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextMonth\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextWeek\";\n /** Rank for top/bottom rules (CT_CfRule @rank) */\n rank?: number;\n /** Equal average flag (CT_CfRule @equalAverage) */\n equalAverage?: boolean;\n}\n\nexport interface ConditionalFormatOptions {\n /** Cell range, e.g. \"A1:A10\" */\n sqref: string;\n rules: ConditionalFormatRule[];\n}\n\nexport interface Top10FilterOptions {\n colId: number;\n top?: boolean;\n percent?: boolean;\n val: number;\n /** Filter value (CT_Top10 @filterVal) */\n filterVal?: number;\n /** Hide auto-filter button (CT_FilterColumn @hiddenButton) */\n hiddenButton?: boolean;\n /** Show filter button (CT_FilterColumn @showButton) */\n showButton?: boolean;\n}\n\nexport interface CustomFilterOptions {\n colId: number;\n operator?:\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\";\n val?: string;\n and?: boolean;\n val2?: string;\n /** Hide auto-filter button (CT_FilterColumn @hiddenButton) */\n hiddenButton?: boolean;\n /** Show filter button (CT_FilterColumn @showButton) */\n showButton?: boolean;\n}\n\nexport interface SortCondition {\n /** Cell reference for the sort column, e.g. \"B1\" */\n ref: string;\n descending?: boolean;\n /** Sort by (CT_SortCondition @sortBy) */\n sortBy?: \"value\" | \"cellColor\" | \"fontColor\" | \"icon\";\n /** Custom sort list (CT_SortCondition @customList) */\n customList?: string;\n /** Icon set index (CT_SortCondition @iconId) */\n iconId?: number;\n}\n\nexport interface AutoFilterOptions {\n /** Range, e.g. \"A1:D10\" */\n ref: string;\n top10?: Top10FilterOptions[];\n customFilters?: CustomFilterOptions[];\n sort?: SortCondition[];\n /** Sort state options */\n sortState?: SortStateOptions;\n /** Color filters (CT_ColorFilter) */\n colorFilters?: ColorFilterOptions[];\n /** Icon filters (CT_IconFilter) */\n iconFilters?: IconFilterOptions[];\n /** Dynamic filters (CT_DynamicFilter) */\n dynamicFilters?: DynamicFilterOptions[];\n /** Date group items in filters (CT_DateGroupItem) */\n dateGroupItems?: DateGroupFilterOptions[];\n /** Simple filters with values (CT_Filters) */\n filters?: FilterItemsOptions[];\n}\n\n/** Color filter (CT_ColorFilter) */\nexport interface ColorFilterOptions {\n /** Column ID */\n colId: number;\n /** Cell color RGB (dxfId used if not set) */\n dxfId?: number;\n /** Filter by cell color (CT_ColorFilter @cellColor) */\n cellColor?: boolean;\n}\n\n/** Icon filter (CT_IconFilter) */\nexport interface IconFilterOptions {\n /** Column ID */\n colId: number;\n /** Icon set index (CT_IconFilter @iconSet) */\n iconSet: number;\n /** Icon ID within set (CT_IconFilter @iconId) */\n iconId?: number;\n}\n\n/** Filter items (CT_Filters) */\nexport interface FilterItemsOptions {\n /** Column ID */\n colId: number;\n /** Blank filter (CT_Filters @blank) */\n blank?: boolean;\n /** Calendar type (CT_Filters @calendarType) */\n calendarType?: string;\n /** Filter values */\n values?: string[];\n}\n\n/** Dynamic filter (CT_DynamicFilter) */\nexport interface DynamicFilterOptions {\n /** Column ID */\n colId: number;\n /** Dynamic filter type (CT_DynamicFilter @type) */\n type:\n | \"null\"\n | \"aboveAverage\"\n | \"belowAverage\"\n | \"tomorrow\"\n | \"today\"\n | \"yesterday\"\n | \"nextWeek\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextMonth\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextQuarter\"\n | \"thisQuarter\"\n | \"lastQuarter\"\n | \"nextYear\"\n | \"thisYear\"\n | \"lastYear\"\n | \"yearToDate\"\n | \"Q1\"\n | \"Q2\"\n | \"Q3\"\n | \"Q4\"\n | \"M1\"\n | \"M2\"\n | \"M3\"\n | \"M4\"\n | \"M5\"\n | \"M6\"\n | \"M7\"\n | \"M8\"\n | \"M9\"\n | \"M10\"\n | \"M11\"\n | \"M12\";\n /** Max value (CT_DynamicFilter @val) */\n val?: number;\n /** Max value as date ISO string (CT_DynamicFilter @maxVal) */\n maxVal?: number;\n /** Value ISO date string (CT_DynamicFilter @valIso) */\n valIso?: string;\n /** Max value ISO date string (CT_DynamicFilter @maxValIso) */\n maxValIso?: string;\n}\n\n/** Date group filter item (CT_DateGroupItem) */\nexport interface DateGroupFilterOptions {\n /** Column ID */\n colId: number;\n /** Date grouping level (CT_DateGroupItem @dateTimeGrouping) */\n dateTimeGrouping: \"year\" | \"month\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n /** Year (CT_DateGroupItem @year) */\n year?: number;\n /** Month (1-12, CT_DateGroupItem @month) */\n month?: number;\n /** Day (1-31, CT_DateGroupItem @day) */\n day?: number;\n /** Hour (0-23, CT_DateGroupItem @hour) */\n hour?: number;\n /** Minute (0-59, CT_DateGroupItem @minute) */\n minute?: number;\n /** Second (0-59, CT_DateGroupItem @second) */\n second?: number;\n}\n\n/** Sort state configuration (CT_SortState) */\nexport interface SortStateOptions {\n /** Column sort mode (CT_SortState @columnSort) */\n columnSort?: boolean;\n /** Case sensitive sorting (CT_SortState @caseSensitive) */\n caseSensitive?: boolean;\n /** Sort method (CT_SortState @sortMethod) */\n sortMethod?: \"pinYin\" | \"stroke\";\n}\n\n/** Print options (CT_PrintOptions) */\nexport interface PrintOptions {\n /** Center horizontally on page */\n horizontalCentered?: boolean;\n /** Center vertically on page */\n verticalCentered?: boolean;\n /** Print row/column headings */\n headings?: boolean;\n /** Print grid lines */\n gridLines?: boolean;\n /** Grid lines set flag */\n gridLinesSet?: boolean;\n}\n\n/** Sheet format properties (CT_SheetFormatPr) */\nexport interface SheetFormatPrOptions {\n /** Base column width (CT_SheetFormatPr @baseColWidth) */\n baseColWidth?: number;\n /** Default column width (CT_SheetFormatPr @defaultColWidth) */\n defaultColWidth?: number;\n /** Default row height */\n defaultRowHeight?: number;\n /** Zero height rows hidden (CT_SheetFormatPr @zeroHeight) */\n zeroHeight?: boolean;\n /** Thick top borders (CT_SheetFormatPr @thickTop) */\n thickTop?: boolean;\n /** Thick bottom borders (CT_SheetFormatPr @thickBottom) */\n thickBottom?: boolean;\n /** Outline level row (CT_SheetFormatPr @outlineLevelRow) */\n outlineLevelRow?: number;\n /** Outline level column (CT_SheetFormatPr @outlineLevelCol) */\n outlineLevelCol?: number;\n}\n\n/** Sheet properties extended options (CT_SheetPr attributes) */\nexport interface SheetPrOptions {\n /** Sync horizontal scroll (CT_SheetPr @syncHorizontal) */\n syncHorizontal?: boolean;\n /** Sync vertical scroll (CT_SheetPr @syncVertical) */\n syncVertical?: boolean;\n /** Sync reference (CT_SheetPr @syncRef) */\n syncRef?: string;\n /** Transition evaluation mode (CT_SheetPr @transitionEvaluation) */\n transitionEvaluation?: boolean;\n /** Transition entry mode (CT_SheetPr @transitionEntry) */\n transitionEntry?: boolean;\n /** Published to server (CT_SheetPr @published) */\n published?: boolean;\n /** Filter mode (CT_SheetPr @filterMode) */\n filterMode?: boolean;\n /** Enable format conditions calculation (CT_SheetPr @enableFormatConditionsCalculation) */\n enableFormatConditionsCalculation?: boolean;\n /** Outline apply styles (CT_OutlinePr @applyStyles) */\n outlineApplyStyles?: boolean;\n /** Outline show symbols (CT_OutlinePr @showOutlineSymbols) */\n outlineShowSymbols?: boolean;\n}\n\n/** An ignored error entry — suppresses specific Excel error checks for a range. */\nexport interface IgnoredErrorOptions {\n /** Cell range, e.g. \"A1:A10\" (required) */\n sqref: string;\n evalError?: boolean;\n twoDigitTextYear?: boolean;\n numberStoredAsText?: boolean;\n formula?: boolean;\n formulaRange?: boolean;\n unlockedFormula?: boolean;\n emptyCellReference?: boolean;\n listDataValidation?: boolean;\n calculatedColumn?: boolean;\n}\n\n/** Phonetic properties for CJK text (CT_PhoneticPr) */\nexport interface PhoneticPrOptions {\n /** Font ID from the styles table (required) */\n fontId: number;\n /** Phonetic type (default: \"fullwidthKatakana\") */\n type?: \"fullwidthKatakana\" | \"halfwidthKatakana\" | \"Hiragana\" | \"noConversion\";\n /** Alignment (default: \"left\") */\n alignment?: \"left\" | \"center\" | \"distributed\";\n}\n\n/** Background image for a worksheet */\nexport interface SheetBackgroundImageOptions {\n data: Uint8Array;\n type: \"png\" | \"jpeg\" | \"jpg\";\n}\n\n/** Page break entry (CT_Break) */\nexport interface PageBreakOptions {\n /** Row or column ID (1-based) */\n id: number;\n /** Min value (CT_Break @min) */\n min?: number;\n /** Max value (CT_Break @max) */\n max?: number;\n /** Manual break (CT_Break @man) */\n manual?: boolean;\n /** Pivot break (CT_Break @pt) */\n pivot?: boolean;\n}\n\n/** Selection in sheet view (CT_Selection) */\nexport interface SelectionOptions {\n /** Pane (CT_Selection @pane) */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Active cell (CT_Selection @activeCell) */\n activeCell?: string;\n /** Active cell index (CT_Selection @activeCellId) */\n activeCellId?: number;\n /** Selected range (CT_Selection @sqref) */\n sqref?: string;\n}\n\n/** Custom sheet view (CT_CustomSheetView) */\nexport interface CustomSheetViewOptions {\n /** GUID identifier (required, CT_CustomSheetView @guid) */\n guid: string;\n /** Zoom scale (CT_CustomSheetView @scale) */\n scale?: number;\n /** Show page breaks (CT_CustomSheetView @showPageBreaks) */\n showPageBreaks?: boolean;\n /** Show formulas (CT_CustomSheetView @showFormulas) */\n showFormulas?: boolean;\n /** Show grid lines (CT_CustomSheetView @showGridLines) */\n showGridLines?: boolean;\n /** Show row/column headers (CT_CustomSheetView @showRowCol) */\n showRowColHeaders?: boolean;\n /** Show outline symbols (CT_CustomSheetView @outlineSymbols) */\n outlineSymbols?: boolean;\n /** Show zero values (CT_CustomSheetView @zeroValues) */\n zeroValues?: boolean;\n /** Fit to page (CT_CustomSheetView @fitToPage) */\n fitToPage?: boolean;\n /** Print area (CT_CustomSheetView @printArea) */\n printArea?: boolean;\n /** Filter applied (CT_CustomSheetView @filter) */\n filter?: boolean;\n /** Show auto filter (CT_CustomSheetView @showAutoFilter) */\n showAutoFilter?: boolean;\n /** Hidden rows (CT_CustomSheetView @hiddenRows) */\n hiddenRows?: boolean;\n /** Hidden columns (CT_CustomSheetView @hiddenColumns) */\n hiddenColumns?: boolean;\n /** Sheet state (CT_CustomSheetView @state) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n /** Filter unique (CT_CustomSheetView @filterUnique) */\n filterUnique?: boolean;\n /** View type (CT_CustomSheetView @view) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n}\n\n/** Cell watch entry (CT_CellWatch) */\nexport interface CellWatchOptions {\n /** Cell reference, e.g. \"A1\" */\n r: string;\n}\n\n/** Data consolidation (CT_DataConsolidate) */\nexport interface DataConsolidateOptions {\n /** Consolidation function (CT_DataConsolidate @function) */\n function?:\n | \"average\"\n | \"count\"\n | \"countNums\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"stdDev\"\n | \"stdDevp\"\n | \"sum\"\n | \"var\"\n | \"varp\";\n /** Use top row labels (CT_DataConsolidate @startLabels) */\n topLabels?: boolean;\n /** Use left column labels (CT_DataConsolidate @leftLabels) */\n leftLabels?: boolean;\n /** Use labels in first row (CT_DataConsolidate @startLabels alias) */\n startLabels?: boolean;\n /** Link to source data (CT_DataConsolidate @link) */\n link?: boolean;\n /** Source data references */\n refs?: string[];\n}\n\n/** Drawing in header/footer (CT_DrawingHF) */\nexport interface DrawingHfOptions {\n /** Relationship ID for the drawing (required) */\n rId: string;\n lho?: number;\n lhe?: number;\n lhf?: number;\n cho?: number;\n che?: number;\n chf?: number;\n rho?: number;\n rhe?: number;\n rhf?: number;\n lfo?: number;\n lfe?: number;\n lff?: number;\n cfo?: number;\n cfe?: number;\n cff?: number;\n rfo?: number;\n rfe?: number;\n rff?: number;\n}\n\nexport interface WorksheetOptions {\n name?: string;\n rows?: RowOptions[];\n columns?: ColumnOptions[];\n mergeCells?: MergeCellOptions[];\n freezePanes?: FreezePaneOptions;\n protection?: SheetProtectionOptions;\n /** Named protected ranges within this sheet */\n protectedRanges?: ProtectedRangeOptions[];\n /** What-if scenarios */\n scenarios?: ScenarioOptions;\n /** Auto-filter configuration */\n autoFilter?: string | AutoFilterOptions;\n images?: WorksheetImageOptions[];\n charts?: WorksheetChartOptions[];\n dataValidations?: DataValidationOptions[];\n /** Disable data validation prompts (CT_DataValidations @disablePrompts) */\n dataValidationsDisablePrompts?: boolean;\n conditionalFormats?: ConditionalFormatOptions[];\n hyperlinks?: HyperlinkOptions[];\n comments?: CommentOptions[];\n headerFooter?: HeaderFooterOptions;\n pageSetup?: PageSetupOptions;\n tabColor?: TabColorOptions;\n sheetView?: SheetViewOptions;\n pivotTables?: PivotTableOptions[];\n /** Tables (list objects) for this worksheet */\n tables?: TableOptions[];\n /** Ignored errors — suppress specific Excel error checks for cell ranges */\n ignoredErrors?: IgnoredErrorOptions[];\n /** Phonetic properties for CJK text */\n phoneticPr?: PhoneticPrOptions;\n /** Background image for the worksheet */\n backgroundImage?: SheetBackgroundImageOptions;\n /** Print options (CT_PrintOptions) */\n printOptions?: PrintOptions;\n /** Sheet format properties (CT_SheetFormatPr) */\n sheetFormatPr?: SheetFormatPrOptions;\n /** Sheet extended properties (CT_SheetPr attributes) */\n sheetPr?: SheetPrOptions;\n /** Row page breaks (CT_PageBreaks) */\n rowBreaks?: PageBreakOptions[];\n /** Column page breaks (CT_PageBreaks) */\n colBreaks?: PageBreakOptions[];\n /** Custom sheet views (CT_CustomSheetViews) */\n customSheetViews?: CustomSheetViewOptions[];\n /** Cell watches (CT_CellWatches) */\n cellWatches?: CellWatchOptions[];\n /** Data consolidation (CT_DataConsolidate) */\n dataConsolidate?: DataConsolidateOptions;\n /** OLE embedded range (CT_OleSize) */\n oleSize?: string;\n /** Drawing in header/footer (CT_DrawingHF) */\n drawingHF?: DrawingHfOptions;\n /** Legacy drawing for header/footer r:id (CT_LegacyDrawingHF) */\n legacyDrawingHF?: string;\n /** Selection in sheet view (CT_Selection) */\n selection?: SelectionOptions;\n /** Sheet calc properties (CT_SheetCalcPr) */\n sheetCalcPr?: SheetCalcPrOptions;\n /** Extension list (extLst) */\n ext?: string;\n /** Control objects (CT_Controls) */\n controls?: ControlOptions[];\n /** Custom sheet properties (CT_CustomProperties) */\n customProperties?: CustomPropertyOptions[];\n /** OLE objects (CT_OleObjects) */\n oleObjects?: OleObjectOptions[];\n /** Web publish items (CT_WebPublishItems) */\n webPublishItems?: WebPublishItemOptions[];\n}\n\n/** Sheet calc properties (CT_SheetCalcPr) */\nexport interface SheetCalcPrOptions {\n /** Full calc on load (CT_SheetCalcPr @fullCalcOnLoad) */\n fullCalcOnLoad?: boolean;\n}\n\n/** Form control object (CT_Control) */\nexport interface ControlOptions {\n /** Shape ID (CT_Control @shapeId) */\n shapeId: number;\n /** Control r:id (CT_ControlPr @r:id) */\n rId: string;\n /** Control name (CT_ControlPr @name) */\n name?: string;\n /** Locked (CT_ControlPr @locked) */\n locked?: boolean;\n /** UI-locked (CT_ControlPr @uiObject) */\n uiObject?: boolean;\n /** Recalc always (CT_ControlPr @recalcAlways) */\n recalcAlways?: boolean;\n /** Linked cell (CT_ControlPr @linkedCell) */\n linkedCell?: string;\n /** List fill range (CT_ControlPr @listFillRange) */\n listFillRange?: string;\n /** Control formula (CT_ControlPr @cf) */\n cf?: string;\n}\n\n/** Custom property (CT_CustomProperty) */\nexport interface CustomPropertyOptions {\n /** Property name */\n name: string;\n /** Relationship ID to binary data */\n rId: string;\n}\n\n/** OLE object (CT_OleObject) */\nexport interface OleObjectOptions {\n /** Program ID (CT_OleObject @progId) */\n progId?: string;\n /** Display aspect (CT_OleObject @dvAspect) */\n dvAspect?: \"DVASPECT_CONTENT\" | \"DVASPECT_ICON\";\n /** Linked source (CT_OleObject @link) */\n link?: string;\n /** OLE update mode (CT_OleObject @oleUpdate) */\n oleUpdate?: \"OLEUPDATE_ALWAYS\" | \"OLEUPDATE_ONCALL\";\n /** Auto load (CT_OleObject @autoLoad) */\n autoLoad?: boolean;\n /** Shape ID (CT_OleObject @shapeId) */\n shapeId: number;\n /** Relationship ID (CT_OleObject @r:id) */\n rId?: string;\n /** Object properties (CT_ObjectPr) */\n objectPr?: OleObjectPrOptions;\n}\n\n/** OLE object properties (CT_ObjectPr) */\nexport interface OleObjectPrOptions {\n /** Locked */\n locked?: boolean;\n /** Default size */\n defaultSize?: boolean;\n /** Print */\n print?: boolean;\n /** Disabled */\n disabled?: boolean;\n /** UI object */\n uiObject?: boolean;\n /** Auto fill */\n autoFill?: boolean;\n /** Auto line */\n autoLine?: boolean;\n /** Auto picture */\n autoPict?: boolean;\n /** Macro */\n macro?: string;\n /** Alt text */\n altText?: string;\n /** DDE */\n dde?: boolean;\n /** Relationship ID */\n rId?: string;\n}\n\n/** Web publish item (CT_WebPublishItem) */\nexport interface WebPublishItemOptions {\n /** Item ID */\n id: number;\n /** HTML div ID */\n divId: string;\n /** Source type */\n sourceType:\n | \"sheet\"\n | \"printArea\"\n | \"autoFilter\"\n | \"range\"\n | \"chart\"\n | \"pivotTable\"\n | \"query\"\n | \"label\";\n /** Source cell reference */\n sourceRef?: string;\n /** Source object name */\n sourceObject?: string;\n /** Destination file path */\n destinationFile: string;\n /** Title */\n title?: string;\n /** Auto republish */\n autoRepublish?: boolean;\n}\n\n// ── Worksheet XML builder context ──\n\n/** Minimal context needed by buildWorksheetXml. */\nexport interface WorksheetContext {\n sharedStrings?: SharedStrings;\n styles?: Styles;\n}\n\n// ── Pure functions ──\n\n// Re-exported for use by the compiler (defined below in this file).\nexport { stringifyWorksheet as buildWorksheetXml };\n// ── Descriptor ──\n\nexport const worksheetDesc: CustomDescriptor<WorksheetOptions> = {\n kind: \"custom\",\n\n /**\n * NOT intended for direct use by the compiler.\n * The compiler calls `stringifyWorksheet(opts, ctx)` instead, which has\n * access to the SharedStrings and Styles accumulators.\n * This method exists to satisfy the CustomDescriptor interface for the read path.\n */\n stringify(_opts, _ctx) {\n throw new Error(\n \"Use stringifyWorksheet(opts, ctx) for the write path. worksheetDesc.stringify() is not supported.\",\n );\n },\n\n parse(el, ctx) {\n const result: Record<string, unknown> = {};\n\n // Resolve shared strings from context (XlsxReadContext)\n const strings: string[] = ctx && \"sharedStrings\" in ctx ? (ctx as any).sharedStrings : [];\n\n // Sheet properties\n const sheetPrEl = findChild(el, \"sheetPr\");\n if (sheetPrEl) {\n const sp: Record<string, unknown> = {};\n if (attr(sheetPrEl, \"syncHorizontal\") === \"1\") sp.syncHorizontal = true;\n if (attr(sheetPrEl, \"syncVertical\") === \"1\") sp.syncVertical = true;\n if (attr(sheetPrEl, \"syncRef\")) sp.syncRef = attr(sheetPrEl, \"syncRef\");\n if (attr(sheetPrEl, \"transitionEvaluation\") === \"1\") sp.transitionEvaluation = true;\n if (attr(sheetPrEl, \"transitionEntry\") === \"1\") sp.transitionEntry = true;\n if (attr(sheetPrEl, \"published\") === \"1\") sp.published = true;\n if (attr(sheetPrEl, \"filterMode\") === \"1\") sp.filterMode = true;\n if (attr(sheetPrEl, \"enableFormatConditionsCalculation\") === \"1\")\n sp.enableFormatConditionsCalculation = true;\n\n const outlinePr = findChild(sheetPrEl, \"outlinePr\");\n if (outlinePr) {\n if (attr(outlinePr, \"applyStyles\") === \"1\") sp.outlineApplyStyles = true;\n if (attr(outlinePr, \"showOutlineSymbols\") === \"0\") sp.outlineShowSymbols = false;\n }\n if (Object.keys(sp).length > 0) result.sheetPr = sp;\n\n // Tab color\n const tabColorEl = findChild(sheetPrEl, \"tabColor\");\n if (tabColorEl) {\n const tc: Record<string, unknown> = {};\n if (attr(tabColorEl, \"rgb\")) tc.rgb = attr(tabColorEl, \"rgb\");\n if (attrNum(tabColorEl, \"theme\") !== undefined) tc.theme = attrNum(tabColorEl, \"theme\");\n if (attrNum(tabColorEl, \"tint\") !== undefined) tc.tint = attrNum(tabColorEl, \"tint\");\n if (attrNum(tabColorEl, \"indexed\") !== undefined)\n tc.indexed = attrNum(tabColorEl, \"indexed\");\n result.tabColor = tc;\n }\n }\n\n // Sheet views\n const sheetViewsEl = findChild(el, \"sheetViews\");\n if (sheetViewsEl) {\n const svEl = findChild(sheetViewsEl, \"sheetView\");\n if (svEl) {\n const sv: Record<string, unknown> = {};\n if (attr(svEl, \"showGridLines\") === \"0\") sv.showGridLines = false;\n if (attr(svEl, \"showRowColHeaders\") === \"0\") sv.showRowColHeaders = false;\n if (attr(svEl, \"showZeros\") === \"0\") sv.showZeros = false;\n const zs = attrNum(svEl, \"zoomScale\");\n if (zs !== undefined) sv.zoomScale = zs;\n if (attr(svEl, \"tabSelected\") !== undefined)\n sv.tabSelected = attr(svEl, \"tabSelected\") !== \"0\";\n if (attr(svEl, \"rightToLeft\") === \"1\") sv.rightToLeft = true;\n if (attr(svEl, \"view\")) sv.view = attr(svEl, \"view\");\n result.sheetView = sv;\n\n // Freeze pane\n const paneEl = findChild(svEl, \"pane\");\n if (paneEl && attr(paneEl, \"state\") === \"frozen\") {\n const fp: Record<string, unknown> = {};\n const ys = attrNum(paneEl, \"ySplit\");\n if (ys && ys > 0) fp.row = ys;\n const xs = attrNum(paneEl, \"xSplit\");\n if (xs && xs > 0) fp.col = xs;\n if (Object.keys(fp).length > 0) result.freezePanes = fp;\n }\n }\n }\n\n // Sheet format properties\n const sfpEl = findChild(el, \"sheetFormatPr\");\n if (sfpEl) {\n const sfp: Record<string, unknown> = {};\n const bcw = attrNum(sfpEl, \"baseColWidth\");\n if (bcw !== undefined) sfp.baseColWidth = bcw;\n const dcw = attrNum(sfpEl, \"defaultColWidth\");\n if (dcw !== undefined) sfp.defaultColWidth = dcw;\n const drh = attrNum(sfpEl, \"defaultRowHeight\");\n if (drh !== undefined) sfp.defaultRowHeight = drh;\n if (attr(sfpEl, \"zeroHeight\") === \"1\") sfp.zeroHeight = true;\n if (attr(sfpEl, \"thickTop\") === \"1\") sfp.thickTop = true;\n if (attr(sfpEl, \"thickBottom\") === \"1\") sfp.thickBottom = true;\n const olr = attrNum(sfpEl, \"outlineLevelRow\");\n if (olr !== undefined) sfp.outlineLevelRow = olr;\n const olc = attrNum(sfpEl, \"outlineLevelCol\");\n if (olc !== undefined) sfp.outlineLevelCol = olc;\n result.sheetFormatPr = sfp;\n }\n\n // Columns\n const colsEl = findChild(el, \"cols\");\n if (colsEl) {\n const columns: Record<string, unknown>[] = [];\n for (const colEl of colsEl.elements ?? []) {\n if (colEl.name !== \"col\") continue;\n const col: Record<string, unknown> = {};\n col.min = attrNum(colEl, \"min\") ?? 0;\n col.max = attrNum(colEl, \"max\") ?? 0;\n const w = attrNum(colEl, \"width\");\n if (w !== undefined) col.width = w;\n if (attr(colEl, \"hidden\") === \"1\") col.hidden = true;\n if (attr(colEl, \"customWidth\") === \"1\") col.customWidth = true;\n const ol = attrNum(colEl, \"outlineLevel\");\n if (ol !== undefined) col.outlineLevel = ol;\n if (attr(colEl, \"collapsed\") === \"1\") col.collapsed = true;\n if (attr(colEl, \"bestFit\") === \"1\") col.bestFit = true;\n if (attr(colEl, \"phonetic\") === \"1\") col.phonetic = true;\n columns.push(col);\n }\n if (columns.length > 0) result.columns = columns;\n }\n\n // Sheet protection\n const protEl = findChild(el, \"sheetProtection\");\n if (protEl?.attributes) {\n const prot: Record<string, unknown> = {};\n if (attr(protEl, \"password\")) prot.password = attr(protEl, \"password\");\n if (attr(protEl, \"algorithmName\")) prot.algorithmName = attr(protEl, \"algorithmName\");\n if (attr(protEl, \"hashValue\")) prot.hashValue = attr(protEl, \"hashValue\");\n if (attr(protEl, \"saltValue\")) prot.saltValue = attr(protEl, \"saltValue\");\n if (attrNum(protEl, \"spinCount\") !== undefined) prot.spinCount = attrNum(protEl, \"spinCount\");\n if (attr(protEl, \"sheet\") === \"1\") prot.sheet = true;\n if (attr(protEl, \"objects\") === \"1\") prot.objects = true;\n if (attr(protEl, \"scenarios\") === \"1\") prot.scenarios = true;\n if (attr(protEl, \"formatCells\") === \"0\") prot.formatCells = false;\n if (attr(protEl, \"formatColumns\") === \"0\") prot.formatColumns = false;\n if (attr(protEl, \"formatRows\") === \"0\") prot.formatRows = false;\n if (attr(protEl, \"insertColumns\") === \"0\") prot.insertColumns = false;\n if (attr(protEl, \"insertRows\") === \"0\") prot.insertRows = false;\n if (attr(protEl, \"insertHyperlinks\") === \"0\") prot.insertHyperlinks = false;\n if (attr(protEl, \"deleteColumns\") === \"0\") prot.deleteColumns = false;\n if (attr(protEl, \"deleteRows\") === \"0\") prot.deleteRows = false;\n if (attr(protEl, \"selectLockedCells\") === \"1\") prot.selectLockedCells = true;\n if (attr(protEl, \"sort\") === \"0\") prot.sort = false;\n if (attr(protEl, \"autoFilter\") === \"0\") prot.autoFilter = false;\n if (attr(protEl, \"pivotTables\") === \"0\") prot.pivotTables = false;\n if (attr(protEl, \"selectUnlockedCells\") === \"1\") prot.selectUnlockedCells = true;\n result.protection = prot;\n }\n\n // Protected ranges\n const prEl = findChild(el, \"protectedRanges\");\n if (prEl) {\n const ranges: Record<string, unknown>[] = [];\n for (const rEl of prEl.elements ?? []) {\n if (rEl.name !== \"protectedRange\") continue;\n const r: Record<string, unknown> = {};\n r.sqref = attr(rEl, \"sqref\") ?? \"\";\n r.name = attr(rEl, \"name\") ?? \"\";\n if (attr(rEl, \"password\")) r.password = attr(rEl, \"password\");\n if (attr(rEl, \"algorithmName\")) r.algorithmName = attr(rEl, \"algorithmName\");\n if (attr(rEl, \"hashValue\")) r.hashValue = attr(rEl, \"hashValue\");\n if (attr(rEl, \"saltValue\")) r.saltValue = attr(rEl, \"saltValue\");\n if (attrNum(rEl, \"spinCount\") !== undefined) r.spinCount = attrNum(rEl, \"spinCount\");\n const sdEl = findChild(rEl, \"securityDescriptor\");\n if (sdEl) r.securityDescriptor = textOf(sdEl);\n ranges.push(r);\n }\n if (ranges.length > 0) result.protectedRanges = ranges;\n }\n\n // Auto filter\n const afEl = findChild(el, \"autoFilter\");\n if (afEl) {\n result.autoFilter = attr(afEl, \"ref\") ?? \"\";\n }\n\n // Merge cells\n const mcEl = findChild(el, \"mergeCells\");\n if (mcEl) {\n const merges: Record<string, unknown>[] = [];\n for (const mEl of mcEl.elements ?? []) {\n if (mEl.name !== \"mergeCell\") continue;\n const ref = attr(mEl, \"ref\") ?? \"\";\n const parts = ref.split(\":\");\n if (parts.length === 2) {\n const from = parseCellRef(parts[0]);\n const to = parseCellRef(parts[1]);\n if (from && to) merges.push({ from, to });\n }\n }\n if (merges.length > 0) result.mergeCells = merges;\n }\n\n // Conditional formatting\n const cfEls = el.elements?.filter((e) => e.name === \"conditionalFormatting\") ?? [];\n if (cfEls.length > 0) {\n const cfs: Record<string, unknown>[] = [];\n for (const cfEl of cfEls) {\n const sqref = attr(cfEl, \"sqref\") ?? \"\";\n const rules: Record<string, unknown>[] = [];\n for (const ruleEl of cfEl.elements ?? []) {\n if (ruleEl.name !== \"cfRule\") continue;\n const rule: Record<string, unknown> = {};\n rule.type = attr(ruleEl, \"type\");\n rule.priority = attrNum(ruleEl, \"priority\") ?? 1;\n if (attr(ruleEl, \"operator\")) rule.operator = attr(ruleEl, \"operator\");\n const dxfId = attrNum(ruleEl, \"dxfId\");\n if (dxfId !== undefined) rule.dxfId = dxfId;\n if (attr(ruleEl, \"stopIfTrue\") === \"1\") rule.stopIfTrue = true;\n if (attr(ruleEl, \"timePeriod\")) rule.timePeriod = attr(ruleEl, \"timePeriod\");\n const rank = attrNum(ruleEl, \"rank\");\n if (rank !== undefined) rule.rank = rank;\n if (attr(ruleEl, \"equalAverage\") === \"1\") rule.equalAverage = true;\n\n // Color scale\n const csEl = findChild(ruleEl, \"colorScale\");\n if (csEl) {\n const cfvo: Record<string, unknown>[] = [];\n const colors: string[] = [];\n for (const child of csEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") {\n const rgb = attr(child, \"rgb\");\n if (rgb) colors.push(rgb.length === 8 ? rgb.slice(2) : rgb);\n }\n }\n rule.colorScale = { cfvo, colors };\n }\n\n // Data bar\n const dbEl = findChild(ruleEl, \"dataBar\");\n if (dbEl) {\n const cfvo: Record<string, unknown>[] = [];\n let color = \"\";\n for (const child of dbEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") {\n const rgb = attr(child, \"rgb\");\n if (rgb) color = rgb.length === 8 ? rgb.slice(2) : rgb;\n }\n }\n rule.dataBar = { cfvo: cfvo as [any, any], color };\n }\n\n // Icon set\n const isEl = findChild(ruleEl, \"iconSet\");\n if (isEl) {\n const cfvo: Record<string, unknown>[] = [];\n for (const child of isEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n }\n const iconSet: Record<string, unknown> = { cfvo };\n if (attr(isEl, \"iconSet\")) iconSet.iconSet = attr(isEl, \"iconSet\");\n if (attr(isEl, \"showValue\") === \"0\") iconSet.showValue = false;\n if (attr(isEl, \"percent\") === \"0\") iconSet.percent = false;\n if (attr(isEl, \"reverse\") === \"1\") iconSet.reverse = true;\n rule.iconSet = iconSet;\n }\n\n // Formulas\n const formulas: string[] = [];\n for (const child of ruleEl.elements ?? []) {\n if (child.name === \"formula\") formulas.push(textOf(child) ?? \"\");\n }\n if (formulas.length > 0) rule.formulas = formulas;\n\n rules.push(rule);\n }\n cfs.push({ sqref, rules });\n }\n result.conditionalFormats = cfs;\n }\n\n // Data validations\n const dvEl = findChild(el, \"dataValidations\");\n if (dvEl) {\n const dvs: Record<string, unknown>[] = [];\n for (const dEl of dvEl.elements ?? []) {\n if (dEl.name !== \"dataValidation\") continue;\n const dv: Record<string, unknown> = {};\n dv.sqref = attr(dEl, \"sqref\") ?? \"\";\n if (attr(dEl, \"type\")) dv.type = attr(dEl, \"type\");\n if (attr(dEl, \"operator\")) dv.operator = attr(dEl, \"operator\");\n if (attr(dEl, \"allowBlank\") === \"1\") dv.allowBlank = true;\n if (attr(dEl, \"showErrorMessage\") === \"1\") dv.showErrorMessage = true;\n if (attr(dEl, \"showInputMessage\") === \"1\") dv.showInputMessage = true;\n if (attr(dEl, \"errorTitle\")) dv.errorTitle = attr(dEl, \"errorTitle\");\n if (attr(dEl, \"error\")) dv.error = attr(dEl, \"error\");\n if (attr(dEl, \"promptTitle\")) dv.promptTitle = attr(dEl, \"promptTitle\");\n if (attr(dEl, \"prompt\")) dv.prompt = attr(dEl, \"prompt\");\n if (attr(dEl, \"errorStyle\")) dv.errorStyle = attr(dEl, \"errorStyle\");\n if (attr(dEl, \"imeMode\")) dv.imeMode = attr(dEl, \"imeMode\");\n if (attr(dEl, \"showDropDown\") === \"1\") dv.showDropDown = true;\n\n const f1El = findChild(dEl, \"formula1\");\n if (f1El) dv.formula1 = textOf(f1El);\n const f2El = findChild(dEl, \"formula2\");\n if (f2El) dv.formula2 = textOf(f2El);\n\n dvs.push(dv);\n }\n result.dataValidations = dvs;\n }\n\n // Hyperlinks\n const hlEl = findChild(el, \"hyperlinks\");\n if (hlEl) {\n const hyperlinks: Record<string, unknown>[] = [];\n for (const hEl of hlEl.elements ?? []) {\n if (hEl.name !== \"hyperlink\") continue;\n const hl: Record<string, unknown> = {};\n hl.cell = attr(hEl, \"ref\") ?? \"\";\n const rId = hEl.attributes?.[\"r:id\"] as string | undefined;\n const location = attr(hEl, \"location\");\n if (rId) hl.target = { type: \"external\", url: rId };\n else if (location) hl.target = { type: \"internal\", location };\n if (attr(hEl, \"tooltip\")) hl.tooltip = attr(hEl, \"tooltip\");\n if (attr(hEl, \"display\")) hl.display = attr(hEl, \"display\");\n hyperlinks.push(hl);\n }\n result.hyperlinks = hyperlinks;\n }\n\n // Print options\n const poEl = findChild(el, \"printOptions\");\n if (poEl) {\n const po: Record<string, unknown> = {};\n if (attr(poEl, \"horizontalCentered\") === \"1\") po.horizontalCentered = true;\n if (attr(poEl, \"verticalCentered\") === \"1\") po.verticalCentered = true;\n if (attr(poEl, \"headings\") === \"1\") po.headings = true;\n if (attr(poEl, \"gridLines\") === \"1\") po.gridLines = true;\n if (attr(poEl, \"gridLinesSet\") === \"0\") po.gridLinesSet = false;\n result.printOptions = po;\n }\n\n // Page setup\n const psEl = findChild(el, \"pageSetup\");\n if (psEl) {\n const ps: Record<string, unknown> = {};\n const pz = attrNum(psEl, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n if (attr(psEl, \"orientation\")) ps.orientation = attr(psEl, \"orientation\");\n const sc = attrNum(psEl, \"scale\");\n if (sc !== undefined) ps.scale = sc;\n const ftw = attrNum(psEl, \"fitToWidth\");\n if (ftw !== undefined) ps.fitToWidth = ftw;\n const fth = attrNum(psEl, \"fitToHeight\");\n if (fth !== undefined) ps.fitToHeight = fth;\n if (attr(psEl, \"pageOrder\")) ps.pageOrder = attr(psEl, \"pageOrder\");\n if (attr(psEl, \"useFirstPageNumber\") === \"1\") ps.useFirstPageNumber = true;\n const fpn = attrNum(psEl, \"firstPageNumber\");\n if (fpn !== undefined) ps.firstPageNumber = fpn;\n result.pageSetup = ps;\n }\n\n // Header/footer\n const hfEl = findChild(el, \"headerFooter\");\n if (hfEl) {\n const hf: Record<string, unknown> = {};\n if (attr(hfEl, \"differentOddEven\") === \"1\") hf.differentOddEven = true;\n if (attr(hfEl, \"differentFirst\") === \"1\") hf.differentFirst = true;\n if (attr(hfEl, \"scaleWithDoc\") === \"0\") hf.scaleWithDoc = false;\n if (attr(hfEl, \"alignWithMargins\") === \"0\") hf.alignWithMargins = false;\n const oh = findChild(hfEl, \"oddHeader\");\n if (oh) hf.oddHeader = textOf(oh);\n const of2 = findChild(hfEl, \"oddFooter\");\n if (of2) hf.oddFooter = textOf(of2);\n const eh = findChild(hfEl, \"evenHeader\");\n if (eh) hf.evenHeader = textOf(eh);\n const ef = findChild(hfEl, \"evenFooter\");\n if (ef) hf.evenFooter = textOf(ef);\n const fh = findChild(hfEl, \"firstHeader\");\n if (fh) hf.firstHeader = textOf(fh);\n const ff = findChild(hfEl, \"firstFooter\");\n if (ff) hf.firstFooter = textOf(ff);\n result.headerFooter = hf;\n }\n\n // Ignored errors\n const ieEl = findChild(el, \"ignoredErrors\");\n if (ieEl) {\n const errors: Record<string, unknown>[] = [];\n for (const eEl of ieEl.elements ?? []) {\n if (eEl.name !== \"ignoredError\") continue;\n const ie: Record<string, unknown> = {};\n ie.sqref = attr(eEl, \"sqref\") ?? \"\";\n if (attr(eEl, \"evalError\") === \"1\") ie.evalError = true;\n if (attr(eEl, \"twoDigitTextYear\") === \"1\") ie.twoDigitTextYear = true;\n if (attr(eEl, \"numberStoredAsText\") === \"1\") ie.numberStoredAsText = true;\n if (attr(eEl, \"formula\") === \"1\") ie.formula = true;\n if (attr(eEl, \"formulaRange\") === \"1\") ie.formulaRange = true;\n if (attr(eEl, \"unlockedFormula\") === \"1\") ie.unlockedFormula = true;\n if (attr(eEl, \"emptyCellReference\") === \"1\") ie.emptyCellReference = true;\n if (attr(eEl, \"listDataValidation\") === \"1\") ie.listDataValidation = true;\n if (attr(eEl, \"calculatedColumn\") === \"1\") ie.calculatedColumn = true;\n errors.push(ie);\n }\n result.ignoredErrors = errors;\n }\n\n // Phonetic properties\n const ppEl = findChild(el, \"phoneticPr\");\n if (ppEl) {\n const pp: Record<string, unknown> = {};\n pp.fontId = attrNum(ppEl, \"fontId\") ?? 0;\n if (attr(ppEl, \"type\")) pp.type = attr(ppEl, \"type\");\n if (attr(ppEl, \"alignment\")) pp.alignment = attr(ppEl, \"alignment\");\n result.phoneticPr = pp;\n }\n\n // Sheet calc properties\n const scEl = findChild(el, \"sheetCalcPr\");\n if (scEl) {\n const sc: Record<string, unknown> = {};\n if (attr(scEl, \"fullCalcOnLoad\") === \"1\") sc.fullCalcOnLoad = true;\n result.sheetCalcPr = sc;\n }\n\n // Sheet data (rows and cells)\n const sheetDataEl = findChild(el, \"sheetData\");\n if (sheetDataEl) {\n const rows: Record<string, unknown>[] = [];\n for (const rowEl of sheetDataEl.elements ?? []) {\n if (rowEl.name !== \"row\") continue;\n const row: Record<string, unknown> = {};\n const rowNumber = attrNum(rowEl, \"r\");\n if (rowNumber !== undefined) row.rowNumber = rowNumber;\n const ht = attrNum(rowEl, \"ht\");\n if (ht !== undefined) row.height = ht;\n if (attr(rowEl, \"hidden\") === \"1\") row.hidden = true;\n if (attr(rowEl, \"spans\")) row.spans = attr(rowEl, \"spans\");\n if (attr(rowEl, \"customFormat\") === \"1\") row.customFormat = true;\n if (attr(rowEl, \"thickTop\") === \"1\") row.thickTop = true;\n if (attr(rowEl, \"thickBot\") === \"1\") row.thickBot = true;\n if (attr(rowEl, \"ph\") === \"1\") row.ph = true;\n\n const cells: Record<string, unknown>[] = [];\n for (const cellEl of rowEl.elements ?? []) {\n if (cellEl.name !== \"c\") continue;\n const cell: Record<string, unknown> = {};\n const ref = attr(cellEl, \"r\");\n if (ref) cell.reference = ref;\n const type = attr(cellEl, \"t\");\n const styleIdx = attrNum(cellEl, \"s\");\n if (styleIdx !== undefined) cell.styleIndex = styleIdx;\n\n // Cell value\n const vEl = findChild(cellEl, \"v\");\n const isEl = findChild(cellEl, \"is\");\n\n if (type === \"s\" && vEl) {\n // Shared string\n const idx = parseInt(textOf(vEl) ?? \"\", 10);\n cell.value = strings[idx] ?? \"\";\n } else if (type === \"b\" && vEl) {\n cell.value = textOf(vEl) === \"1\";\n } else if (type === \"inlineStr\" && isEl) {\n const t = findChild(isEl, \"t\");\n cell.value = textOf(t) ?? \"\";\n } else if (vEl) {\n const raw = textOf(vEl) ?? \"\";\n const num = Number(raw);\n cell.value = isNaN(num) ? raw : num;\n }\n\n cells.push(cell);\n }\n\n row.cells = cells;\n rows.push(row);\n }\n if (rows.length > 0) result.rows = rows;\n }\n\n return result as Record<string, unknown>;\n },\n};\n\n// ── Stringify implementation ──\n\n/**\n * Build the complete worksheet XML string.\n *\n * Zero-allocation fast path: directly concatenates XML string,\n * bypassing the IXmlableObject intermediate tree entirely.\n */\nexport function stringifyWorksheet(opts: WorksheetOptions, ctx: WorksheetContext): string {\n const sharedStrings = ctx.sharedStrings;\n const styles = ctx.styles;\n\n const rows = opts.rows ?? [];\n const columns = opts.columns ?? [];\n const mergeCells = opts.mergeCells ?? [];\n const protectedRanges = opts.protectedRanges ?? [];\n const ignoredErrors = opts.ignoredErrors ?? [];\n const rowBreaks = opts.rowBreaks ?? [];\n const colBreaks = opts.colBreaks ?? [];\n const customSheetViews = opts.customSheetViews ?? [];\n const cellWatches = opts.cellWatches ?? [];\n const controls = opts.controls ?? [];\n const customProperties = opts.customProperties ?? [];\n const oleObjects = opts.oleObjects ?? [];\n const webPublishItems = opts.webPublishItems ?? [];\n\n const p: string[] = [\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x14ac xr xr2 xr3\"' +\n ' xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"' +\n ' xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"' +\n ' xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"' +\n ' xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\">',\n ];\n\n // Sheet properties (tabColor, outlinePr go here)\n const hasTabColor = !!opts.tabColor;\n const hasOutline = columns.some((c) => c.outlineLevel !== undefined);\n const sp = opts.sheetPr;\n const hasSheetPrAttrs =\n sp &&\n (sp.syncHorizontal ||\n sp.syncVertical ||\n sp.syncRef ||\n sp.transitionEvaluation ||\n sp.transitionEntry ||\n sp.published ||\n sp.filterMode ||\n sp.enableFormatConditionsCalculation);\n if (hasTabColor || hasOutline || hasSheetPrAttrs) {\n const prParts: string[] = [];\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sp?.syncHorizontal) prAttrs.syncHorizontal = 1;\n if (sp?.syncVertical) prAttrs.syncVertical = 1;\n if (sp?.syncRef) prAttrs.syncRef = sp.syncRef;\n if (sp?.transitionEvaluation) prAttrs.transitionEvaluation = 1;\n if (sp?.transitionEntry) prAttrs.transitionEntry = 1;\n if (sp?.published) prAttrs.published = 1;\n if (sp?.filterMode) prAttrs.filterMode = 1;\n if (sp?.enableFormatConditionsCalculation) prAttrs.enableFormatConditionsCalculation = 1;\n if (opts.tabColor) {\n const tc = opts.tabColor;\n const tcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (tc.rgb) tcAttrs.rgb = tc.rgb;\n if (tc.theme !== undefined) tcAttrs.theme = tc.theme;\n if (tc.tint !== undefined) tcAttrs.tint = tc.tint;\n if (tc.indexed !== undefined) tcAttrs.indexed = tc.indexed;\n prParts.push(`<tabColor${attrs(tcAttrs)}/>`);\n }\n if (hasOutline) {\n const outAttrs: Record<string, string | number | boolean | undefined> = {\n summaryBelow: 1,\n summaryRight: 1,\n };\n if (sp?.outlineApplyStyles) outAttrs.applyStyles = 1;\n if (sp?.outlineShowSymbols === false) outAttrs.showOutlineSymbols = 0;\n prParts.push(`<outlinePr${attrs(outAttrs)}/>`);\n }\n // pageSetUpPr (inside sheetPr when fitToPage or autoPageBreaks needed)\n if (\n opts.pageSetup?.fitToWidth ||\n opts.pageSetup?.fitToHeight ||\n opts.pageSetup?.autoPageBreaks\n ) {\n const psupAttrs: Record<string, string | number | boolean | undefined> = {};\n if (opts.pageSetup?.fitToWidth || opts.pageSetup?.fitToHeight) psupAttrs.fitToPage = 1;\n if (opts.pageSetup?.autoPageBreaks) psupAttrs.autoPageBreaks = 1;\n prParts.push(`<pageSetUpPr${attrs(psupAttrs)}/>`);\n }\n const prAttrStr = Object.keys(prAttrs).length > 0 ? attrs(prAttrs) : \"\";\n p.push(`<sheetPr${prAttrStr}>${prParts.join(\"\")}</sheetPr>`);\n }\n\n // Dimension — defines the used range of the sheet\n const maxRow = rows.length;\n let maxCol = 0;\n for (const row of rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n if (maxRow > 0 && maxCol > 0) {\n const dimRef = `A1:${defaultCellRef(maxRow, maxCol)}`;\n p.push(`<dimension ref=\"${dimRef}\"/>`);\n }\n\n // Sheet views\n const pivotSelXml = opts.sheetView?.pivotSelections\n ? opts.sheetView.pivotSelections.map((ps) => buildPivotSelectionXml(ps)).join(\"\")\n : \"\";\n if (opts.freezePanes) {\n const fp = opts.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 = defaultCellRef(topRow, leftCol);\n const activePane =\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\";\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n p.push(\n `<sheetViews><sheetView${svAttrs}>`,\n `<pane ySplit=\"${ySplit}\" xSplit=\"${xSplit}\" topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/>`,\n opts.selection ? buildSelectionXml(opts.selection) : \"\",\n pivotSelXml,\n \"</sheetView></sheetViews>\",\n );\n } else {\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n const innerXml = (opts.selection ? buildSelectionXml(opts.selection) : \"\") + pivotSelXml;\n if (innerXml) {\n p.push(`<sheetViews><sheetView${svAttrs}>${innerXml}</sheetView></sheetViews>`);\n } else {\n p.push(`<sheetViews><sheetView${svAttrs}/></sheetViews>`);\n }\n }\n\n // Sheet format — default row height\n if (opts.sheetFormatPr) {\n const sfp = opts.sheetFormatPr;\n const sfpAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sfp.baseColWidth !== undefined) sfpAttrs.baseColWidth = sfp.baseColWidth;\n if (sfp.defaultColWidth !== undefined) sfpAttrs.defaultColWidth = sfp.defaultColWidth;\n sfpAttrs.defaultRowHeight = sfp.defaultRowHeight ?? 15;\n if (sfp.zeroHeight) sfpAttrs.zeroHeight = 1;\n if (sfp.thickTop) sfpAttrs.thickTop = 1;\n if (sfp.thickBottom) sfpAttrs.thickBottom = 1;\n if (sfp.outlineLevelRow !== undefined) sfpAttrs.outlineLevelRow = sfp.outlineLevelRow;\n if (sfp.outlineLevelCol !== undefined) sfpAttrs.outlineLevelCol = sfp.outlineLevelCol;\n p.push(`<sheetFormatPr${attrs(sfpAttrs)}/>`);\n } else {\n p.push('<sheetFormatPr defaultRowHeight=\"15\"/>');\n }\n\n // Column definitions\n if (columns.length > 0) {\n p.push(\"<cols>\");\n for (const col of 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 if (col.outlineLevel !== undefined) {\n colAttrs.outlineLevel = col.outlineLevel;\n }\n if (col.collapsed) {\n colAttrs.collapsed = 1;\n }\n if (col.bestFit) {\n colAttrs.bestFit = 1;\n }\n if (col.phonetic) {\n colAttrs.phonetic = 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 < rows.length; i++) {\n const rowOpts = 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 if (rowOpts.spans) rowAttrs.spans = rowOpts.spans;\n if (rowOpts.customFormat) rowAttrs.customFormat = 1;\n if (rowOpts.thickTop) rowAttrs.thickTop = 1;\n if (rowOpts.thickBot) rowAttrs.thickBot = 1;\n if (rowOpts.ph) rowAttrs.ph = 1;\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 ?? defaultCellRef(rowNumber, j + 1);\n const cellStr = 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 // Sheet calc properties (after sheetData per XSD sequence)\n if (opts.sheetCalcPr) {\n const scAttrs: string[] = [];\n if (opts.sheetCalcPr.fullCalcOnLoad) scAttrs.push('fullCalcOnLoad=\"1\"');\n p.push(`<sheetCalcPr${scAttrs.length ? \" \" + scAttrs.join(\" \") : \"\"}/>`);\n }\n\n // Row breaks (after sheetCalcPr per XSD sequence)\n if (rowBreaks.length > 0) {\n const brkParts = rowBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) bAttrs.man = 1;\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<rowBreaks count=\"${rowBreaks.length}\" manualBreakCount=\"${rowBreaks.filter((b) => b.manual).length}\">${brkParts.join(\"\")}</rowBreaks>`,\n );\n }\n\n // Column breaks\n if (colBreaks.length > 0) {\n const brkParts = colBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) bAttrs.man = 1;\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<colBreaks count=\"${colBreaks.length}\" manualBreakCount=\"${colBreaks.filter((b) => b.manual).length}\">${brkParts.join(\"\")}</colBreaks>`,\n );\n }\n\n // Custom properties (CT_CustomProperties, after colBreaks per XSD sequence)\n if (customProperties.length > 0) {\n const cpParts: string[] = [\"<customProperties>\"];\n for (const cp of customProperties) {\n cpParts.push(`<customPr name=\"${escapeXml(cp.name)}\" r:id=\"${escapeXml(cp.rId)}\"/>`);\n }\n cpParts.push(\"</customProperties>\");\n p.push(cpParts.join(\"\"));\n }\n\n // OLE size\n if (opts.oleSize) {\n p.push(`<oleSize ref=\"${escapeXml(opts.oleSize)}\"/>`);\n }\n\n // Custom sheet views (after oleSize per XSD sequence)\n if (customSheetViews.length > 0) {\n p.push(\"<customSheetViews>\");\n for (const csv of customSheetViews) {\n const csvAttrs: Record<string, string | number | boolean | undefined> = { guid: csv.guid };\n if (csv.scale !== undefined) csvAttrs.scale = csv.scale;\n if (csv.showPageBreaks) csvAttrs.showPageBreaks = 1;\n if (csv.showFormulas) csvAttrs.showFormulas = 1;\n if (csv.showGridLines === false) csvAttrs.showGridLines = 0;\n if (csv.showRowColHeaders === false) csvAttrs.showRowCol = 0;\n if (csv.outlineSymbols === false) csvAttrs.outlineSymbols = 0;\n if (csv.zeroValues === false) csvAttrs.zeroValues = 0;\n if (csv.fitToPage) csvAttrs.fitToPage = 1;\n if (csv.printArea) csvAttrs.printArea = 1;\n if (csv.filter) csvAttrs.filter = 1;\n if (csv.showAutoFilter) csvAttrs.showAutoFilter = 1;\n if (csv.hiddenRows) csvAttrs.hiddenRows = 1;\n if (csv.hiddenColumns) csvAttrs.hiddenColumns = 1;\n if (csv.state && csv.state !== \"visible\") csvAttrs.state = csv.state;\n if (csv.filterUnique) csvAttrs.filterUnique = 1;\n if (csv.view && csv.view !== \"normal\") csvAttrs.view = csv.view;\n p.push(`<customSheetView${attrs(csvAttrs)}/>`);\n }\n p.push(\"</customSheetViews>\");\n }\n\n // Cell watches\n if (cellWatches.length > 0) {\n p.push(\"<cellWatches>\");\n for (const cw of cellWatches) {\n p.push(`<cellWatch r=\"${escapeXml(cw.r)}\"/>`);\n }\n p.push(\"</cellWatches>\");\n }\n\n // Data consolidation\n if (opts.dataConsolidate) {\n const dc = opts.dataConsolidate;\n const dcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (dc.function && dc.function !== \"sum\") dcAttrs.function = dc.function;\n if (dc.topLabels) dcAttrs.topLabels = 1;\n if (dc.leftLabels) dcAttrs.leftLabels = 1;\n if (dc.startLabels) dcAttrs.startLabels = 1;\n if (dc.link) dcAttrs.link = 1;\n const refsInner = dc.refs?.map((r) => `<dataRef ref=\"${escapeXml(r)}\"/>`).join(\"\") ?? \"\";\n const refsXml = refsInner ? `<dataRefs>${refsInner}</dataRefs>` : \"\";\n if (refsXml || Object.keys(dcAttrs).length > 0) {\n p.push(`<dataConsolidate${attrs(dcAttrs)}>${refsXml}</dataConsolidate>`);\n }\n }\n\n // Sheet protection (after sheetData, before protectedRanges per XSD sequence)\n if (opts.protection) {\n const prot = opts.protection;\n const protAttrs: Record<string, string | number | boolean | undefined> = {};\n if (prot.password) protAttrs.password = hashPassword(prot.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let derived: ReturnType<typeof derivePasswordHash> | undefined;\n if (prot.password !== undefined && prot.hashValue === undefined) {\n derived = derivePasswordHash(prot.password);\n }\n protAttrs.algorithmName = prot.algorithmName ?? derived?.algorithmName;\n protAttrs.hashValue = prot.hashValue ?? derived?.hashValue;\n protAttrs.saltValue = prot.saltValue ?? derived?.saltValue;\n if (prot.spinCount !== undefined) protAttrs.spinCount = prot.spinCount;\n else if (derived) protAttrs.spinCount = derived.spinCount;\n if (prot.sheet) protAttrs.sheet = 1;\n if (prot.objects) protAttrs.objects = 1;\n if (prot.scenarios) protAttrs.scenarios = 1;\n if (prot.formatCells === false) protAttrs.formatCells = 0;\n if (prot.formatColumns === false) protAttrs.formatColumns = 0;\n if (prot.formatRows === false) protAttrs.formatRows = 0;\n if (prot.insertColumns === false) protAttrs.insertColumns = 0;\n if (prot.insertRows === false) protAttrs.insertRows = 0;\n if (prot.insertHyperlinks === false) protAttrs.insertHyperlinks = 0;\n if (prot.deleteColumns === false) protAttrs.deleteColumns = 0;\n if (prot.deleteRows === false) protAttrs.deleteRows = 0;\n if (prot.selectLockedCells) protAttrs.selectLockedCells = 1;\n if (prot.sort === false) protAttrs.sort = 0;\n if (prot.autoFilter === false) protAttrs.autoFilter = 0;\n if (prot.pivotTables === false) protAttrs.pivotTables = 0;\n if (prot.selectUnlockedCells) protAttrs.selectUnlockedCells = 1;\n p.push(selfCloseElement(\"sheetProtection\", attrs(protAttrs)));\n }\n\n // Protected ranges (after sheetProtection per XSD sequence)\n if (protectedRanges.length > 0) {\n const prParts: string[] = [\"<protectedRanges>\"];\n for (const pr of protectedRanges) {\n const prAttrs: Record<string, string | number | boolean | undefined> = {\n name: pr.name,\n sqref: pr.sqref,\n };\n if (pr.password) prAttrs.password = hashPassword(pr.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let prDerived: ReturnType<typeof derivePasswordHash> | undefined;\n if (pr.password !== undefined && pr.hashValue === undefined) {\n prDerived = derivePasswordHash(pr.password);\n }\n prAttrs.algorithmName = pr.algorithmName ?? prDerived?.algorithmName;\n prAttrs.hashValue = pr.hashValue ?? prDerived?.hashValue;\n prAttrs.saltValue = pr.saltValue ?? prDerived?.saltValue;\n if (pr.spinCount !== undefined) prAttrs.spinCount = pr.spinCount;\n else if (prDerived) prAttrs.spinCount = prDerived.spinCount;\n const hasSecurityDescriptor = !!pr.securityDescriptor;\n if (hasSecurityDescriptor) {\n prParts.push(\n `<protectedRange${attrs(prAttrs)}><securityDescriptor>${escapeXml(pr.securityDescriptor!)}</securityDescriptor></protectedRange>`,\n );\n } else {\n prParts.push(selfCloseElement(\"protectedRange\", attrs(prAttrs)));\n }\n }\n prParts.push(\"</protectedRanges>\");\n p.push(prParts.join(\"\"));\n }\n\n // Scenarios (what-if analysis)\n if (opts.scenarios) {\n const scParts: string[] = [\"<scenarios\"];\n const scAttrs: Record<string, string | number> = {};\n if (opts.scenarios.current !== undefined) scAttrs.current = opts.scenarios.current;\n if (opts.scenarios.show !== undefined) scAttrs.show = opts.scenarios.show;\n scParts[0] = `<scenarios${attrs(scAttrs)}>`;\n\n for (const scenario of opts.scenarios.scenarios) {\n const sAttrs: Record<string, string | number | boolean | undefined> = {\n name: scenario.name,\n };\n if (scenario.count !== undefined) sAttrs.count = scenario.count;\n if (scenario.user) sAttrs.user = scenario.user;\n if (scenario.comment) sAttrs.comment = scenario.comment;\n if (scenario.hidden) sAttrs.hidden = true;\n if (scenario.locked) sAttrs.locked = true;\n\n const sParts: string[] = [`<scenario${attrs(sAttrs)}>`];\n for (const cell of scenario.inputCells) {\n const icAttrs: Record<string, string | number | boolean | undefined> = {\n r: cell.r,\n val: String(cell.val),\n };\n if (cell.deleted) icAttrs.deleted = true;\n if (cell.undone) icAttrs.undone = true;\n sParts.push(`<inputCells${attrs(icAttrs)}/>`);\n }\n sParts.push(\"</scenario>\");\n scParts.push(sParts.join(\"\"));\n }\n scParts.push(\"</scenarios>\");\n p.push(scParts.join(\"\"));\n }\n\n // Auto filter\n if (opts.autoFilter) {\n if (typeof opts.autoFilter === \"string\") {\n p.push(selfCloseElement(\"autoFilter\", attrs({ ref: opts.autoFilter })));\n } else {\n const af = opts.autoFilter;\n const inner: string[] = [];\n for (const t10 of af.top10 ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: t10.colId,\n };\n if (t10.hiddenButton) fcAttrs.hiddenButton = 1;\n if (t10.showButton === false) fcAttrs.showButton = 0;\n const t10Attrs: Record<string, string | number | boolean | undefined> = { val: t10.val };\n if (t10.top === false) t10Attrs.top = 0;\n if (t10.percent) t10Attrs.percent = 1;\n if (t10.filterVal !== undefined) t10Attrs.filterVal = t10.filterVal;\n inner.push(`<filterColumn${attrs(fcAttrs)}><top10${attrs(t10Attrs)}/></filterColumn>`);\n }\n for (const cf of af.customFilters ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: cf.colId,\n };\n if (cf.hiddenButton) fcAttrs.hiddenButton = 1;\n if (cf.showButton === false) fcAttrs.showButton = 0;\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (cf.and) cfAttrs.and = 1;\n const filters: string[] = [];\n if (cf.val !== undefined) {\n const fAttrs: Record<string, string | number | boolean | undefined> = { val: cf.val };\n if (cf.operator) fAttrs.operator = cf.operator;\n filters.push(selfCloseElement(\"customFilter\", attrs(fAttrs)));\n }\n if (cf.val2 !== undefined) {\n filters.push(selfCloseElement(\"customFilter\", attrs({ val: cf.val2 })));\n }\n if (filters.length > 0) {\n inner.push(\n `<filterColumn${attrs(fcAttrs)}><customFilters${attrs(cfAttrs)}>${filters.join(\"\")}</customFilters></filterColumn>`,\n );\n }\n }\n // Simple filters (CT_Filters)\n for (const fi of af.filters ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: fi.colId,\n };\n const filtersAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fi.blank) filtersAttrs.blank = 1;\n if (fi.calendarType) filtersAttrs.calendarType = fi.calendarType;\n const valParts = (fi.values ?? []).map((v) => `<filter val=\"${escapeXml(v)}\"/>`);\n inner.push(\n `<filterColumn${attrs(fcAttrs)}><filters${attrs(filtersAttrs)}>${valParts.join(\"\")}</filters></filterColumn>`,\n );\n }\n if (af.sort && af.sort.length > 0) {\n const sortParts: string[] = [];\n for (const sc of af.sort) {\n const scAttrs: Record<string, string | number | boolean | undefined> = { ref: sc.ref };\n if (sc.descending) scAttrs.descending = 1;\n if (sc.sortBy) scAttrs.sortBy = sc.sortBy;\n if (sc.customList) scAttrs.customList = sc.customList;\n if (sc.iconId !== undefined) scAttrs.iconId = sc.iconId;\n sortParts.push(selfCloseElement(\"sortCondition\", attrs(scAttrs)));\n }\n const ssAttrs: Record<string, string | number | boolean | undefined> = { ref: af.ref };\n if (af.sortState?.columnSort) ssAttrs.columnSort = 1;\n if (af.sortState?.caseSensitive) ssAttrs.caseSensitive = 1;\n if (af.sortState?.sortMethod) ssAttrs.sortMethod = af.sortState.sortMethod;\n inner.push(`<sortState${attrs(ssAttrs)}>${sortParts.join(\"\")}</sortState>`);\n }\n // Color filters\n for (const cf of af.colorFilters ?? []) {\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (cf.dxfId !== undefined) cfAttrs.dxfId = cf.dxfId;\n if (cf.cellColor === false) cfAttrs.cellColor = 0;\n inner.push(\n `<filterColumn colId=\"${cf.colId}\"><colorFilter${attrs(cfAttrs)}/></filterColumn>`,\n );\n }\n // Icon filters\n for (const if_ of af.iconFilters ?? []) {\n const ifAttrs: Record<string, string | number | boolean | undefined> = {\n iconSet: if_.iconSet,\n };\n if (if_.iconId !== undefined) ifAttrs.iconId = if_.iconId;\n inner.push(\n `<filterColumn colId=\"${if_.colId}\"><iconFilter${attrs(ifAttrs)}/></filterColumn>`,\n );\n }\n // Dynamic filters\n for (const df of af.dynamicFilters ?? []) {\n const dfAttrs: Record<string, string | number | boolean | undefined> = { type: df.type };\n if (df.val !== undefined) dfAttrs.val = df.val;\n if (df.maxVal !== undefined) dfAttrs.maxVal = df.maxVal;\n if (df.valIso !== undefined) dfAttrs.valIso = df.valIso;\n if (df.maxValIso !== undefined) dfAttrs.maxValIso = df.maxValIso;\n inner.push(\n `<filterColumn colId=\"${df.colId}\"><dynamicFilter${attrs(dfAttrs)}/></filterColumn>`,\n );\n }\n // Date group filters\n for (const dg of af.dateGroupItems ?? []) {\n const dgAttrs: Record<string, string | number | boolean | undefined> = {\n dateTimeGrouping: dg.dateTimeGrouping,\n };\n if (dg.year !== undefined) dgAttrs.year = dg.year;\n if (dg.month !== undefined) dgAttrs.month = dg.month;\n if (dg.day !== undefined) dgAttrs.day = dg.day;\n if (dg.hour !== undefined) dgAttrs.hour = dg.hour;\n if (dg.minute !== undefined) dgAttrs.minute = dg.minute;\n if (dg.second !== undefined) dgAttrs.second = dg.second;\n inner.push(\n `<filterColumn colId=\"${dg.colId}\"><dateGroupItem${attrs(dgAttrs)}/></filterColumn>`,\n );\n }\n if (inner.length > 0) {\n p.push(`<autoFilter ref=\"${af.ref}\">`, ...inner, \"</autoFilter>\");\n } else {\n p.push(selfCloseElement(\"autoFilter\", attrs({ ref: af.ref })));\n }\n }\n }\n\n // Merge cells\n if (mergeCells.length > 0) {\n p.push(`<mergeCells count=\"${mergeCells.length}\">`);\n for (const mc of mergeCells) {\n const fromRef = defaultCellRef(mc.from.row, mc.from.col);\n const toRef = defaultCellRef(mc.to.row, mc.to.col);\n p.push(selfCloseElement(\"mergeCell\", attrs({ ref: `${fromRef}:${toRef}` })));\n }\n p.push(\"</mergeCells>\");\n }\n\n // Phonetic properties (after mergeCells per XSD sequence)\n if (opts.phoneticPr) {\n const pp = opts.phoneticPr;\n const ppAttrs: Record<string, string | number> = { fontId: pp.fontId };\n if (pp.type && pp.type !== \"fullwidthKatakana\") ppAttrs.type = pp.type;\n if (pp.alignment && pp.alignment !== \"left\") ppAttrs.alignment = pp.alignment;\n p.push(selfCloseElement(\"phoneticPr\", attrs(ppAttrs)));\n }\n\n // Conditional formatting\n const conditionalFormats = opts.conditionalFormats ?? [];\n if (conditionalFormats.length > 0) {\n for (const cf of 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.stopIfTrue) ruleAttrs.stopIfTrue = 1;\n if (rule.timePeriod) ruleAttrs.timePeriod = rule.timePeriod;\n if (rule.rank !== undefined) ruleAttrs.rank = rule.rank;\n if (rule.equalAverage) ruleAttrs.equalAverage = 1;\n\n // Color scale\n if (rule.type === \"colorScale\" && rule.colorScale) {\n const cs = rule.colorScale;\n const inner: string[] = [];\n for (const v of cs.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n for (const c of cs.colors) {\n inner.push(`<color rgb=\"FF${c}\"/>`);\n }\n p.push(`<cfRule${attrs(ruleAttrs)}><colorScale>${inner.join(\"\")}</colorScale></cfRule>`);\n }\n // Data bar\n else if (rule.type === \"dataBar\" && rule.dataBar) {\n const db = rule.dataBar;\n const inner: string[] = [];\n for (const v of db.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n inner.push(`<color rgb=\"FF${db.color}\"/>`);\n const dbAttrs: Record<string, string | number | boolean | undefined> = {};\n if (db.minLength !== undefined && db.minLength !== 10) dbAttrs.minLength = db.minLength;\n if (db.maxLength !== undefined && db.maxLength !== 90) dbAttrs.maxLength = db.maxLength;\n if (db.showValue === false) dbAttrs.showValue = 0;\n const attrStr = Object.keys(dbAttrs).length > 0 ? attrs(dbAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}><dataBar${attrStr}>${inner.join(\"\")}</dataBar></cfRule>`,\n );\n }\n // Icon set\n else if (rule.type === \"iconSet\" && rule.iconSet) {\n const is = rule.iconSet;\n const inner: string[] = [];\n for (const v of is.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n const isAttrs: Record<string, string | number | boolean | undefined> = {};\n if (is.iconSet !== undefined && is.iconSet !== \"3TrafficLights1\")\n isAttrs.iconSet = is.iconSet;\n if (is.showValue === false) isAttrs.showValue = 0;\n if (is.percent === false) isAttrs.percent = 0;\n if (is.reverse) isAttrs.reverse = 1;\n const attrStr = Object.keys(isAttrs).length > 0 ? attrs(isAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}><iconSet${attrStr}>${inner.join(\"\")}</iconSet></cfRule>`,\n );\n }\n // Standard rules (cellIs, containsText, expression, top10, aboveAverage)\n else {\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 }\n p.push(\"</conditionalFormatting>\");\n }\n }\n\n // Data validations\n const dataValidations = opts.dataValidations ?? [];\n if (dataValidations.length > 0) {\n const dvContainerAttrs: Record<string, string | number | boolean | undefined> = {\n count: dataValidations.length,\n };\n if (opts.dataValidationsDisablePrompts) dvContainerAttrs.disablePrompts = 1;\n p.push(`<dataValidations${attrs(dvContainerAttrs)}>`);\n for (const dv of 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 if (dv.errorStyle) dvAttrs.errorStyle = dv.errorStyle;\n if (dv.imeMode) dvAttrs.imeMode = dv.imeMode;\n if (dv.showDropDown) dvAttrs.showDropDown = 1;\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 // Hyperlinks — r:id numbering must match worksheet rels order (compiler handles rels)\n const hyperlinks = opts.hyperlinks ?? [];\n if (hyperlinks.length > 0) {\n p.push(\"<hyperlinks>\");\n let hlIdx = 0;\n for (const hl of hyperlinks) {\n const hlAttrs: Record<string, string | number | boolean | undefined> = { ref: hl.cell };\n if (hl.target.type === \"external\") {\n hlIdx++;\n hlAttrs[\"r:id\"] = `rId${hlIdx}`;\n } else {\n hlAttrs.location = hl.target.location;\n }\n if (hl.tooltip) hlAttrs.tooltip = hl.tooltip;\n if (hl.display) hlAttrs.display = hl.display;\n p.push(selfCloseElement(\"hyperlink\", attrs(hlAttrs)));\n }\n p.push(\"</hyperlinks>\");\n }\n\n // Print options\n if (opts.printOptions) {\n const po = opts.printOptions;\n const poAttrs: Record<string, string | number | boolean | undefined> = {};\n if (po.horizontalCentered) poAttrs.horizontalCentered = 1;\n if (po.verticalCentered) poAttrs.verticalCentered = 1;\n if (po.headings) poAttrs.headings = 1;\n if (po.gridLines) poAttrs.gridLines = 1;\n if (po.gridLinesSet === false) poAttrs.gridLinesSet = 0;\n p.push(selfCloseElement(\"printOptions\", attrs(poAttrs)));\n }\n\n p.push('<pageMargins left=\"0.75\" right=\"0.75\" top=\"1\" bottom=\"1\" header=\"0.5\" footer=\"0.5\"/>');\n\n // Page setup\n if (opts.pageSetup) {\n const ps = opts.pageSetup;\n const psAttrs: Record<string, string | number | boolean | undefined> = {};\n if (ps.paperSize !== undefined) psAttrs.paperSize = ps.paperSize;\n if (ps.orientation && ps.orientation !== \"default\") psAttrs.orientation = ps.orientation;\n if (ps.scale !== undefined) psAttrs.scale = ps.scale;\n if (ps.fitToWidth !== undefined) psAttrs.fitToWidth = ps.fitToWidth;\n if (ps.fitToHeight !== undefined) psAttrs.fitToHeight = ps.fitToHeight;\n if (ps.pageOrder && ps.pageOrder !== \"downThenOver\") psAttrs.pageOrder = ps.pageOrder;\n if (ps.useFirstPageNumber) psAttrs.useFirstPageNumber = 1;\n if (ps.firstPageNumber !== undefined) psAttrs.firstPageNumber = ps.firstPageNumber;\n if (ps.paperHeight !== undefined) psAttrs.paperHeight = ps.paperHeight;\n if (ps.paperWidth !== undefined) psAttrs.paperWidth = ps.paperWidth;\n if (ps.usePrinterDefaults) psAttrs.usePrinterDefaults = 1;\n if (ps.blackAndWhite) psAttrs.blackAndWhite = 1;\n if (ps.draft) psAttrs.draft = 1;\n if (ps.cellComments && ps.cellComments !== \"none\") psAttrs.cellComments = ps.cellComments;\n if (ps.errors && ps.errors !== \"displayed\") psAttrs.errors = ps.errors;\n p.push(selfCloseElement(\"pageSetup\", attrs(psAttrs)));\n }\n\n // Header/footer\n if (opts.headerFooter) {\n const hf = opts.headerFooter;\n const hfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (hf.differentOddEven) hfAttrs.differentOddEven = 1;\n if (hf.differentFirst) hfAttrs.differentFirst = 1;\n if (hf.scaleWithDoc === false) hfAttrs.scaleWithDoc = 0;\n if (hf.alignWithMargins === false) hfAttrs.alignWithMargins = 0;\n const inner: string[] = [];\n if (hf.oddHeader) inner.push(`<oddHeader>${escapeXml(hf.oddHeader)}</oddHeader>`);\n if (hf.oddFooter) inner.push(`<oddFooter>${escapeXml(hf.oddFooter)}</oddFooter>`);\n if (hf.evenHeader) inner.push(`<evenHeader>${escapeXml(hf.evenHeader)}</evenHeader>`);\n if (hf.evenFooter) inner.push(`<evenFooter>${escapeXml(hf.evenFooter)}</evenFooter>`);\n if (hf.firstHeader) inner.push(`<firstHeader>${escapeXml(hf.firstHeader)}</firstHeader>`);\n if (hf.firstFooter) inner.push(`<firstFooter>${escapeXml(hf.firstFooter)}</firstFooter>`);\n if (inner.length > 0) {\n p.push(`<headerFooter${attrs(hfAttrs)}>`, ...inner, \"</headerFooter>\");\n } else if (hfAttrs.differentOddEven || hfAttrs.differentFirst) {\n p.push(selfCloseElement(\"headerFooter\", attrs(hfAttrs)));\n }\n }\n\n // Drawing in header/footer (after headerFooter per XSD sequence)\n if (opts.drawingHF) {\n const dhf = opts.drawingHF;\n const dhfAttrs: Record<string, string | number | boolean | undefined> = { \"r:id\": dhf.rId };\n if (dhf.lho !== undefined) dhfAttrs.lho = dhf.lho;\n if (dhf.lhe !== undefined) dhfAttrs.lhe = dhf.lhe;\n if (dhf.lhf !== undefined) dhfAttrs.lhf = dhf.lhf;\n if (dhf.cho !== undefined) dhfAttrs.cho = dhf.cho;\n if (dhf.che !== undefined) dhfAttrs.che = dhf.che;\n if (dhf.chf !== undefined) dhfAttrs.chf = dhf.chf;\n if (dhf.rho !== undefined) dhfAttrs.rho = dhf.rho;\n if (dhf.rhe !== undefined) dhfAttrs.rhe = dhf.rhe;\n if (dhf.rhf !== undefined) dhfAttrs.rhf = dhf.rhf;\n if (dhf.lfo !== undefined) dhfAttrs.lfo = dhf.lfo;\n if (dhf.lfe !== undefined) dhfAttrs.lfe = dhf.lfe;\n if (dhf.lff !== undefined) dhfAttrs.lff = dhf.lff;\n if (dhf.cfo !== undefined) dhfAttrs.cfo = dhf.cfo;\n if (dhf.cfe !== undefined) dhfAttrs.cfe = dhf.cfe;\n if (dhf.cff !== undefined) dhfAttrs.cff = dhf.cff;\n if (dhf.rfo !== undefined) dhfAttrs.rfo = dhf.rfo;\n if (dhf.rfe !== undefined) dhfAttrs.rfe = dhf.rfe;\n if (dhf.rff !== undefined) dhfAttrs.rff = dhf.rff;\n p.push(selfCloseElement(\"drawingHF\", attrs(dhfAttrs)));\n }\n\n // Legacy drawing in header/footer\n if (opts.legacyDrawingHF) {\n p.push(`<legacyDrawingHF r:id=\"${escapeXml(opts.legacyDrawingHF)}\"/>`);\n }\n\n // Ignored errors (after headerFooter per XSD sequence)\n if (ignoredErrors.length > 0) {\n const ieParts: string[] = [\"<ignoredErrors>\"];\n for (const ie of ignoredErrors) {\n const ieAttrs: Record<string, string | number | boolean | undefined> = {\n sqref: ie.sqref,\n };\n if (ie.evalError) ieAttrs.evalError = 1;\n if (ie.twoDigitTextYear) ieAttrs.twoDigitTextYear = 1;\n if (ie.numberStoredAsText) ieAttrs.numberStoredAsText = 1;\n if (ie.formula) ieAttrs.formula = 1;\n if (ie.formulaRange) ieAttrs.formulaRange = 1;\n if (ie.unlockedFormula) ieAttrs.unlockedFormula = 1;\n if (ie.emptyCellReference) ieAttrs.emptyCellReference = 1;\n if (ie.listDataValidation) ieAttrs.listDataValidation = 1;\n if (ie.calculatedColumn) ieAttrs.calculatedColumn = 1;\n ieParts.push(selfCloseElement(\"ignoredError\", attrs(ieAttrs)));\n }\n ieParts.push(\"</ignoredErrors>\");\n p.push(ieParts.join(\"\"));\n }\n\n // Background picture placeholder — compiler replaces with <picture r:id=\"rIdN\"/>\n if (opts.backgroundImage) {\n p.push(\"<!--BACKGROUND_PICTURE-->\");\n }\n\n // OLE objects (CT_OleObjects, after picture per XSD sequence)\n if (oleObjects.length > 0) {\n const oleParts: string[] = [\"<oleObjects>\"];\n for (const ole of oleObjects) {\n const oleAttrs: string[] = [`shapeId=\"${ole.shapeId}\"`];\n if (ole.progId) oleAttrs.push(`progId=\"${escapeXml(ole.progId)}\"`);\n if (ole.dvAspect && ole.dvAspect !== \"DVASPECT_CONTENT\")\n oleAttrs.push(`dvAspect=\"${ole.dvAspect}\"`);\n if (ole.link) oleAttrs.push(`link=\"${escapeXml(ole.link)}\"`);\n if (ole.oleUpdate) oleAttrs.push(`oleUpdate=\"${ole.oleUpdate}\"`);\n if (ole.autoLoad) oleAttrs.push('autoLoad=\"1\"');\n if (ole.rId) oleAttrs.push(`r:id=\"${escapeXml(ole.rId)}\"`);\n // objectPr (CT_ObjectPr, optional child)\n if (ole.objectPr) {\n const opr = ole.objectPr;\n const oprAttrs: string[] = [];\n if (opr.locked === false) oprAttrs.push('locked=\"0\"');\n if (opr.defaultSize === false) oprAttrs.push('defaultSize=\"0\"');\n if (opr.print === false) oprAttrs.push('print=\"0\"');\n if (opr.disabled) oprAttrs.push('disabled=\"1\"');\n if (opr.uiObject) oprAttrs.push('uiObject=\"1\"');\n if (opr.autoFill === false) oprAttrs.push('autoFill=\"0\"');\n if (opr.autoLine === false) oprAttrs.push('autoLine=\"0\"');\n if (opr.autoPict === false) oprAttrs.push('autoPict=\"0\"');\n if (opr.macro) oprAttrs.push(`macro=\"${escapeXml(opr.macro)}\"`);\n if (opr.altText) oprAttrs.push(`altText=\"${escapeXml(opr.altText)}\"`);\n if (opr.dde) oprAttrs.push('dde=\"1\"');\n if (opr.rId) oprAttrs.push(`r:id=\"${escapeXml(opr.rId)}\"`);\n oleParts.push(\n `<oleObject ${oleAttrs.join(\" \")}><objectPr${oprAttrs.length ? \" \" + oprAttrs.join(\" \") : \"\"}/></oleObject>`,\n );\n } else {\n oleParts.push(`<oleObject ${oleAttrs.join(\" \")}/>`);\n }\n }\n oleParts.push(\"</oleObjects>\");\n p.push(oleParts.join(\"\"));\n }\n\n // Controls (CT_Controls, after oleObjects per XSD sequence)\n if (controls.length > 0) {\n const ctrlParts: string[] = [\"<controls>\"];\n for (const c of controls) {\n const cAttrs: string[] = [`shapeId=\"${c.shapeId}\"`, `r:id=\"${escapeXml(c.rId)}\"`];\n if (c.name) cAttrs.push(`name=\"${escapeXml(c.name)}\"`);\n // controlPr (optional)\n const prAttrs: string[] = [];\n if (c.locked === false) prAttrs.push('locked=\"0\"');\n if (c.uiObject) prAttrs.push('uiObject=\"1\"');\n if (c.recalcAlways) prAttrs.push('recalcAlways=\"1\"');\n if (c.linkedCell) prAttrs.push(`linkedCell=\"${escapeXml(c.linkedCell)}\"`);\n if (c.listFillRange) prAttrs.push(`listFillRange=\"${escapeXml(c.listFillRange)}\"`);\n if (c.cf) prAttrs.push(`cf=\"${escapeXml(c.cf)}\"`);\n if (prAttrs.length > 0) {\n ctrlParts.push(\n `<control ${cAttrs.join(\" \")}><controlPr${prAttrs.length ? \" \" + prAttrs.join(\" \") : \"\"}/></control>`,\n );\n } else {\n ctrlParts.push(`<control ${cAttrs.join(\" \")}/>`);\n }\n }\n ctrlParts.push(\"</controls>\");\n p.push(ctrlParts.join(\"\"));\n }\n\n // Web publish items (CT_WebPublishItems, after controls per XSD sequence)\n if (webPublishItems.length > 0) {\n const wpParts: string[] = [`<webPublishItems count=\"${webPublishItems.length}\">`];\n for (const wpi of webPublishItems) {\n const wpiAttrs: string[] = [\n `id=\"${wpi.id}\"`,\n `divId=\"${escapeXml(wpi.divId)}\"`,\n `sourceType=\"${wpi.sourceType}\"`,\n `destinationFile=\"${escapeXml(wpi.destinationFile)}\"`,\n ];\n if (wpi.sourceRef) wpiAttrs.push(`sourceRef=\"${escapeXml(wpi.sourceRef)}\"`);\n if (wpi.sourceObject) wpiAttrs.push(`sourceObject=\"${escapeXml(wpi.sourceObject)}\"`);\n if (wpi.title) wpiAttrs.push(`title=\"${escapeXml(wpi.title)}\"`);\n if (wpi.autoRepublish) wpiAttrs.push('autoRepublish=\"1\"');\n wpParts.push(`<webPublishItem ${wpiAttrs.join(\" \")}/>`);\n }\n wpParts.push(\"</webPublishItems>\");\n p.push(wpParts.join(\"\"));\n }\n\n // Extension list (extLst, last per XSD sequence)\n if (opts.ext) {\n p.push(`<extLst>${opts.ext}</extLst>`);\n }\n\n p.push(\"</worksheet>\");\n return p.join(\"\");\n}\n\n// ── Stringify helpers ──\n\nfunction buildCfvoXml(cfvo: CfvoOptions): string {\n const a: Record<string, string | number | boolean | undefined> = { type: cfvo.type };\n if (cfvo.val !== undefined) a.val = cfvo.val;\n if (cfvo.gte === false) a.gte = 0;\n return `<cfvo${attrs(a)}/>`;\n}\n\nfunction buildSheetViewAttrs(sv?: SheetViewOptions): string {\n const svMap: Record<string, string | number | boolean | undefined> = {\n workbookViewId: 0,\n };\n if (sv?.tabSelected !== undefined) svMap.tabSelected = sv.tabSelected ? 1 : 0;\n else svMap.tabSelected = 1;\n if (sv?.showGridLines === false) svMap.showGridLines = 0;\n if (sv?.showRowColHeaders === false) svMap.showRowColHeaders = 0;\n if (sv?.showZeros === false) svMap.showZeros = 0;\n if (sv?.zoomScale !== undefined) svMap.zoomScale = sv.zoomScale;\n if (sv?.rightToLeft) svMap.rightToLeft = 1;\n if (sv?.windowProtection) svMap.windowProtection = 1;\n if (sv?.showFormulas) svMap.showFormulas = 1;\n if (sv?.showRuler === false) svMap.showRuler = 0;\n if (sv?.showOutlineSymbols === false) svMap.showOutlineSymbols = 0;\n if (sv?.defaultGridColor === false) svMap.defaultGridColor = 0;\n if (sv?.showWhiteSpace === false) svMap.showWhiteSpace = 0;\n if (sv?.view) svMap.view = sv.view;\n if (sv?.colorId !== undefined) svMap.colorId = sv.colorId;\n if (sv?.zoomScaleNormal !== undefined) svMap.zoomScaleNormal = sv.zoomScaleNormal;\n if (sv?.zoomScaleSheetLayoutView !== undefined)\n svMap.zoomScaleSheetLayoutView = sv.zoomScaleSheetLayoutView;\n if (sv?.zoomScalePageLayoutView !== undefined)\n svMap.zoomScalePageLayoutView = sv.zoomScalePageLayoutView;\n return attrs(svMap);\n}\n\nfunction buildSelectionXml(sel: SelectionOptions): string {\n const selAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sel.pane) selAttrs.pane = sel.pane;\n if (sel.activeCell) selAttrs.activeCell = sel.activeCell;\n if (sel.activeCellId !== undefined) selAttrs.activeCellId = sel.activeCellId;\n if (sel.sqref) selAttrs.sqref = sel.sqref;\n return `<selection${attrs(selAttrs)}/>`;\n}\n\nfunction buildPivotSelectionXml(_ps: PivotSelectionOptions): string {\n // pivotSelection is optional; omit if no meaningful pivotArea can be constructed.\n // An empty <pivotArea/> causes Excel to reject the file.\n return \"\";\n}\n\nfunction hashPassword(password: string): string {\n let hash = 0;\n for (let i = 0; i < password.length; i++) {\n const c = password.charCodeAt(i);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= c;\n hash = hash & 0x4000 ? hash ^ 0x1 : hash;\n }\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= password.length;\n return hash.toString(16).toUpperCase().padStart(4, \"0\");\n}\n\nfunction buildFormulaString(fOpts: FormulaOptions): string {\n const fAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fOpts.type && fOpts.type !== FormulaType.NORMAL) fAttrs.t = fOpts.type;\n if (fOpts.reference) fAttrs.ref = fOpts.reference;\n if (fOpts.sharedIndex !== undefined) fAttrs.si = fOpts.sharedIndex;\n if (fOpts.aca) fAttrs.aca = 1;\n if (fOpts.dt2D) fAttrs.dt2D = 1;\n if (fOpts.dtr) fAttrs.dtr = 1;\n if (fOpts.del1) fAttrs.del1 = 1;\n if (fOpts.del2) fAttrs.del2 = 1;\n if (fOpts.r1) fAttrs.r1 = fOpts.r1;\n if (fOpts.r2) fAttrs.r2 = fOpts.r2;\n if (fOpts.ca) fAttrs.ca = 1;\n if (fOpts.bx) fAttrs.bx = 1;\n\n const hasContent = fOpts.formula !== undefined && fOpts.formula !== \"\";\n\n if (hasContent) {\n return `<f${attrs(fAttrs)}>${escapeXml(fOpts.formula)}</f>`;\n }\n if (Object.keys(fAttrs).length > 0) {\n return selfCloseElement(\"f\", attrs(fAttrs));\n }\n return \"\";\n}\n\nfunction 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\n // Formula path — formula takes precedence; value is the cached result.\n if (cell.formula) {\n const fStr = buildFormulaString(cell.formula);\n let vStr = \"\";\n if (value === null || value === undefined) {\n return `<c${attrs(cellAttrs)}>${fStr}</c>`;\n }\n if (typeof value === \"number\") {\n vStr = `<v>${value}</v>`;\n } else if (typeof value === \"boolean\") {\n cellAttrs.t = \"b\";\n vStr = `<v>${value ? 1 : 0}</v>`;\n } else if (typeof value === \"string\") {\n cellAttrs.t = \"str\";\n vStr = `<v>${escapeXml(value)}</v>`;\n } else if (value instanceof Date) {\n vStr = `<v>${dateToSerialNumber(value)}</v>`;\n }\n if (vStr) {\n return `<c${attrs(cellAttrs)}>${fStr}${vStr}</c>`;\n }\n return `<c${attrs(cellAttrs)}>${fStr}</c>`;\n }\n\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return selfCloseElement(\"c\", attrs(cellAttrs));\n }\n return \"\";\n }\n\n // Rich text value (RichTextOptions)\n if (typeof value === \"object\" && !(value instanceof Date)) {\n if (sharedStrings) {\n cellAttrs.t = \"s\";\n const idx = sharedStrings.registerRich(value);\n return `<c${attrs(cellAttrs)}><v>${idx}</v></c>`;\n }\n cellAttrs.t = \"inlineStr\";\n return `<c${attrs(cellAttrs)}><is>${buildRstXml(value)}</is></c>`;\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 = dateToSerialNumber(value);\n return `<c${attrs(cellAttrs)}><v>${serial}</v></c>`;\n }\n\n return \"\";\n}\n\nfunction defaultCellRef(row: number, col: number): string {\n return columnToLetter(col) + row;\n}\n\nfunction 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\nfunction 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// ── Parse helpers ──\n\nfunction parseCfvo(el: XmlElement): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n result.type = attr(el, \"type\") ?? \"num\";\n const val = attr(el, \"val\");\n if (val !== undefined) result.val = isNaN(Number(val)) ? val : Number(val);\n if (attr(el, \"gte\") === \"0\") result.gte = false;\n return result;\n}\n\nfunction parseCellRef(ref: string): { row: number; col: number } | undefined {\n const match = ref.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return undefined;\n const colStr = match[1];\n const row = parseInt(match[2], 10);\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n return { row, col };\n}\n","/**\n * Content Types module for XLSX packages.\n *\n * @module\n */\n\nconst XLSX_MAIN = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\";\nconst XLSX_WORKSHEET = \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst XLSX_CHARTSHEET =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+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 type: EntryType;\n contentType: string;\n key: string;\n}\n\nconst STATIC_ENTRIES: 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\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 {\n private dynamicEntries: ContentEntry[] = [];\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 addChartsheet(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: XLSX_CHARTSHEET,\n key: `/xl/chartsheets/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 addComments(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n key: `/xl/comments${index}.xml`,\n });\n }\n\n public addVmlDrawing(): void {\n if (this.dynamicEntries.some((e) => e.type === \"Default\" && e.key === \"vml\")) return;\n this.dynamicEntries.push({\n type: \"Default\",\n contentType: \"application/vnd.openxmlformats-officedocument.vmlDrawing\",\n key: \"vml\",\n });\n }\n\n public addImageType(extension: \"png\" | \"jpeg\"): void {\n const contentType = extension === \"png\" ? \"image/png\" : \"image/jpeg\";\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 addPivotTable(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\",\n key: `/xl/pivotTables/pivotTable${index}.xml`,\n });\n }\n\n public addPivotCacheDefinition(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\",\n key: `/xl/pivotCache/pivotCacheDefinition${index}.xml`,\n });\n }\n\n public addPivotCacheRecords(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\",\n key: `/xl/pivotCache/pivotCacheRecords${index}.xml`,\n });\n }\n\n public addTable(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\",\n key: `/xl/tables/table${index}.xml`,\n });\n }\n\n public addExternalLink(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\",\n key: `/xl/externalLinks/externalLink${index}.xml`,\n });\n }\n\n public addCalcChain(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\",\n key: \"/xl/calcChain.xml\",\n });\n }\n\n public addDialogsheet(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n key: `/xl/dialogsheets/sheet${index}.xml`,\n });\n }\n\n public addRevisionHeaders(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType:\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\",\n key: \"/xl/revisionHeaders.xml\",\n });\n }\n\n public addRevisionLog(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\",\n key: `/xl/revisions/revision${index}.xml`,\n });\n }\n\n public addQueryTable(index: number): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\",\n key: `/xl/queryTables/queryTable${index}.xml`,\n });\n }\n\n public addMetadata(): void {\n this.dynamicEntries.push({\n type: \"Override\",\n contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\",\n key: \"/xl/metadata.xml\",\n });\n }\n\n public serialize(): 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 * Media collection for XLSX files — stores image binary data.\n *\n * @module\n */\n\nexport interface MediaData {\n fileName: string;\n type: string;\n data: Uint8Array;\n width: number;\n height: number;\n}\n\nexport class Media {\n private 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(): MediaData[] {\n return [...this.map.values()];\n }\n}\n","/**\n * XLSX compile context — write and read contexts for the descriptor pipeline.\n *\n * @module\n */\n\nimport { ChartCollection, Relationships, type RelationshipType } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { ContentTypes } from \"@parts/content-types\";\nimport { Media } from \"@parts/media\";\nimport { SharedStrings } from \"@parts/shared-strings\";\nimport { Styles } from \"@parts/styles\";\nimport type { DxfOptions } from \"@parts/styles\";\nimport type { PivotCacheReference } from \"@parts/workbook\";\n\nimport type { XlsxDocument } from \"./parse\";\n\n// ── Write Context ──\n\n/**\n * XLSX-specific write context.\n *\n * Holds mutable state that accumulates during the compile phase:\n * shared strings, styles, media, charts, content types, and relationships.\n */\nexport class XlsxWriteContext implements WriteContext {\n sharedStrings = new SharedStrings();\n styles = new Styles();\n media = new Media();\n charts = new ChartCollection();\n contentTypes = new ContentTypes();\n workbookRels = new Relationships();\n pivotCacheRefs: PivotCacheReference[] = [];\n\n // ── WriteContext stubs (core interface) ──\n\n public addRelationship(type: RelationshipType, target: string, _mode?: string): string {\n const id = this.workbookRels.relationshipCount + 1;\n this.workbookRels.addRelationship(id, type, target);\n return `rId${id}`;\n }\n\n public addMedia(_data: Uint8Array, _type: string): string {\n // Stub — XLSX media registration goes through Media.addImage() in compiler.\n return \"\";\n }\n\n /**\n * Register a differential format and return its dxfId.\n */\n public registerDxf(opts: DxfOptions): number {\n return this.styles.registerDxf(opts);\n }\n}\n\n// ── Read Context ──\n\n/**\n * XLSX-specific read context.\n *\n * Wraps an {@link XlsxDocument} to implement the core {@link ReadContext}\n * interface used by the descriptor parse pipeline.\n */\nexport class XlsxReadContext implements ReadContext {\n /** Parsed shared strings for resolving cell values. */\n public readonly sharedStrings: string[];\n\n constructor(\n private xlsx: XlsxDocument,\n sharedStrings?: string[],\n ) {\n this.sharedStrings = sharedStrings ?? [];\n }\n\n public resolveRelationship(rId: string): string | undefined {\n const wbRels = this.xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n if (!wbRels?.elements) return undefined;\n for (const child of wbRels.elements) {\n if (child.name !== \"Relationship\") continue;\n if (child.attributes?.[\"Id\"] === rId) {\n const target = child.attributes[\"Target\"] as string | undefined;\n if (!target) return undefined;\n return target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`;\n }\n }\n return undefined;\n }\n\n public getPart(path: string): Element | undefined {\n return this.xlsx.doc.get(path);\n }\n\n public getRaw(path: string): Uint8Array | undefined {\n return this.xlsx.doc.getRaw(path);\n }\n}\n"],"mappings":"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"}