@4399ywkf/editor 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -27
- package/dist/SheetView-YFK7BUS5.js +3 -0
- package/dist/{SheetView-SDBRSTVS.js.map → SheetView-YFK7BUS5.js.map} +1 -1
- package/dist/{chunk-KRP5V7VF.js → chunk-2DI4FJPC.js} +10 -3
- package/dist/chunk-2DI4FJPC.js.map +1 -0
- package/dist/{chunk-DGUNVCOM.js → chunk-3QTRZBIK.js} +111 -26
- package/dist/chunk-3QTRZBIK.js.map +1 -0
- package/dist/chunk-JWHQF2CZ.js +257 -0
- package/dist/chunk-JWHQF2CZ.js.map +1 -0
- package/dist/{chunk-WF7PIIFR.js → chunk-JZ67Q3QI.js} +4 -4
- package/dist/chunk-JZ67Q3QI.js.map +1 -0
- package/dist/{chunk-SBTKDJAL.js → chunk-SDVGDHC4.js} +45 -3
- package/dist/chunk-SDVGDHC4.js.map +1 -0
- package/dist/{chunk-HPSPOM2O.js → chunk-XB6FEC4I.js} +3 -3
- package/dist/chunk-XB6FEC4I.js.map +1 -0
- package/dist/{csv-parse-D0zTBvDB.d.ts → csv-parse-DXlwzoZ6.d.ts} +28 -1
- package/dist/csv.d.ts +2 -2
- package/dist/csv.js +4 -4
- package/dist/import-O7RUERND.js +6 -0
- package/dist/{import-GVZDLWA2.js.map → import-O7RUERND.js.map} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/pdf.d.ts +1 -1
- package/dist/pptx.d.ts +1 -1
- package/dist/{registry-CYKivRDh.d.ts → registry-BQ5T1Yko.d.ts} +9 -16
- package/dist/sheet-runtime.d.ts +10 -8
- package/dist/sheet-runtime.js +6 -14
- package/dist/sheet-runtime.js.map +1 -1
- package/dist/sheet.d.ts +4 -3
- package/dist/sheet.js +1 -1
- package/dist/xlsx.d.ts +12 -11
- package/dist/xlsx.js +121 -32
- package/dist/xlsx.js.map +1 -1
- package/package.json +71 -27
- package/dist/SheetView-SDBRSTVS.js +0 -3
- package/dist/chunk-DGUNVCOM.js.map +0 -1
- package/dist/chunk-HPSPOM2O.js.map +0 -1
- package/dist/chunk-KRP5V7VF.js.map +0 -1
- package/dist/chunk-SBTKDJAL.js.map +0 -1
- package/dist/chunk-SYCK6Y5F.js +0 -89
- package/dist/chunk-SYCK6Y5F.js.map +0 -1
- package/dist/chunk-WF7PIIFR.js.map +0 -1
- package/dist/import-GVZDLWA2.js +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/xlsx/dom.ts","../src/xlsx/parse-styles.ts","../src/xlsx/parse.ts","../src/xlsx/import.ts"],"names":["result"],"mappings":"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","file":"chunk-3QTRZBIK.js","sourcesContent":["/**\n * 解析 OOXML 用的 DOM 小工具。\n *\n * 只用 DOM Level 2 的接口(firstChild / nextSibling / getAttribute),\n * 浏览器原生 DOMParser 和 @xmldom/xmldom 的产物都吃 —— 不用 querySelector\n * 是因为 xmldom 没有它,且命名空间前缀会让选择器在两边行为不一致。\n */\n\n/** 注入式 DOMParser 的最小面:浏览器传原生的,Node 传 @xmldom/xmldom 的 */\nexport interface DomParserLike {\n new (): { parseFromString(source: string, mimeType: string): Document }\n}\n\n/** 第一个指定标签名的**直接**子元素。按 localName 匹配,无视命名空间前缀 */\nexport function childOf(parent: Element | undefined, tag: string): Element | undefined {\n for (let n = parent?.firstChild; n; n = n.nextSibling) {\n if (n.nodeType === 1 && (n as Element).localName === tag) return n as Element\n }\n return undefined\n}\n\n/** 全部指定标签名的**直接**子元素 */\nexport function childrenOf(parent: Element | undefined, tag: string): Element[] {\n if (!parent) return []\n const out: Element[] = []\n for (let n = parent.firstChild; n; n = n.nextSibling) {\n if (n.nodeType === 1 && (n as Element).localName === tag) out.push(n as Element)\n }\n return out\n}\n\n/** 元素的直接文本内容(含子元素的文本,按文档序拼接) */\nexport function textOf(el: Element | undefined): string {\n if (!el) return \"\"\n let out = \"\"\n for (let n = el.firstChild; n; n = n.nextSibling) {\n if (n.nodeType === 3 || n.nodeType === 4) out += n.nodeValue ?? \"\"\n else if (n.nodeType === 1) out += textOf(n as Element)\n }\n return out\n}\n\n/** 属性转整数。缺失或非法返回 undefined */\nexport function intAttr(el: Element | undefined, name: string): number | undefined {\n const raw = el?.getAttribute(name)\n if (raw === null || raw === undefined || raw === \"\") return undefined\n const n = Number.parseInt(raw, 10)\n return Number.isInteger(n) ? n : undefined\n}\n\n/** 属性转浮点数。缺失或非法返回 undefined */\nexport function floatAttr(el: Element | undefined, name: string): number | undefined {\n const raw = el?.getAttribute(name)\n if (raw === null || raw === undefined || raw === \"\") return undefined\n const n = Number.parseFloat(raw)\n return Number.isFinite(n) ? n : undefined\n}\n\n/** xml 的布尔属性:\"1\" / \"true\" 为真 */\nexport function boolAttr(el: Element | undefined, name: string): boolean {\n const raw = el?.getAttribute(name)\n return raw === \"1\" || raw === \"true\"\n}\n","/**\n * xl/styles.xml 的解析 —— `styles.ts`(构建侧)的逆。\n *\n * xlsx 的样式是分表索引的:字体、填充、边框、数字格式各自成表,`cellXfs`\n * 把四张表的下标组合起来,单元格引用 `cellXfs` 的下标。这里把每条 xf\n * 摊平成一份 Univer `StyleData`,调用方按 xf 下标取用。\n *\n * **颜色的三种写法**:`rgb`(直接收)、`indexed`(查 legacy 调色板,是死表)、\n * `theme`(要解析 theme1.xml 并做 tint 变换 —— 本实现不做,跳过并计数,\n * 由 `parse.ts` 汇总成一条 warning。猜一个颜色写进去比不写更糟)。\n */\n\nimport { boolAttr, childOf, childrenOf, floatAttr, intAttr } from \"./dom.ts\"\nimport { type BorderStyleData, H_ALIGN, type StyleData, UNDERLINE, V_ALIGN, WRAP } from \"./types.ts\"\nimport { argbToCss } from \"./xml.ts\"\n\n/** 对齐导出侧 `BORDER_STYLE`:Excel `ST_BorderStyle` → Univer `BorderStyleTypes` 下标 */\nconst BORDER_STYLE_INDEX: Record<string, number> = {\n none: 0,\n thin: 1,\n hair: 2,\n dotted: 3,\n dashed: 4,\n dashDot: 5,\n dashDotDot: 6,\n double: 7,\n medium: 8,\n mediumDashed: 9,\n mediumDashDot: 10,\n mediumDashDotDot: 11,\n slantDashDot: 12,\n thick: 13,\n}\n\n/** 导出侧 `H_ALIGN_NAME` 的逆 */\nconst H_ALIGN_INDEX: Record<string, number> = {\n left: H_ALIGN.LEFT,\n center: H_ALIGN.CENTER,\n centerContinuous: H_ALIGN.CENTER,\n right: H_ALIGN.RIGHT,\n justify: H_ALIGN.JUSTIFIED,\n distributed: H_ALIGN.DISTRIBUTED,\n}\n\n/** 导出侧 `V_ALIGN_NAME` 的逆 */\nconst V_ALIGN_INDEX: Record<string, number> = {\n top: V_ALIGN.TOP,\n center: V_ALIGN.MIDDLE,\n bottom: V_ALIGN.BOTTOM,\n}\n\n/** 导出侧 `UNDERLINE_NAME` 的逆。single 是缺省,不写 `t` */\nconst UNDERLINE_INDEX: Record<string, number> = {\n double: UNDERLINE.DOUBLE,\n singleAccounting: UNDERLINE.SINGLE_ACCOUNTING,\n doubleAccounting: UNDERLINE.DOUBLE_ACCOUNTING,\n}\n\n/**\n * ECMA-376 §18.8.30 的内建数字格式。0-163 保留,文件里不写定义 ——\n * 不带上这张表,内建的日期/百分比格式一导入就全变回 General。\n * (区域相关的 5-8、23-26、41-44 各家实现不一,只列跨区域稳定的那些)\n */\nconst BUILTIN_NUMFMT: Record<number, string> = {\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"m/d/yyyy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yyyy h:mm\",\n 37: \"#,##0;(#,##0)\",\n 38: \"#,##0;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mm:ss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n}\n\n/**\n * legacy `indexed` 调色板(ECMA-376 §18.8.27 的默认 64 色)。\n * 老文件和部分生成器还在用;这是规范里的死表,不是猜。\n */\nconst INDEXED_PALETTE = [\n \"FF000000\",\n \"FFFFFFFF\",\n \"FFFF0000\",\n \"FF00FF00\",\n \"FF0000FF\",\n \"FFFFFF00\",\n \"FFFF00FF\",\n \"FF00FFFF\",\n \"FF000000\",\n \"FFFFFFFF\",\n \"FFFF0000\",\n \"FF00FF00\",\n \"FF0000FF\",\n \"FFFFFF00\",\n \"FFFF00FF\",\n \"FF00FFFF\",\n \"FF800000\",\n \"FF008000\",\n \"FF000080\",\n \"FF808000\",\n \"FF800080\",\n \"FF008080\",\n \"FFC0C0C0\",\n \"FF808080\",\n \"FF9999FF\",\n \"FF993366\",\n \"FFFFFFCC\",\n \"FFCCFFFF\",\n \"FF660066\",\n \"FFFF8080\",\n \"FF0066CC\",\n \"FFCCCCFF\",\n \"FF000080\",\n \"FFFF00FF\",\n \"FFFFFF00\",\n \"FF00FFFF\",\n \"FF800080\",\n \"FF800000\",\n \"FF008080\",\n \"FF0000FF\",\n \"FF00CCFF\",\n \"FFCCFFFF\",\n \"FFCCFFCC\",\n \"FFFFFF99\",\n \"FF99CCFF\",\n \"FFFF99CC\",\n \"FFCC99FF\",\n \"FFFFCC99\",\n \"FF3366FF\",\n \"FF33CCCC\",\n \"FF99CC00\",\n \"FFFFCC00\",\n \"FFFF9900\",\n \"FFFF6600\",\n \"FF666699\",\n \"FF969696\",\n \"FF003366\",\n \"FF339966\",\n \"FF003300\",\n \"FF333300\",\n \"FF993300\",\n \"FF993366\",\n \"FF333399\",\n \"FF333333\",\n] as const\n\nexport interface ParsedStyles {\n /** 按 `cellXfs` 下标取样式。空样式(全默认)为 undefined */\n xfs: (StyleData | undefined)[]\n /** 对应下标的 xf 是否带 quotePrefix(↔ Univer 的 FORCE_STRING) */\n quotePrefix: boolean[]\n /** 遇到多少个解析不了的主题色(theme 引用) */\n themeColorCount: number\n}\n\ntype Dom = Document\n\nexport function parseStylesXml(dom: Dom | null): ParsedStyles {\n const empty: ParsedStyles = { xfs: [], quotePrefix: [], themeColorCount: 0 }\n const root = dom?.documentElement\n if (!root) return empty\n\n let themeColorCount = 0\n\n /** `<color rgb|indexed|theme/>` → CSS 颜色。主题色解析不了,计数后跳过 */\n const colorOf = (el: Element | undefined): string | undefined => {\n if (!el) return undefined\n const rgb = el.getAttribute(\"rgb\")\n if (rgb) return argbToCss(rgb)\n const indexed = el.getAttribute(\"indexed\")\n if (indexed) return argbToCss(INDEXED_PALETTE[Number.parseInt(indexed, 10)])\n if (el.getAttribute(\"theme\") !== null) themeColorCount++\n return undefined\n }\n\n /* ------------------------------ 数字格式 ------------------------------ */\n\n const numFmts = new Map<number, string>()\n for (const el of childrenOf(childOf(root, \"numFmts\"), \"numFmt\")) {\n const id = intAttr(el, \"numFmtId\")\n const code = el.getAttribute(\"formatCode\")\n if (id !== undefined && code) numFmts.set(id, code)\n }\n const numFmtPattern = (id: number): string | undefined => numFmts.get(id) ?? BUILTIN_NUMFMT[id]\n\n /* -------------------------------- 字体 -------------------------------- */\n\n const fonts: StyleData[] = childrenOf(childOf(root, \"fonts\"), \"font\").map((el) => {\n const s: StyleData = {}\n if (childOf(el, \"b\")) s.bl = 1\n if (childOf(el, \"i\")) s.it = 1\n if (childOf(el, \"strike\")) s.st = { s: 1 }\n const u = childOf(el, \"u\")\n // <u/> 不带 val 就是单下划线\n const underline = u?.getAttribute(\"val\") || \"single\"\n if (u && underline !== \"none\") {\n const t = UNDERLINE_INDEX[underline]\n s.ul = t ? { s: 1, t } : { s: 1 }\n }\n const va = childOf(el, \"vertAlign\")?.getAttribute(\"val\")\n if (va === \"superscript\") s.va = 1\n else if (va === \"subscript\") s.va = 2\n const sz = floatAttr(childOf(el, \"sz\"), \"val\")\n if (sz !== undefined) s.fs = sz\n const cl = colorOf(childOf(el, \"color\"))\n if (cl) s.cl = { rgb: cl }\n const name = childOf(el, \"name\")?.getAttribute(\"val\")\n if (name) s.ff = name\n return s\n })\n\n /* -------------------------------- 填充 -------------------------------- */\n\n // solid 只认 fgColor;其它花纹(gray125 等)没有 Univer 对应,按无填充处理\n const fills: (string | undefined)[] = childrenOf(childOf(root, \"fills\"), \"fill\").map((el) => {\n const pattern = childOf(el, \"patternFill\")\n if (!pattern || pattern.getAttribute(\"patternType\") !== \"solid\") return undefined\n return colorOf(childOf(pattern, \"fgColor\"))\n })\n\n /* -------------------------------- 边框 -------------------------------- */\n\n const borders = childrenOf(childOf(root, \"borders\"), \"border\").map((el) => {\n const side = (tag: string): BorderStyleData | undefined => {\n const s = childOf(el, tag)\n const style = s?.getAttribute(\"style\")\n const index = style ? BORDER_STYLE_INDEX[style] : undefined\n if (!index) return undefined\n const cl = colorOf(childOf(s as Element, \"color\"))\n return cl ? { s: index, cl: { rgb: cl } } : { s: index }\n }\n const bd = { l: side(\"left\"), r: side(\"right\"), t: side(\"top\"), b: side(\"bottom\") }\n return bd.l || bd.r || bd.t || bd.b ? bd : undefined\n })\n\n /* ------------------------------- cellXfs ------------------------------- */\n\n const xfs: (StyleData | undefined)[] = []\n const quotePrefix: boolean[] = []\n\n for (const el of childrenOf(childOf(root, \"cellXfs\"), \"xf\")) {\n const s: StyleData = {}\n\n const font = fonts[intAttr(el, \"fontId\") ?? -1]\n if (font) Object.assign(s, font)\n\n const fill = fills[intAttr(el, \"fillId\") ?? -1]\n if (fill) s.bg = { rgb: fill }\n\n const border = borders[intAttr(el, \"borderId\") ?? -1]\n if (border) s.bd = border\n\n const pattern = numFmtPattern(intAttr(el, \"numFmtId\") ?? 0)\n if (pattern && pattern.toLowerCase() !== \"general\") s.n = { pattern }\n\n const align = childOf(el, \"alignment\")\n if (align) {\n const ht = H_ALIGN_INDEX[align.getAttribute(\"horizontal\") ?? \"\"]\n if (ht) s.ht = ht\n const vt = V_ALIGN_INDEX[align.getAttribute(\"vertical\") ?? \"\"]\n if (vt) s.vt = vt\n if (boolAttr(align, \"wrapText\")) s.tb = WRAP.WRAP\n if (boolAttr(align, \"shrinkToFit\")) s.stf = 1\n const rotation = intAttr(align, \"textRotation\")\n if (rotation === 255) s.tr = { v: 1 }\n else if (rotation !== undefined && rotation !== 0) {\n // Excel 编码:0-90 是逆时针角度,91-180 是顺时针 (值 - 90) 度\n s.tr = { a: rotation <= 90 ? rotation : 90 - rotation }\n }\n }\n\n xfs.push(Object.keys(s).length ? s : undefined)\n quotePrefix.push(boolAttr(el, \"quotePrefix\"))\n }\n\n return { xfs, quotePrefix, themeColorCount }\n}\n","/**\n * xlsx 的各个 XML 部件 → Univer 快照。`serialize.ts`(导出侧)的逆。\n *\n * 同构:解压和 XML 解析都由调用方注入(见 `import.ts`),浏览器\n * (fflate + 原生 DOMParser)和 Node(任意 zip 库 + @xmldom/xmldom)\n * 共用这一份实现,不存在两份真相 —— 和 `docx/parse.ts` 同一套约定。\n *\n * **能保住的**:多工作表(含顺序、隐藏与深度隐藏)、值与类型、\n * 公式(普通/共享/数组/动态数组)、1904 日期系统、数字格式、\n * 字体/颜色/填充/边框/对齐/换行/旋转/缩小字体填充、会计用下划线、合并单元格、\n * 行高列宽、隐藏行列、冻结窗格、网格线开关、标签颜色、工作表背景图、quotePrefix(强制文本)。\n *\n * **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、\n * 超链接、主题色、模拟运算表的定义(只留结果)。它们要么住在独立部件里(drawing / pivot / comments),\n * 要么需要把 Excel 的主题模型抄一遍(theme + tint)。这里不假装支持,\n * 而是逐个探测、**如实报告丢了什么**(见 `warnings`)—— 让宿主能把话\n * 原样告诉用户,而不是打开表格才发现少了东西。\n */\n\nimport { matrixRow } from \"./cell.ts\"\nimport {\n boolAttr,\n childOf,\n childrenOf,\n type DomParserLike,\n floatAttr,\n intAttr,\n textOf,\n} from \"./dom.ts\"\nimport { bytesToDataUrl, imageMimeOf } from \"./media.ts\"\nimport { parseStylesXml } from \"./parse-styles.ts\"\nimport {\n CELL_TYPE,\n type CellData,\n type CellRange,\n FORMULA_TYPE,\n type Matrix,\n type StyleData,\n type WorkbookData,\n type WorksheetData,\n} from \"./types.ts\"\nimport { columnWidthToPx, parseCellRef, parseRange, pointsToPx } from \"./xml.ts\"\n\nexport interface XlsxEntries {\n /** 读取包内某个条目;不存在返回 null */\n read(entryPath: string): Uint8Array | null\n /** 包内全部条目路径。用于探测图片/批注等「导入保不住」的部件 */\n list(): string[]\n}\n\nexport interface ParseXlsxOptions {\n /** 浏览器传原生 DOMParser,Node 传 @xmldom/xmldom 的 */\n DOMParser: DomParserLike\n /** 快照里的工作簿名。不传则用 docProps 里的标题,再没有就空着 */\n name?: string\n}\n\nexport interface ParseXlsxResult {\n workbook: WorkbookData\n /** 导入时丢掉/降级了什么。**要展示给用户**,别吞 */\n warnings: string[]\n /** 计数,用于量化保真度 */\n stats: Record<string, number>\n}\n\n/** 工作表 XML 里出现即意味着有内容会丢的元素 → 人话 */\nconst SHEET_DROPPED_ELEMENTS: Record<string, string> = {\n autoFilter: \"筛选\",\n conditionalFormatting: \"条件格式\",\n dataValidations: \"数据校验\",\n hyperlinks: \"超链接\",\n drawing: \"图片或图表\",\n oleObjects: \"嵌入对象\",\n controls: \"表单控件\",\n}\n\n/** 包内条目路径特征 → 人话。工作表 XML 探测不到的部件走这里 */\nconst ENTRY_DROPPED_PARTS: Array<{ pattern: RegExp; label: string }> = [\n { pattern: /^xl\\/pivotTables\\//, label: \"透视表\" },\n { pattern: /^xl\\/comments/, label: \"批注\" },\n { pattern: /^xl\\/tables\\//, label: \"表格样式(Table)\" },\n { pattern: /^xl\\/vbaProject\\.bin$/, label: \"宏(VBA)\" },\n]\n\nexport function parseXlsx(entries: XlsxEntries, options: ParseXlsxOptions): ParseXlsxResult {\n const { DOMParser } = options\n const decoder = new TextDecoder()\n const parseEntry = (path: string): Document | null => {\n const bytes = entries.read(path)\n if (!bytes) return null\n return new DOMParser().parseFromString(decoder.decode(bytes), \"text/xml\")\n }\n\n const warnings: string[] = []\n const stats: Record<string, number> = {\n sheets: 0,\n cells: 0,\n formulas: 0,\n sharedFormulas: 0,\n merges: 0,\n styles: 0,\n }\n\n const workbookDom = parseEntry(\"xl/workbook.xml\")\n const workbookRoot = workbookDom?.documentElement\n if (!workbookRoot) {\n throw new Error(\"不是有效的 xlsx:包内找不到 xl/workbook.xml(.xls 老格式请先另存为 .xlsx)\")\n }\n\n // 1904 日期系统:Mac 老 Excel 的遗产,同一个序列号比 1900 体系晚 1462 天。\n // 只标在工作簿上、不换算数值 —— Univer 的格式化、日期编辑和公式都按 dateSystem 解释序列号\n const date1904 = boolAttr(childOf(workbookRoot, \"workbookPr\"), \"date1904\")\n\n /* ------------------------------ 样式表 ------------------------------ */\n\n const parsedStyles = parseStylesXml(parseEntry(\"xl/styles.xml\"))\n // 快照的 styles 表按 xf 下标登记,单元格用字符串 id 引用 —— 天然去重\n const styleMap: Record<string, StyleData> = {}\n const styleIdOf = (xfIndex: number | undefined): string | undefined => {\n if (xfIndex === undefined) return undefined\n const style = parsedStyles.xfs[xfIndex]\n if (!style) return undefined\n const id = `xf${xfIndex}`\n if (!styleMap[id]) {\n styleMap[id] = style\n stats.styles++\n }\n return id\n }\n\n /* ---------------------------- 共享字符串 ---------------------------- */\n\n const sharedStrings = parseSharedStrings(parseEntry(\"xl/sharedStrings.xml\"))\n\n /* ------------------------------ 工作表 ------------------------------ */\n\n const workbookRels = readRels(parseEntry, \"xl/workbook.xml\")\n\n const metadataPath =\n [...workbookRels.values()].find((rel) => rel.type.endsWith(\"/sheetMetadata\"))?.path ??\n \"xl/metadata.xml\"\n const dynamicArrayCm = parseDynamicArrayCm(parseEntry(metadataPath))\n\n const sheets: Record<string, WorksheetData> = {}\n const sheetOrder: string[] = []\n const droppedBySheet = new Map<string, string[]>()\n\n const sheetEls = childrenOf(childOf(workbookRoot, \"sheets\"), \"sheet\")\n sheetEls.forEach((el, index) => {\n const name = el.getAttribute(\"name\") ?? `Sheet${index + 1}`\n const rId = relIdOf(el)\n // 找不到关系就按约定路径猜一次 —— 部分生成器的 rels 写得不规范\n const path = (rId && workbookRels.get(rId)?.path) || `xl/worksheets/sheet${index + 1}.xml`\n const dom = parseEntry(path)\n if (!dom?.documentElement) {\n warnings.push(`工作表「${name}」的数据部件缺失(${path}),已跳过`)\n return\n }\n\n const sheetRels = readRels(parseEntry, path)\n const id = `sheet-${index + 1}`\n const { sheet, dropped } = parseSheetXml(dom.documentElement, {\n sharedStrings,\n styleIdOf,\n quotePrefix: parsedStyles.quotePrefix,\n sheetKey: id,\n stats,\n warnings,\n sheetName: name,\n dynamicArrayCm,\n imageOf: (imageRelId) => {\n const target = sheetRels.get(imageRelId)?.path\n const mime = target ? imageMimeOf(target) : undefined\n const bytes = target && mime ? entries.read(target) : null\n return bytes && mime ? bytesToDataUrl(bytes, mime) : undefined\n },\n })\n sheet.id = id\n sheet.name = name\n const state = el.getAttribute(\"state\")\n if (state === \"hidden\") sheet.hidden = 1\n else if (state === \"veryHidden\") sheet.hidden = 2\n sheets[id] = sheet\n sheetOrder.push(id)\n stats.sheets++\n if (dropped.length) droppedBySheet.set(name, dropped)\n })\n\n if (!sheetOrder.length) {\n throw new Error(\"xlsx 里没有可读的工作表\")\n }\n\n /* --------------------- 如实报告丢了什么 --------------------- */\n\n for (const [name, dropped] of droppedBySheet) {\n warnings.push(`工作表「${name}」的${dropped.join(\"、\")}未随导入保留(本实现不解析这些部件)`)\n for (const label of dropped) stats[`dropped:${label}`] = (stats[`dropped:${label}`] ?? 0) + 1\n }\n\n const entryPaths = entries.list()\n for (const { pattern, label } of ENTRY_DROPPED_PARTS) {\n if (entryPaths.some((p) => pattern.test(p))) {\n warnings.push(`${label}未随导入保留(本实现不解析这些部件)`)\n stats[`dropped:${label}`] = (stats[`dropped:${label}`] ?? 0) + 1\n }\n }\n if (parsedStyles.themeColorCount) {\n warnings.push(\n `${parsedStyles.themeColorCount} 处颜色引用了文档主题(theme),已按默认色显示 —— ` +\n \"主题色需要解析 theme1.xml 并做 tint 变换,本实现不做,猜一个颜色比不给更糟\",\n )\n stats.themeColors = parsedStyles.themeColorCount\n }\n if (stats.dataTables) {\n warnings.push(\n `${stats.dataTables} 处模拟运算表(数据表)只保留了计算结果:Univer 不计算模拟运算表,` +\n \"引用的输入单元格等定义没有导入,改了源数据结果不会跟着变\",\n )\n }\n\n /* ------------------------------ 工作簿 ------------------------------ */\n\n const title = textOf(childOf(parseEntry(\"docProps/core.xml\")?.documentElement, \"title\"))\n const workbook: WorkbookData = {\n id: `import-${Date.now().toString(36)}`,\n name: options.name ?? (title || \"导入的工作簿\"),\n sheetOrder,\n sheets,\n styles: styleMap,\n ...(date1904 ? { dateSystem: \"date1904\" as const } : {}),\n }\n\n return { workbook, warnings, stats }\n}\n\n/* ============================ 共享字符串 ============================ */\n\n/**\n * `<si>` 的取文本:纯 `<t>` 或富文本 `<r><t>` 都收,注音 `<rPh>` 要排除 ——\n * 它是给日文假名标注用的,混进正文就成了重复文字。\n */\nfunction parseSharedStrings(dom: Document | null): string[] {\n const out: string[] = []\n for (const si of childrenOf(dom?.documentElement, \"si\")) {\n const direct = childOf(si, \"t\")\n if (direct) {\n out.push(textOf(direct))\n continue\n }\n let text = \"\"\n for (const run of childrenOf(si, \"r\")) text += textOf(childOf(run, \"t\"))\n out.push(text)\n }\n return out\n}\n\n/* ========================== 关系表与元数据 ========================== */\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n\nfunction relIdOf(el: Element): string | null {\n return el.getAttribute(\"r:id\") ?? el.getAttributeNS?.(REL_NS, \"id\") ?? null\n}\n\n/**\n * 某个部件的关系表:rId → { 类型, 包内路径 }。\n * Target 相对部件所在目录(可以带 `../`),也可能是从包根起的 `/xl/...`。\n */\nfunction readRels(\n parseEntry: (path: string) => Document | null,\n partPath: string,\n): Map<string, { type: string; path: string }> {\n const slash = partPath.lastIndexOf(\"/\")\n const dir = slash < 0 ? \"\" : partPath.slice(0, slash)\n const out = new Map<string, { type: string; path: string }>()\n const dom = parseEntry(`${dir ? `${dir}/` : \"\"}_rels/${partPath.slice(slash + 1)}.rels`)\n for (const rel of childrenOf(dom?.documentElement, \"Relationship\")) {\n const id = rel.getAttribute(\"Id\")\n const target = rel.getAttribute(\"Target\")\n if (!id || !target || rel.getAttribute(\"TargetMode\") === \"External\") continue\n const segments = target.startsWith(\"/\") ? [] : dir.split(\"/\").filter(Boolean)\n for (const part of target.split(\"/\")) {\n if (part === \"..\") segments.pop()\n else if (part && part !== \".\") segments.push(part)\n }\n out.set(id, { type: rel.getAttribute(\"Type\") ?? \"\", path: segments.join(\"/\") })\n }\n return out\n}\n\n/**\n * metadata.xml → 代表动态数组的 `cm` 下标(从 1 起)。\n *\n * 链路:cellMetadata 第 cm 个 bk 的 `<rc t v>` → metadataTypes 第 t 个(从 1 起)须是 XLDAPR\n * → futureMetadata[XLDAPR] 第 v 个 bk(从 0 起)里 `dynamicArrayProperties@fDynamic` 为 1。\n */\nfunction parseDynamicArrayCm(dom: Document | null): Set<number> {\n const out = new Set<number>()\n const root = dom?.documentElement\n if (!root) return out\n const typeNames = childrenOf(childOf(root, \"metadataTypes\"), \"metadataType\").map((el) =>\n el.getAttribute(\"name\"),\n )\n const future = childrenOf(root, \"futureMetadata\").find(\n (el) => el.getAttribute(\"name\") === \"XLDAPR\",\n )\n const dynamic = childrenOf(future, \"bk\").map((bk) =>\n childrenOf(childOf(bk, \"extLst\"), \"ext\").some((ext) =>\n boolAttr(childOf(ext, \"dynamicArrayProperties\"), \"fDynamic\"),\n ),\n )\n childrenOf(childOf(root, \"cellMetadata\"), \"bk\").forEach((bk, index) => {\n const rc = childOf(bk, \"rc\")\n const t = intAttr(rc, \"t\")\n const v = intAttr(rc, \"v\")\n if (t !== undefined && v !== undefined && typeNames[t - 1] === \"XLDAPR\" && dynamic[v]) {\n out.add(index + 1)\n }\n })\n return out\n}\n\n/* ============================== 工作表 ============================== */\n\ninterface SheetParseContext {\n sharedStrings: string[]\n styleIdOf: (xfIndex: number | undefined) => string | undefined\n quotePrefix: boolean[]\n /** 共享公式 si 的命名空间:xlsx 的 si 只在表内唯一,快照是工作簿级的 */\n sheetKey: string\n stats: Record<string, number>\n warnings: string[]\n sheetName: string\n /** 代表动态数组的单元格 `cm` 下标,见 `parseDynamicArrayCm` */\n dynamicArrayCm: Set<number>\n /** 本表关系里的图片 → data URL。读不到或浏览器画不出来的格式返回 undefined */\n imageOf: (relId: string) => string | undefined\n}\n\nfunction parseSheetXml(\n root: Element,\n ctx: SheetParseContext,\n): { sheet: WorksheetData; dropped: string[] } {\n const sheet: WorksheetData = {}\n\n parseSheetProperties(root, sheet)\n parseSheetViews(root, sheet)\n parseColumns(root, sheet, ctx)\n const { maxRow, maxCol } = parseSheetData(root, sheet, ctx)\n parseMerges(root, sheet, ctx)\n parseBackgroundPicture(root, sheet, ctx)\n\n // Univer 的网格尺寸下限(默认 1000×20),数据更大就放大到装得下\n sheet.rowCount = Math.max(1000, maxRow + 1)\n sheet.columnCount = Math.max(20, maxCol + 1)\n\n const dropped = Object.entries(SHEET_DROPPED_ELEMENTS)\n .filter(([tag]) => root.getElementsByTagName(tag).length > 0)\n .map(([, label]) => label)\n\n return { sheet, dropped }\n}\n\n/** sheetPr(标签颜色)与 sheetFormatPr(默认行高列宽) */\nfunction parseSheetProperties(root: Element, sheet: WorksheetData): void {\n const tabColor = childOf(childOf(root, \"sheetPr\"), \"tabColor\")?.getAttribute(\"rgb\")\n if (tabColor && /^[0-9a-fA-F]{8}$/.test(tabColor)) sheet.tabColor = `#${tabColor.slice(2)}`\n\n const formatPr = childOf(root, \"sheetFormatPr\")\n const rowHeight = floatAttr(formatPr, \"defaultRowHeight\")\n if (rowHeight !== undefined) sheet.defaultRowHeight = pointsToPx(rowHeight)\n const colWidth = floatAttr(formatPr, \"defaultColWidth\")\n if (colWidth !== undefined) sheet.defaultColumnWidth = columnWidthToPx(colWidth)\n}\n\n/** sheetViews:冻结窗格、网格线开关、从右向左 */\nfunction parseSheetViews(root: Element, sheet: WorksheetData): void {\n const view = childOf(childOf(root, \"sheetViews\"), \"sheetView\")\n if (!view) return\n if (view.getAttribute(\"showGridLines\") === \"0\") sheet.showGridlines = 0\n if (boolAttr(view, \"rightToLeft\")) sheet.rightToLeft = 1\n\n const pane = childOf(view, \"pane\")\n if (pane && pane.getAttribute(\"state\") === \"frozen\") {\n const xSplit = intAttr(pane, \"xSplit\") ?? 0\n const ySplit = intAttr(pane, \"ySplit\") ?? 0\n if (xSplit > 0 || ySplit > 0) {\n sheet.freeze = { xSplit, ySplit, startRow: ySplit, startColumn: xSplit }\n }\n }\n}\n\n/**\n * cols:`<col min max .../>` 是区间定义,快照的 columnData 是逐列的。\n * 铺满整表的区间(min=1 且 max≥16384)其实是「默认列宽」,落到\n * defaultColumnWidth 而不是展开 16384 个条目。\n */\nfunction parseColumns(root: Element, sheet: WorksheetData, ctx: SheetParseContext): void {\n const MAX_EXCEL_COLUMNS = 16384\n const columnData: Record<number, NonNullable<WorksheetData[\"columnData\"]>[number]> = {}\n\n for (const col of childrenOf(childOf(root, \"cols\"), \"col\")) {\n const min = intAttr(col, \"min\")\n const max = intAttr(col, \"max\")\n if (min === undefined || max === undefined || max < min) continue\n\n const width = floatAttr(col, \"width\")\n const hidden = boolAttr(col, \"hidden\")\n const styleId = ctx.styleIdOf(intAttr(col, \"style\"))\n\n if (min === 1 && max >= MAX_EXCEL_COLUMNS) {\n if (width !== undefined) sheet.defaultColumnWidth = columnWidthToPx(width)\n continue\n }\n // 防御异常文件:单个区间超过 2000 列还带样式的,展开会把快照撑爆\n const end = Math.min(max, min + 2000)\n if (end < max) {\n ctx.warnings.push(\n `工作表「${ctx.sheetName}」有跨 ${max - min + 1} 列的列定义,仅保留前 ${end - min + 1} 列的宽度/样式`,\n )\n }\n for (let i = min - 1; i < end; i++) {\n const entry: NonNullable<WorksheetData[\"columnData\"]>[number] = {}\n if (width !== undefined) entry.w = columnWidthToPx(width)\n if (hidden) entry.hd = 1\n if (styleId) entry.s = styleId\n if (Object.keys(entry).length) columnData[i] = entry\n }\n }\n\n if (Object.keys(columnData).length) sheet.columnData = columnData\n}\n\n/** mergeCells → mergeData */\nfunction parseMerges(root: Element, sheet: WorksheetData, ctx: SheetParseContext): void {\n const merges: CellRange[] = []\n for (const el of childrenOf(childOf(root, \"mergeCells\"), \"mergeCell\")) {\n const range = parseRange(el.getAttribute(\"ref\") ?? \"\")\n if (range) merges.push(range)\n }\n if (merges.length) {\n sheet.mergeData = merges\n ctx.stats.merges += merges.length\n }\n}\n\n/** `<picture r:id>`:平铺的工作表背景图,存成 data URL 跟着快照走 */\nfunction parseBackgroundPicture(root: Element, sheet: WorksheetData, ctx: SheetParseContext): void {\n const picture = childOf(root, \"picture\")\n if (!picture) return\n const relId = relIdOf(picture)\n const source = relId ? ctx.imageOf(relId) : undefined\n if (source) {\n sheet.backgroundImage = { source, imageSourceType: \"BASE64\" }\n ctx.stats.backgroundImages = (ctx.stats.backgroundImages ?? 0) + 1\n } else {\n ctx.warnings.push(\n `工作表「${ctx.sheetName}」的背景图读不到或格式不支持(只认 png / jpg / gif / bmp),已跳过`,\n )\n }\n}\n\n/** sheetData:行属性 + 单元格。返回数据范围,供 rowCount/columnCount 兜底 */\nfunction parseSheetData(\n root: Element,\n sheet: WorksheetData,\n ctx: SheetParseContext,\n): { maxRow: number; maxCol: number } {\n const cellData: Matrix<CellData> = {}\n const rowData: Record<number, NonNullable<WorksheetData[\"rowData\"]>[number]> = {}\n let maxRow = -1\n let maxCol = -1\n\n let cursorRow = -1\n for (const rowEl of childrenOf(childOf(root, \"sheetData\"), \"row\")) {\n // r 属性可省略(省略时接在上一行后面)\n const r = (intAttr(rowEl, \"r\") ?? cursorRow + 2) - 1\n cursorRow = r\n if (r < 0) continue\n\n const meta: NonNullable<WorksheetData[\"rowData\"]>[number] = {}\n const height = floatAttr(rowEl, \"ht\")\n if (height !== undefined && boolAttr(rowEl, \"customHeight\")) meta.h = pointsToPx(height)\n if (boolAttr(rowEl, \"hidden\")) meta.hd = 1\n if (boolAttr(rowEl, \"customFormat\")) {\n const styleId = ctx.styleIdOf(intAttr(rowEl, \"s\"))\n if (styleId) meta.s = styleId\n }\n if (Object.keys(meta).length) {\n rowData[r] = meta\n if (r > maxRow) maxRow = r\n }\n\n let cursorCol = -1\n for (const cellEl of childrenOf(rowEl, \"c\")) {\n const ref = cellEl.getAttribute(\"r\")\n const parsed = ref ? parseCellRef(ref) : undefined\n const c = parsed ? parsed.column : cursorCol + 1\n cursorCol = c\n\n const cell = parseCell(cellEl, ctx)\n if (!cell) continue\n matrixRow(cellData, r)[c] = cell\n ctx.stats.cells++\n if (r > maxRow) maxRow = r\n if (c > maxCol) maxCol = c\n }\n }\n\n if (Object.keys(cellData).length) sheet.cellData = cellData\n if (Object.keys(rowData).length) sheet.rowData = rowData\n return { maxRow, maxCol }\n}\n\n/** 一个 `<c>` → CellData。空格(没值没公式没样式)返回 undefined */\nfunction parseCell(el: Element, ctx: SheetParseContext): CellData | undefined {\n const cell: CellData = {}\n\n const xfIndex = intAttr(el, \"s\")\n const styleId = ctx.styleIdOf(xfIndex)\n if (styleId) cell.s = styleId\n\n parseCellFormula(el, cell, ctx)\n parseCellValue(el, cell, ctx, xfIndex)\n\n return Object.keys(cell).length ? cell : undefined\n}\n\n/**\n * `<f>`:普通 / 共享(t=\"shared\")/ 数组(t=\"array\")/ 模拟运算表(t=\"dataTable\")。\n *\n * 数组和模拟运算表记进 `ft`,导出时据此还原;共享公式靠 `si` 分组就够了,不另标。\n * 动态数组在文件里也是 t=\"array\",区别在单元格的 `cm` 指向 XLDAPR 元数据。\n */\nfunction parseCellFormula(el: Element, cell: CellData, ctx: SheetParseContext): void {\n const f = childOf(el, \"f\")\n if (!f) return\n\n const text = textOf(f)\n if (text) {\n cell.f = `=${text}`\n ctx.stats.formulas++\n }\n\n const type = f.getAttribute(\"t\")\n if (type === \"shared\") {\n const si = f.getAttribute(\"si\")\n // xlsx 的 si 只在本表内唯一,快照是工作簿级的 —— 加表前缀隔离\n if (si !== null) {\n cell.si = `${ctx.sheetKey}-${si}`\n ctx.stats.sharedFormulas++\n }\n } else if (type === \"array\") {\n cell.ft = FORMULA_TYPE.ARRAY\n const ref = f.getAttribute(\"ref\")\n if (ref) cell.ref = ref\n const cm = intAttr(el, \"cm\")\n if (cm !== undefined && ctx.dynamicArrayCm.has(cm)) {\n cell.fd = 1\n ctx.stats.dynamicArrays = (ctx.stats.dynamicArrays ?? 0) + 1\n }\n } else if (type === \"dataTable\") {\n cell.ft = FORMULA_TYPE.DATA_TABLE\n ctx.stats.dataTables = (ctx.stats.dataTables ?? 0) + 1\n }\n}\n\n/** 值与类型。t 缺省是 \"n\"(数字) */\nfunction parseCellValue(\n el: Element,\n cell: CellData,\n ctx: SheetParseContext,\n xfIndex: number | undefined,\n): void {\n const type = el.getAttribute(\"t\") ?? \"n\"\n\n if (type === \"inlineStr\") {\n const is = childOf(el, \"is\")\n const direct = childOf(is, \"t\")\n let text = direct ? textOf(direct) : \"\"\n if (!direct) for (const run of childrenOf(is, \"r\")) text += textOf(childOf(run, \"t\"))\n cell.v = text\n cell.t = CELL_TYPE.STRING\n return\n }\n\n const v = childOf(el, \"v\")\n if (!v) return\n const raw = textOf(v)\n\n switch (type) {\n case \"s\": {\n const text = ctx.sharedStrings[Number.parseInt(raw, 10)]\n if (text === undefined) {\n ctx.warnings.push(\n `工作表「${ctx.sheetName}」有单元格引用了不存在的共享字符串 #${raw},已置空`,\n )\n return\n }\n cell.v = text\n cell.t = forceString(ctx, xfIndex) ? CELL_TYPE.FORCE_STRING : CELL_TYPE.STRING\n return\n }\n case \"str\":\n cell.v = raw\n cell.t = CELL_TYPE.STRING\n return\n case \"b\":\n cell.v = raw === \"1\" || raw === \"true\"\n cell.t = CELL_TYPE.BOOLEAN\n return\n case \"e\":\n // 公式错误值(#DIV/0! 等)。保留文本,Univer 重算公式时会自己得出新结果\n cell.v = raw\n cell.t = CELL_TYPE.STRING\n return\n default: {\n const n = Number.parseFloat(raw)\n if (Number.isFinite(n)) {\n cell.v = n\n cell.t = CELL_TYPE.NUMBER\n } else if (raw) {\n cell.v = raw\n cell.t = CELL_TYPE.STRING\n }\n }\n }\n}\n\n/** 该 xf 是否带 quotePrefix(Excel 的「以文本形式存储」,↔ FORCE_STRING) */\nfunction forceString(ctx: SheetParseContext, xfIndex: number | undefined): boolean {\n return xfIndex !== undefined && ctx.quotePrefix[xfIndex] === true\n}\n","/**\n * xlsx / csv 导入的入口 —— 把「拿到手的东西」变成 Univer 快照。\n *\n * 分层和导出侧对称:`parse.ts` / `csv-parse.ts` 是纯函数(解压、XML 解析\n * 都注入),本文件负责脏活 —— 解 zip(fflate)、缺省 DOMParser(浏览器原生)、\n * 解码文本(UTF-8 优先,失败退 GBK)、从 URL 拉字节、按扩展名和魔数嗅探格式。\n *\n * ```ts\n * import { importSheetSource } from \"@4399ywkf/editor/xlsx\"\n *\n * const { workbook, warnings } = await importSheetSource(file)\n * univerAPI.createWorkbook(workbook)\n * if (warnings.length) toast(warnings.join(\"\\n\")) // ← 如实报告丢了什么\n * ```\n *\n * Node 侧没有全局 DOMParser,`importXlsx` 显式传 `@xmldom/xmldom` 的即可。\n */\n\nimport { unzipSync } from \"fflate\"\n\nimport { type CsvParseOptions, csvToSnapshot } from \"./csv-parse.ts\"\nimport type { DomParserLike } from \"./dom.ts\"\nimport { type ParseXlsxResult, parseXlsx, type XlsxEntries } from \"./parse.ts\"\nimport type { WorkbookData } from \"./types.ts\"\n\nexport interface ImportSheetResult {\n workbook: WorkbookData\n /** 导入时丢掉/降级了什么。**要展示给用户**,别吞 */\n warnings: string[]\n stats: Record<string, number>\n}\n\nexport interface ImportXlsxOptions {\n /** 不传则用浏览器原生 DOMParser;Node 里传 @xmldom/xmldom 的 */\n DOMParser?: DomParserLike\n /** 快照里的工作簿名。不传则用 File 名或文档属性里的标题 */\n name?: string\n}\n\ntype BinarySource = File | Blob | ArrayBuffer | Uint8Array\n\n/** zip 的魔数 \"PK\\x03\\x04\" —— xlsx 本质是个 zip 包 */\nfunction isZip(bytes: Uint8Array): boolean {\n return bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04\n}\n\nasync function toBytes(source: BinarySource): Promise<Uint8Array> {\n if (source instanceof Uint8Array) return source\n if (source instanceof ArrayBuffer) return new Uint8Array(source)\n return new Uint8Array(await source.arrayBuffer())\n}\n\n/**\n * 字节 → 文本。UTF-8 严格解码优先,失败退 GBK ——\n * 简中环境的 csv 相当一部分是 Excel 直接另存的,编码就是 GBK。\n */\nfunction decodeText(bytes: Uint8Array, warnings: string[]): string {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes)\n } catch {\n try {\n const text = new TextDecoder(\"gbk\").decode(bytes)\n warnings.push(\"文件不是 UTF-8 编码,已按 GBK 解码 —— 如出现乱码请转成 UTF-8 后重新导入\")\n return text\n } catch {\n // 连 GBK 解码器都没有(部分 Node 构建),退回宽松 UTF-8,坏字符变 �\n return new TextDecoder(\"utf-8\").decode(bytes)\n }\n }\n}\n\nfunction defaultDomParser(): DomParserLike {\n const DP = (globalThis as { DOMParser?: DomParserLike }).DOMParser\n if (!DP) {\n throw new Error(\n \"当前环境没有 DOMParser:浏览器外使用请在 options 里注入(如 @xmldom/xmldom 的 DOMParser)\",\n )\n }\n return DP\n}\n\n/** File 才有名字;Blob/字节没有 */\nfunction nameOf(source: BinarySource | string): string | undefined {\n if (typeof source === \"string\") {\n const last = source.split(/[?#]/)[0]?.split(\"/\").pop()\n return last ? decodeURIComponent(last) : undefined\n }\n return typeof File !== \"undefined\" && source instanceof File ? source.name : undefined\n}\n\n/* ------------------------------- xlsx ------------------------------- */\n\n/** .xlsx 字节 → Univer 快照。纯本地解析,文档不出内网 */\nexport async function importXlsx(\n source: BinarySource,\n options: ImportXlsxOptions = {},\n): Promise<ImportSheetResult> {\n const bytes = await toBytes(source)\n if (!isZip(bytes)) {\n throw new Error(\"这不是 xlsx 文件(缺少 zip 魔数)。.xls 老格式请先在 Excel/WPS 里另存为 .xlsx\")\n }\n\n let files: Record<string, Uint8Array>\n try {\n files = unzipSync(bytes)\n } catch (e) {\n throw new Error(`xlsx 解压失败:${e instanceof Error ? e.message : String(e)}`)\n }\n\n const entries: XlsxEntries = {\n read: (path) => files[path] ?? null,\n list: () => Object.keys(files),\n }\n const result: ParseXlsxResult = parseXlsx(entries, {\n DOMParser: options.DOMParser ?? defaultDomParser(),\n name: options.name ?? stripExtension(nameOf(source)),\n })\n return result\n}\n\n/* -------------------------------- csv -------------------------------- */\n\nexport interface ImportCsvOptions extends CsvParseOptions {}\n\n/** csv/tsv 文本或字节 → Univer 快照 */\nexport async function importCsv(\n source: BinarySource | string,\n options: ImportCsvOptions = {},\n): Promise<ImportSheetResult> {\n const warnings: string[] = []\n const text = typeof source === \"string\" ? source : decodeText(await toBytes(source), warnings)\n const name = typeof source === \"string\" ? undefined : stripExtension(nameOf(source))\n const result = csvToSnapshot(text, { name, ...options })\n return {\n workbook: result.workbook,\n warnings: [...warnings, ...result.warnings],\n stats: result.stats as unknown as Record<string, number>,\n }\n}\n\n/* --------------------------- 统一入口(嗅探) --------------------------- */\n\nexport interface ImportSheetSourceResult extends ImportSheetResult {\n /** 实际按哪种格式解析的 */\n format: \"xlsx\" | \"csv\" | \"tsv\"\n}\n\n/**\n * `DocumentView` 的 `source` → Univer 快照:URL / File / Blob 都收。\n *\n * 判定顺序:扩展名(.csv/.tsv 显式声明就信)→ zip 魔数(xlsx 本质是 zip)\n * → 都不是则按 csv 试 —— 文本表格没有魔数,这是唯一诚实的兜底。\n */\nexport async function importSheetSource(\n source: string | Blob | File,\n options: ImportXlsxOptions & ImportCsvOptions = {},\n): Promise<ImportSheetSourceResult> {\n const name = nameOf(source)\n const bytes = typeof source === \"string\" ? await fetchBytes(source) : await toBytes(source)\n\n const ext = /\\.([a-z0-9]+)$/i.exec(name ?? \"\")?.[1]?.toLowerCase()\n if (ext === \"csv\" || ext === \"tsv\") {\n const delimiter = options.delimiter ?? (ext === \"tsv\" ? \"\\t\" : \",\")\n const result = await importCsv(bytes, {\n ...options,\n delimiter,\n name: options.name ?? stripExtension(name),\n })\n return { ...result, format: ext }\n }\n\n if (isZip(bytes)) {\n const result = await importXlsx(bytes, {\n ...options,\n name: options.name ?? stripExtension(name),\n })\n return { ...result, format: \"xlsx\" }\n }\n\n if (ext === \"xlsx\" || ext === \"xls\") {\n throw new Error(\n ext === \"xls\"\n ? \".xls 是二进制老格式,本实现不解析 —— 请先在 Excel/WPS 里另存为 .xlsx\"\n : \"文件扩展名是 .xlsx 但内容不是 zip 包,文件可能已损坏\",\n )\n }\n\n const result = await importCsv(bytes, { ...options, name: options.name ?? stripExtension(name) })\n return { ...result, format: \"csv\" }\n}\n\nasync function fetchBytes(url: string): Promise<Uint8Array> {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`拉取表格失败:HTTP ${res.status}(${url})`)\n return new Uint8Array(await res.arrayBuffer())\n}\n\nfunction stripExtension(name: string | undefined): string | undefined {\n return name?.replace(/\\.[a-z0-9]+$/i, \"\") || undefined\n}\n"]}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { useRef, useEffect } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/views/SheetView.tsx
|
|
5
|
+
|
|
6
|
+
// src/sheet-features.ts
|
|
7
|
+
var SHEET_ENGINE_PACKAGES = [
|
|
8
|
+
"@univerjs/presets",
|
|
9
|
+
"@univerjs/preset-sheets-core",
|
|
10
|
+
"@univerjs/preset-sheets-filter",
|
|
11
|
+
"@univerjs/preset-sheets-sort",
|
|
12
|
+
"@univerjs/preset-sheets-data-validation",
|
|
13
|
+
"@univerjs/preset-sheets-conditional-formatting",
|
|
14
|
+
"@univerjs/preset-sheets-hyper-link",
|
|
15
|
+
"@univerjs/preset-sheets-note",
|
|
16
|
+
"@univerjs/preset-sheets-thread-comment",
|
|
17
|
+
"@univerjs/preset-sheets-table",
|
|
18
|
+
"@univerjs/preset-sheets-drawing",
|
|
19
|
+
"@univerjs/preset-sheets-find-replace"
|
|
20
|
+
];
|
|
21
|
+
function usePreset(mod, exportName) {
|
|
22
|
+
const factory = mod[exportName];
|
|
23
|
+
if (typeof factory !== "function") {
|
|
24
|
+
throw new Error(`Univer preset 缺少 ${exportName}`);
|
|
25
|
+
}
|
|
26
|
+
return factory();
|
|
27
|
+
}
|
|
28
|
+
function useLocale(mod) {
|
|
29
|
+
const locale = mod.default;
|
|
30
|
+
if (!locale || typeof locale !== "object") {
|
|
31
|
+
throw new Error("Univer locale 包没有 default 导出");
|
|
32
|
+
}
|
|
33
|
+
return locale;
|
|
34
|
+
}
|
|
35
|
+
async function loadBuiltinSheetPresets() {
|
|
36
|
+
const [
|
|
37
|
+
filter,
|
|
38
|
+
filterLocale,
|
|
39
|
+
sort,
|
|
40
|
+
sortLocale,
|
|
41
|
+
dataValidation,
|
|
42
|
+
dataValidationLocale,
|
|
43
|
+
conditionalFormatting,
|
|
44
|
+
conditionalFormattingLocale,
|
|
45
|
+
hyperLink,
|
|
46
|
+
hyperLinkLocale,
|
|
47
|
+
note,
|
|
48
|
+
noteLocale,
|
|
49
|
+
threadComment,
|
|
50
|
+
threadCommentLocale,
|
|
51
|
+
table,
|
|
52
|
+
tableLocale,
|
|
53
|
+
drawing,
|
|
54
|
+
drawingLocale
|
|
55
|
+
] = await Promise.all([
|
|
56
|
+
import('@univerjs/preset-sheets-filter'),
|
|
57
|
+
import('@univerjs/preset-sheets-filter/locales/zh-CN'),
|
|
58
|
+
import('@univerjs/preset-sheets-sort'),
|
|
59
|
+
import('@univerjs/preset-sheets-sort/locales/zh-CN'),
|
|
60
|
+
import('@univerjs/preset-sheets-data-validation'),
|
|
61
|
+
import('@univerjs/preset-sheets-data-validation/locales/zh-CN'),
|
|
62
|
+
import('@univerjs/preset-sheets-conditional-formatting'),
|
|
63
|
+
import('@univerjs/preset-sheets-conditional-formatting/locales/zh-CN'),
|
|
64
|
+
import('@univerjs/preset-sheets-hyper-link'),
|
|
65
|
+
import('@univerjs/preset-sheets-hyper-link/locales/zh-CN'),
|
|
66
|
+
import('@univerjs/preset-sheets-note'),
|
|
67
|
+
import('@univerjs/preset-sheets-note/locales/zh-CN'),
|
|
68
|
+
import('@univerjs/preset-sheets-thread-comment'),
|
|
69
|
+
import('@univerjs/preset-sheets-thread-comment/locales/zh-CN'),
|
|
70
|
+
import('@univerjs/preset-sheets-table'),
|
|
71
|
+
import('@univerjs/preset-sheets-table/locales/zh-CN'),
|
|
72
|
+
import('@univerjs/preset-sheets-drawing'),
|
|
73
|
+
import('@univerjs/preset-sheets-drawing/locales/zh-CN'),
|
|
74
|
+
import('@univerjs/preset-sheets-filter/lib/index.css'),
|
|
75
|
+
import('@univerjs/preset-sheets-sort/lib/index.css'),
|
|
76
|
+
import('@univerjs/preset-sheets-data-validation/lib/index.css'),
|
|
77
|
+
import('@univerjs/preset-sheets-conditional-formatting/lib/index.css'),
|
|
78
|
+
import('@univerjs/preset-sheets-hyper-link/lib/index.css'),
|
|
79
|
+
import('@univerjs/preset-sheets-note/lib/index.css'),
|
|
80
|
+
import('@univerjs/preset-sheets-thread-comment/lib/index.css'),
|
|
81
|
+
import('@univerjs/preset-sheets-table/lib/index.css'),
|
|
82
|
+
import('@univerjs/preset-sheets-drawing/lib/index.css')
|
|
83
|
+
]);
|
|
84
|
+
return {
|
|
85
|
+
presets: [
|
|
86
|
+
usePreset(filter, "UniverSheetsFilterPreset"),
|
|
87
|
+
usePreset(sort, "UniverSheetsSortPreset"),
|
|
88
|
+
usePreset(dataValidation, "UniverSheetsDataValidationPreset"),
|
|
89
|
+
usePreset(conditionalFormatting, "UniverSheetsConditionalFormattingPreset"),
|
|
90
|
+
usePreset(hyperLink, "UniverSheetsHyperLinkPreset"),
|
|
91
|
+
usePreset(note, "UniverSheetsNotePreset"),
|
|
92
|
+
usePreset(threadComment, "UniverSheetsThreadCommentPreset"),
|
|
93
|
+
usePreset(table, "UniverSheetsTablePreset"),
|
|
94
|
+
usePreset(drawing, "UniverSheetsDrawingPreset")
|
|
95
|
+
],
|
|
96
|
+
locales: [
|
|
97
|
+
useLocale(filterLocale),
|
|
98
|
+
useLocale(sortLocale),
|
|
99
|
+
useLocale(dataValidationLocale),
|
|
100
|
+
useLocale(conditionalFormattingLocale),
|
|
101
|
+
useLocale(hyperLinkLocale),
|
|
102
|
+
useLocale(noteLocale),
|
|
103
|
+
useLocale(threadCommentLocale),
|
|
104
|
+
useLocale(tableLocale),
|
|
105
|
+
useLocale(drawingLocale)
|
|
106
|
+
]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function pluginCtor(entry) {
|
|
110
|
+
const ctor = Array.isArray(entry) ? entry[0] : entry;
|
|
111
|
+
return typeof ctor === "function" ? ctor : void 0;
|
|
112
|
+
}
|
|
113
|
+
function asPreset(value) {
|
|
114
|
+
if (Array.isArray(value) && value[0] && typeof value[0] === "object") return value[0];
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
function pluginsIn(preset) {
|
|
118
|
+
const body = asPreset(preset);
|
|
119
|
+
if (!body || typeof body !== "object" || !("plugins" in body)) return [];
|
|
120
|
+
const plugins = body.plugins;
|
|
121
|
+
return Array.isArray(plugins) ? plugins : [];
|
|
122
|
+
}
|
|
123
|
+
function pluginNamesOf(presets) {
|
|
124
|
+
const names = /* @__PURE__ */ new Set();
|
|
125
|
+
for (const preset of presets) {
|
|
126
|
+
for (const entry of pluginsIn(preset)) {
|
|
127
|
+
const name = pluginCtor(entry)?.pluginName;
|
|
128
|
+
if (name) names.add(name);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return names;
|
|
132
|
+
}
|
|
133
|
+
function omitPluginsNamed(presets, taken) {
|
|
134
|
+
if (taken.size === 0) return [...presets];
|
|
135
|
+
const out = [];
|
|
136
|
+
for (const preset of presets) {
|
|
137
|
+
const plugins = pluginsIn(preset);
|
|
138
|
+
if (plugins.length === 0) {
|
|
139
|
+
out.push(preset);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const kept = plugins.filter((entry) => {
|
|
143
|
+
const name = pluginCtor(entry)?.pluginName;
|
|
144
|
+
return !name || !taken.has(name);
|
|
145
|
+
});
|
|
146
|
+
if (kept.length === 0) continue;
|
|
147
|
+
if (kept.length === plugins.length) {
|
|
148
|
+
out.push(preset);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
out.push({ ...asPreset(preset), plugins: kept });
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function SheetView({
|
|
156
|
+
source,
|
|
157
|
+
content,
|
|
158
|
+
readOnly,
|
|
159
|
+
className,
|
|
160
|
+
sheet,
|
|
161
|
+
onReady,
|
|
162
|
+
onError,
|
|
163
|
+
onWarnings
|
|
164
|
+
}) {
|
|
165
|
+
const hostRef = useRef(null);
|
|
166
|
+
const disposeRef = useRef(null);
|
|
167
|
+
const latest = useRef({ sheet, onReady, onError, onWarnings });
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
latest.current = { sheet, onReady, onError, onWarnings };
|
|
170
|
+
});
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
let cancelled = false;
|
|
173
|
+
const host = hostRef.current;
|
|
174
|
+
if (!host) return;
|
|
175
|
+
(async () => {
|
|
176
|
+
const { sheet: opts, onReady: ready, onError: fail, onWarnings: warn } = latest.current;
|
|
177
|
+
try {
|
|
178
|
+
const importPromise = !content && source ? import('./import-O7RUERND.js').then((m) => m.importSheetSource(source)) : null;
|
|
179
|
+
const [{ createUniver, LocaleType, merge }, sheetsCore, zhCN] = await Promise.all([
|
|
180
|
+
import('@univerjs/presets'),
|
|
181
|
+
import('@univerjs/preset-sheets-core'),
|
|
182
|
+
import('@univerjs/preset-sheets-core/locales/zh-CN'),
|
|
183
|
+
import('@univerjs/preset-sheets-core/lib/index.css')
|
|
184
|
+
]);
|
|
185
|
+
if (cancelled) return;
|
|
186
|
+
const { statusBarStatistic, footer, ...ui } = {
|
|
187
|
+
...readOnly ? { toolbar: false } : null,
|
|
188
|
+
...opts?.ui
|
|
189
|
+
};
|
|
190
|
+
const presets = [
|
|
191
|
+
sheetsCore.UniverSheetsCorePreset({
|
|
192
|
+
container: host,
|
|
193
|
+
...ui,
|
|
194
|
+
// 统计栏开关挂在 footer 底下;footer: false 是连底栏一起不要
|
|
195
|
+
footer: footer === false ? false : { statisticBar: statusBarStatistic !== false }
|
|
196
|
+
})
|
|
197
|
+
];
|
|
198
|
+
const locales = [zhCN.default];
|
|
199
|
+
const builtin = await loadBuiltinSheetPresets();
|
|
200
|
+
if (cancelled) return;
|
|
201
|
+
const hostPresets = opts?.presets ?? [];
|
|
202
|
+
presets.push(...omitPluginsNamed(builtin.presets, pluginNamesOf(hostPresets)));
|
|
203
|
+
locales.push(...builtin.locales);
|
|
204
|
+
if (opts?.findReplace) {
|
|
205
|
+
const [findReplace, findReplaceZhCN] = await Promise.all([
|
|
206
|
+
import('@univerjs/preset-sheets-find-replace'),
|
|
207
|
+
import('@univerjs/preset-sheets-find-replace/locales/zh-CN'),
|
|
208
|
+
import('@univerjs/preset-sheets-find-replace/lib/index.css')
|
|
209
|
+
]);
|
|
210
|
+
if (cancelled) return;
|
|
211
|
+
presets.push(
|
|
212
|
+
findReplace.UniverSheetsFindReplacePreset()
|
|
213
|
+
);
|
|
214
|
+
locales.push(findReplaceZhCN.default);
|
|
215
|
+
}
|
|
216
|
+
if (hostPresets.length) presets.push(...hostPresets);
|
|
217
|
+
if (opts?.locales?.length) locales.push(...opts.locales);
|
|
218
|
+
const imported = importPromise ? await importPromise : null;
|
|
219
|
+
if (cancelled) return;
|
|
220
|
+
const { univerAPI, univer } = createUniver({
|
|
221
|
+
locale: LocaleType.ZH_CN,
|
|
222
|
+
// createUniver 不会自动收集 preset 自带的 locales,得在这里一起合进来,
|
|
223
|
+
// 否则新加的 preset 菜单会显示成原始 i18n key
|
|
224
|
+
locales: { [LocaleType.ZH_CN]: merge({}, ...locales) },
|
|
225
|
+
presets
|
|
226
|
+
});
|
|
227
|
+
const dispose = () => univer.dispose();
|
|
228
|
+
if (cancelled) return dispose();
|
|
229
|
+
const book = univerAPI.createWorkbook(content ?? imported?.workbook ?? {});
|
|
230
|
+
if (readOnly) {
|
|
231
|
+
await book.getWorkbookPermission().setPoint(univerAPI.Enum.WorkbookPermissionPoint.Edit, false);
|
|
232
|
+
if (cancelled) return dispose();
|
|
233
|
+
}
|
|
234
|
+
if (imported?.warnings.length) warn?.(imported.warnings);
|
|
235
|
+
disposeRef.current = dispose;
|
|
236
|
+
ready?.(univerAPI);
|
|
237
|
+
} catch (e) {
|
|
238
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
239
|
+
fail?.(
|
|
240
|
+
new Error(
|
|
241
|
+
`表格加载失败:${err.message}。若是引擎缺失,请确认已安装同一版本的可选依赖 ${SHEET_ENGINE_PACKAGES.join("、")}`
|
|
242
|
+
)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
})();
|
|
246
|
+
return () => {
|
|
247
|
+
cancelled = true;
|
|
248
|
+
disposeRef.current?.();
|
|
249
|
+
disposeRef.current = null;
|
|
250
|
+
};
|
|
251
|
+
}, [source, content, readOnly]);
|
|
252
|
+
return /* @__PURE__ */ jsx("div", { ref: hostRef, className, style: { width: "100%", height: "100%" } });
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export { SheetView };
|
|
256
|
+
//# sourceMappingURL=chunk-JWHQF2CZ.js.map
|
|
257
|
+
//# sourceMappingURL=chunk-JWHQF2CZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sheet-features.ts","../src/views/SheetView.tsx"],"names":[],"mappings":"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","file":"chunk-JWHQF2CZ.js","sourcesContent":["/**\n * 表格通道默认带上的开源能力。\n *\n * 每条 import 都必须是字面量:宿主的打包器在构建期就要解析到这些包,\n * 用变量拼路径解析不到,构建直接失败。所以「没装也能跳过」做不到。\n */\n\n/** 打开表格就得装齐、并且版本一致的包。查找替换没开也会被打包器解析到 */\nexport const SHEET_ENGINE_PACKAGES = [\n \"@univerjs/presets\",\n \"@univerjs/preset-sheets-core\",\n \"@univerjs/preset-sheets-filter\",\n \"@univerjs/preset-sheets-sort\",\n \"@univerjs/preset-sheets-data-validation\",\n \"@univerjs/preset-sheets-conditional-formatting\",\n \"@univerjs/preset-sheets-hyper-link\",\n \"@univerjs/preset-sheets-note\",\n \"@univerjs/preset-sheets-thread-comment\",\n \"@univerjs/preset-sheets-table\",\n \"@univerjs/preset-sheets-drawing\",\n \"@univerjs/preset-sheets-find-replace\",\n] as const\n\ntype PresetFactoryModule = Record<string, (config?: object) => unknown>\ntype LocaleModule = { default: object }\n\nfunction usePreset(mod: unknown, exportName: string): unknown {\n const factory = (mod as PresetFactoryModule)[exportName]\n if (typeof factory !== \"function\") {\n throw new Error(`Univer preset 缺少 ${exportName}`)\n }\n return factory()\n}\n\nfunction useLocale(mod: unknown): object {\n const locale = (mod as LocaleModule).default\n if (!locale || typeof locale !== \"object\") {\n throw new Error(\"Univer locale 包没有 default 导出\")\n }\n return locale\n}\n\n/** 筛选、排序、数据校验、条件格式、超链接、批注、评论、表格、浮动图片。查找替换另走开关 */\nexport async function loadBuiltinSheetPresets(): Promise<{\n presets: unknown[]\n locales: object[]\n}> {\n const [\n filter,\n filterLocale,\n sort,\n sortLocale,\n dataValidation,\n dataValidationLocale,\n conditionalFormatting,\n conditionalFormattingLocale,\n hyperLink,\n hyperLinkLocale,\n note,\n noteLocale,\n threadComment,\n threadCommentLocale,\n table,\n tableLocale,\n drawing,\n drawingLocale,\n ] = await Promise.all([\n import(\"@univerjs/preset-sheets-filter\"),\n import(\"@univerjs/preset-sheets-filter/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-sort\"),\n import(\"@univerjs/preset-sheets-sort/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-data-validation\"),\n import(\"@univerjs/preset-sheets-data-validation/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-conditional-formatting\"),\n import(\"@univerjs/preset-sheets-conditional-formatting/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-hyper-link\"),\n import(\"@univerjs/preset-sheets-hyper-link/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-note\"),\n import(\"@univerjs/preset-sheets-note/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-thread-comment\"),\n import(\"@univerjs/preset-sheets-thread-comment/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-table\"),\n import(\"@univerjs/preset-sheets-table/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-drawing\"),\n import(\"@univerjs/preset-sheets-drawing/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-filter/lib/index.css\"),\n import(\"@univerjs/preset-sheets-sort/lib/index.css\"),\n import(\"@univerjs/preset-sheets-data-validation/lib/index.css\"),\n import(\"@univerjs/preset-sheets-conditional-formatting/lib/index.css\"),\n import(\"@univerjs/preset-sheets-hyper-link/lib/index.css\"),\n import(\"@univerjs/preset-sheets-note/lib/index.css\"),\n import(\"@univerjs/preset-sheets-thread-comment/lib/index.css\"),\n import(\"@univerjs/preset-sheets-table/lib/index.css\"),\n import(\"@univerjs/preset-sheets-drawing/lib/index.css\"),\n ])\n\n return {\n presets: [\n usePreset(filter, \"UniverSheetsFilterPreset\"),\n usePreset(sort, \"UniverSheetsSortPreset\"),\n usePreset(dataValidation, \"UniverSheetsDataValidationPreset\"),\n usePreset(conditionalFormatting, \"UniverSheetsConditionalFormattingPreset\"),\n usePreset(hyperLink, \"UniverSheetsHyperLinkPreset\"),\n usePreset(note, \"UniverSheetsNotePreset\"),\n usePreset(threadComment, \"UniverSheetsThreadCommentPreset\"),\n usePreset(table, \"UniverSheetsTablePreset\"),\n usePreset(drawing, \"UniverSheetsDrawingPreset\"),\n ],\n locales: [\n useLocale(filterLocale),\n useLocale(sortLocale),\n useLocale(dataValidationLocale),\n useLocale(conditionalFormattingLocale),\n useLocale(hyperLinkLocale),\n useLocale(noteLocale),\n useLocale(threadCommentLocale),\n useLocale(tableLocale),\n useLocale(drawingLocale),\n ],\n }\n}\n\nfunction pluginCtor(entry: unknown): { pluginName?: string } | undefined {\n const ctor = Array.isArray(entry) ? entry[0] : entry\n return typeof ctor === \"function\" ? (ctor as { pluginName?: string }) : undefined\n}\n\n/** `[preset, options]` 这种元组剥掉配置,剩下的就是 preset 本体 */\nfunction asPreset(value: unknown): unknown {\n if (Array.isArray(value) && value[0] && typeof value[0] === \"object\") return value[0]\n return value\n}\n\nfunction pluginsIn(preset: unknown): unknown[] {\n const body = asPreset(preset)\n if (!body || typeof body !== \"object\" || !(\"plugins\" in body)) return []\n const plugins = (body as { plugins?: unknown }).plugins\n return Array.isArray(plugins) ? plugins : []\n}\n\n/** 宿主自己传进来的 preset 里已经有哪些插件 */\nexport function pluginNamesOf(presets: readonly unknown[]): Set<string> {\n const names = new Set<string>()\n for (const preset of presets) {\n for (const entry of pluginsIn(preset)) {\n const name = pluginCtor(entry)?.pluginName\n if (name) names.add(name)\n }\n }\n return names\n}\n\n/**\n * 去掉已经被宿主 preset 注册的插件。\n * Univer 对同名插件直接抛错,而 README 里曾经让宿主自己传筛选 preset。\n */\nexport function omitPluginsNamed(\n presets: readonly unknown[],\n taken: ReadonlySet<string>,\n): unknown[] {\n if (taken.size === 0) return [...presets]\n const out: unknown[] = []\n for (const preset of presets) {\n const plugins = pluginsIn(preset)\n if (plugins.length === 0) {\n out.push(preset)\n continue\n }\n const kept = plugins.filter((entry) => {\n const name = pluginCtor(entry)?.pluginName\n return !name || !taken.has(name)\n })\n if (kept.length === 0) continue\n if (kept.length === plugins.length) {\n out.push(preset)\n continue\n }\n out.push({ ...(asPreset(preset) as object), plugins: kept })\n }\n return out\n}\n","import { useEffect, useRef } from \"react\"\nimport type { DocumentViewProps } from \"../registry\"\nimport {\n loadBuiltinSheetPresets,\n omitPluginsNamed,\n pluginNamesOf,\n SHEET_ENGINE_PACKAGES,\n} from \"../sheet-features\"\nimport type { SheetUiOptions } from \"../sheet-options\"\n\n/**\n * sheet 通道:Univer 适配。\n *\n * 只用 Apache-2.0 的 OSS 核心。**不碰** `@univerjs-pro/*` 与 `univer-cli`:\n * 前者要自建 Univer Server 且需商业授权,后者 63MB、license 字段为 None、\n * 90/91 个 JS 被混淆、还会向 univer.ai 上报遥测 —— 不能进生产链路。\n *\n * 导入导出都在本包 `./xlsx`:导出直接读 Univer 快照拼 OOXML,导入把\n * xlsx/csv/tsv 解析成快照(`source` prop 走的就是这条路,File / Blob / URL\n * 都收)。两个方向都不引 SheetJS,文档不出内网。导入丢了什么(图片、\n * 条件格式等独立部件)通过 `onWarnings` 如实报告。\n *\n * 配置见 `SheetOptions`:UI 开关直接透传给 preset(Univer 的 class 是\n * `univer-` 前缀的原子类,没有稳定选择器,CSS 硬藏靠不住)。\n * 筛选、排序、数据校验、条件格式、超链接、批注、评论、表格和浮动图片随引擎一起加载。\n */\nexport default function SheetView({\n source,\n content,\n readOnly,\n className,\n sheet,\n onReady,\n onError,\n onWarnings,\n}: DocumentViewProps) {\n const hostRef = useRef<HTMLDivElement>(null)\n const disposeRef = useRef<(() => void) | null>(null)\n\n // 这几项都是「创建时读一次」的,且宿主多半传内联字面量/箭头函数。\n // 放进依赖数组 = 父组件每渲染一次就重建一次引擎(重下 871KB + 丢选区滚动位置),\n // 所以走 ref:取最新值,但不参与依赖比较。\n const latest = useRef({ sheet, onReady, onError, onWarnings })\n useEffect(() => {\n latest.current = { sheet, onReady, onError, onWarnings }\n })\n\n useEffect(() => {\n let cancelled = false\n const host = hostRef.current\n if (!host) return\n\n ;(async () => {\n const { sheet: opts, onReady: ready, onError: fail, onWarnings: warn } = latest.current\n try {\n // source 的解析和 871KB 引擎的下载并行:两边都是网络/CPU 大头,串行纯浪费。\n // content 优先于 source —— 已有快照就没有「导入」这回事\n const importPromise =\n !content && source\n ? import(\"../xlsx/import\").then((m) => m.importSheetSource(source))\n : null\n\n // 动态 import:871KB gzip 的引擎只在真的打开表格时才下载\n const [{ createUniver, LocaleType, merge }, sheetsCore, zhCN] = await Promise.all([\n import(\"@univerjs/presets\"),\n import(\"@univerjs/preset-sheets-core\"),\n import(\"@univerjs/preset-sheets-core/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-core/lib/index.css\"),\n ])\n if (cancelled) return\n\n // 只读时默认摘掉工具栏:整条 ribbon 全是死按钮,窄面板里还挤。\n // 宿主显式传了 toolbar 就以宿主为准。\n const { statusBarStatistic, footer, ...ui }: SheetUiOptions = {\n ...(readOnly ? { toolbar: false } : null),\n ...opts?.ui,\n }\n\n // 可选 peer:Univer 的包未安装时这里的类型解析不到,\n // 统一用 never 过桥,运行时由外层 try/catch 兜底并给出可读提示\n const presets: unknown[] = [\n (\n sheetsCore as unknown as { UniverSheetsCorePreset: (o: object) => never }\n ).UniverSheetsCorePreset({\n container: host,\n ...ui,\n // 统计栏开关挂在 footer 底下;footer: false 是连底栏一起不要\n footer: footer === false ? false : { statisticBar: statusBarStatistic !== false },\n }),\n ]\n const locales: unknown[] = [(zhCN as unknown as { default: object }).default]\n\n const builtin = await loadBuiltinSheetPresets()\n if (cancelled) return\n // 宿主若仍按旧文档自己传了筛选等 preset,同名插件用宿主那份,避免重复注册直接抛错\n const hostPresets = opts?.presets ?? []\n presets.push(...omitPluginsNamed(builtin.presets, pluginNamesOf(hostPresets)))\n locales.push(...builtin.locales)\n\n if (opts?.findReplace) {\n // 没开就完全不下载\n const [findReplace, findReplaceZhCN] = await Promise.all([\n import(\"@univerjs/preset-sheets-find-replace\"),\n import(\"@univerjs/preset-sheets-find-replace/locales/zh-CN\"),\n import(\"@univerjs/preset-sheets-find-replace/lib/index.css\"),\n ])\n if (cancelled) return\n presets.push(\n (\n findReplace as unknown as { UniverSheetsFindReplacePreset: () => never }\n ).UniverSheetsFindReplacePreset(),\n )\n locales.push((findReplaceZhCN as unknown as { default: object }).default)\n }\n\n if (hostPresets.length) presets.push(...hostPresets)\n if (opts?.locales?.length) locales.push(...opts.locales)\n\n // 导入失败不该等引擎起完才报:在创建引擎前结算,抛给外层统一 fail\n const imported = importPromise ? await importPromise : null\n if (cancelled) return\n\n const { univerAPI, univer } = createUniver({\n locale: LocaleType.ZH_CN,\n // createUniver 不会自动收集 preset 自带的 locales,得在这里一起合进来,\n // 否则新加的 preset 菜单会显示成原始 i18n key\n locales: { [LocaleType.ZH_CN]: merge({}, ...(locales as object[])) },\n presets: presets as never,\n })\n\n const dispose = () => (univer as unknown as { dispose: () => void }).dispose()\n // 卸载可能发生在上面任一个 await 期间:那时 cleanup 拿到的 disposeRef 还是 null,\n // 不在这儿自己收掉,引擎就挂在一个已脱离文档的 host 上泄漏了\n if (cancelled) return dispose()\n\n const book = univerAPI.createWorkbook((content ?? imported?.workbook ?? {}) as never)\n if (readOnly) {\n // 首个工作簿建好后 Univer 会异步按授权结果重置全部权限点:FWorkbook.setEditable(false)\n // 同步改的值会被冲回 true,得走权限点接口才排在重置之后。只关编辑点,复制仍可用\n await book\n .getWorkbookPermission()\n .setPoint(univerAPI.Enum.WorkbookPermissionPoint.Edit, false)\n if (cancelled) return dispose()\n }\n if (imported?.warnings.length) warn?.(imported.warnings)\n\n disposeRef.current = dispose\n ready?.(univerAPI)\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e))\n fail?.(\n new Error(\n `表格加载失败:${err.message}。` +\n `若是引擎缺失,请确认已安装同一版本的可选依赖 ${SHEET_ENGINE_PACKAGES.join(\"、\")}`,\n ),\n )\n }\n })()\n\n return () => {\n cancelled = true\n disposeRef.current?.()\n disposeRef.current = null\n }\n }, [source, content, readOnly])\n\n return <div ref={hostRef} className={className} style={{ width: \"100%\", height: \"100%\" }} />\n}\n"]}
|
|
@@ -3,9 +3,9 @@ function snapshotFromUniver(univerAPI) {
|
|
|
3
3
|
const api = univerAPI;
|
|
4
4
|
const book = api?.getActiveWorkbook?.();
|
|
5
5
|
if (!book) throw new Error("拿不到当前工作簿:univerAPI 无效,或表格尚未就绪");
|
|
6
|
-
const snapshot = book.
|
|
6
|
+
const snapshot = book.save?.();
|
|
7
7
|
if (!snapshot || typeof snapshot !== "object") {
|
|
8
|
-
throw new Error("当前 Univer 版本没有
|
|
8
|
+
throw new Error("当前 Univer 版本没有 save(),无法取快照");
|
|
9
9
|
}
|
|
10
10
|
return snapshot;
|
|
11
11
|
}
|
|
@@ -17,5 +17,5 @@ function toSnapshot(source) {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export { snapshotFromUniver, toSnapshot };
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-JZ67Q3QI.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-JZ67Q3QI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/xlsx/snapshot.ts"],"names":[],"mappings":";AAQO,SAAS,mBAAmB,SAAA,EAAkC;AACnE,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,MAAM,IAAA,GAAO,KAAK,iBAAA,IAAoB;AACtC,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,IAAO;AAC7B,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,WAAW,MAAA,EAA8C;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAA;AACd,EAAA,IAAI,SAAS,OAAO,KAAA,KAAU,QAAA,KAAa,QAAA,IAAY,SAAS,YAAA,IAAgB,KAAA,CAAA;AAC9E,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,mBAAmB,MAAM,CAAA;AAClC","file":"chunk-JZ67Q3QI.js","sourcesContent":["/** 从 Univer 实例取快照。xlsx 与 csv 两条导出路径共用。 */\n\nimport type { WorkbookData } from \"./types.ts\"\n\n/**\n * 参数类型是 `unknown` 而不是 `FUniver`:`@univerjs/presets` 是可选 peer,\n * 写成具体类型会让没装它的项目 typecheck 直接红。\n */\nexport function snapshotFromUniver(univerAPI: unknown): WorkbookData {\n const api = univerAPI as { getActiveWorkbook?: () => { save?: () => unknown } | null } | null\n const book = api?.getActiveWorkbook?.()\n if (!book) throw new Error(\"拿不到当前工作簿:univerAPI 无效,或表格尚未就绪\")\n const snapshot = book.save?.()\n if (!snapshot || typeof snapshot !== \"object\") {\n throw new Error(\"当前 Univer 版本没有 save(),无法取快照\")\n }\n return snapshot as WorkbookData\n}\n\n/** 快照或 Univer 实例都收 —— 调用方不必自己判断手里是什么 */\nexport function toSnapshot(source: WorkbookData | unknown): WorkbookData {\n const maybe = source as WorkbookData\n if (maybe && typeof maybe === \"object\" && (\"sheets\" in maybe || \"sheetOrder\" in maybe))\n return maybe\n return snapshotFromUniver(source)\n}\n"]}
|
|
@@ -1,3 +1,45 @@
|
|
|
1
|
+
// src/xlsx/media.ts
|
|
2
|
+
var IMAGE_MIME = {
|
|
3
|
+
png: "image/png",
|
|
4
|
+
jpeg: "image/jpeg",
|
|
5
|
+
jpg: "image/jpeg",
|
|
6
|
+
gif: "image/gif",
|
|
7
|
+
bmp: "image/bmp"
|
|
8
|
+
};
|
|
9
|
+
function imageMimeOf(path) {
|
|
10
|
+
const ext = path.split(".").pop()?.toLowerCase();
|
|
11
|
+
return ext ? IMAGE_MIME[ext] : void 0;
|
|
12
|
+
}
|
|
13
|
+
function bytesToBase64(bytes) {
|
|
14
|
+
const B = globalThis.Buffer;
|
|
15
|
+
if (B) return B.from(bytes).toString("base64");
|
|
16
|
+
let bin = "";
|
|
17
|
+
const CHUNK = 32768;
|
|
18
|
+
for (let i = 0; i < bytes.length; i += CHUNK) {
|
|
19
|
+
bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
|
|
20
|
+
}
|
|
21
|
+
return btoa(bin);
|
|
22
|
+
}
|
|
23
|
+
function bytesToDataUrl(bytes, mime) {
|
|
24
|
+
return `data:${mime};base64,${bytesToBase64(bytes)}`;
|
|
25
|
+
}
|
|
26
|
+
function dataUrlToImage(url) {
|
|
27
|
+
const match = /^data:([\w.+-]+\/[\w.+-]+);base64,([\s\S]*)$/.exec(url.trim());
|
|
28
|
+
if (!match) return void 0;
|
|
29
|
+
const mime = match[1].toLowerCase();
|
|
30
|
+
const ext = Object.keys(IMAGE_MIME).find((key) => IMAGE_MIME[key] === mime);
|
|
31
|
+
if (!ext) return void 0;
|
|
32
|
+
let bin;
|
|
33
|
+
try {
|
|
34
|
+
bin = atob(match[2].replace(/\s+/g, ""));
|
|
35
|
+
} catch {
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
const bytes = new Uint8Array(bin.length);
|
|
39
|
+
for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
|
|
40
|
+
return { bytes, ext };
|
|
41
|
+
}
|
|
42
|
+
|
|
1
43
|
// src/xlsx/xml.ts
|
|
2
44
|
var CONTROL = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/g;
|
|
3
45
|
var LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g;
|
|
@@ -102,6 +144,6 @@ function pointsToPx(pt) {
|
|
|
102
144
|
}
|
|
103
145
|
var XML_DECL = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
|
|
104
146
|
|
|
105
|
-
export { XML_DECL, argbToCss, cellRef, columnName, columnWidthToPx, escapeAttr, escapeXml, parseCellRef, parseRange, pointsToPx, pxToColumnWidth, pxToPoints, toArgb };
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
export { XML_DECL, argbToCss, bytesToBase64, bytesToDataUrl, cellRef, columnName, columnWidthToPx, dataUrlToImage, escapeAttr, escapeXml, imageMimeOf, parseCellRef, parseRange, pointsToPx, pxToColumnWidth, pxToPoints, toArgb };
|
|
148
|
+
//# sourceMappingURL=chunk-SDVGDHC4.js.map
|
|
149
|
+
//# sourceMappingURL=chunk-SDVGDHC4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/xlsx/media.ts","../src/xlsx/xml.ts"],"names":[],"mappings":"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","file":"chunk-SDVGDHC4.js","sourcesContent":["/**\n * 图片字节 ⇄ data URL。xlsx 的媒体部件是二进制,Univer 的 BASE64 图片源要完整的 data URL。\n */\n\n/**\n * 扩展名 → MIME。只收 Excel 认、浏览器也画得出来的 —— tif / emf / wmf 能进 xlsx,\n * 但到了浏览器里是张裂图,不如如实报告跳过。\n */\nconst IMAGE_MIME: Record<string, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n}\n\nexport function imageMimeOf(path: string): string | undefined {\n const ext = path.split(\".\").pop()?.toLowerCase()\n return ext ? IMAGE_MIME[ext] : undefined\n}\n\n/** 字节 → base64。浏览器没有 Buffer,得分块 btoa(一把梭会爆调用栈) */\nexport function bytesToBase64(bytes: Uint8Array): string {\n const B = (globalThis as { Buffer?: { from(b: Uint8Array): { toString(e: string): string } } })\n .Buffer\n if (B) return B.from(bytes).toString(\"base64\")\n let bin = \"\"\n const CHUNK = 0x8000\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK))\n }\n return btoa(bin)\n}\n\nexport function bytesToDataUrl(bytes: Uint8Array, mime: string): string {\n return `data:${mime};base64,${bytesToBase64(bytes)}`\n}\n\n/** data URL → 字节与扩展名。不是 base64 data URL、格式不在 `IMAGE_MIME` 里,都返回 undefined */\nexport function dataUrlToImage(url: string): { bytes: Uint8Array; ext: string } | undefined {\n const match = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,([\\s\\S]*)$/.exec(url.trim())\n if (!match) return undefined\n const mime = (match[1] as string).toLowerCase()\n const ext = Object.keys(IMAGE_MIME).find((key) => IMAGE_MIME[key] === mime)\n if (!ext) return undefined\n let bin: string\n try {\n bin = atob((match[2] as string).replace(/\\s+/g, \"\"))\n } catch {\n return undefined\n }\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return { bytes, ext }\n}\n","/** OOXML 拼装与解析共用的小工具。没有依赖,Node 与浏览器通吃。 */\n\nimport type { CellRange, ColorStyle } from \"./types.ts\"\n\n/**\n * XML 1.0 不允许的字符必须清掉,否则整个 xlsx 打不开 ——\n * Excel 只报一句「无法读取内容」并给你一个空文档,不会说是哪个单元格。\n * 合法范围:#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n */\n// biome-ignore lint/suspicious/noControlCharactersInRegex: 匹配控制字符正是目的 —— 要把它们从输出里剔掉\nconst CONTROL = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\uFFFE\\uFFFF]/g\n/** 落单的代理项。成对的要留着 —— emoji 就是一对 */\nconst LONE_SURROGATE = /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g\n\nexport function escapeXml(value: string): string {\n return value\n .replace(CONTROL, \"\")\n .replace(LONE_SURROGATE, \"\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n}\n\n/** 属性值还要额外躲掉单引号和换行(换行在属性里会被解析器规范化成空格) */\nexport function escapeAttr(value: string): string {\n return escapeXml(value).replace(/'/g, \"'\").replace(/\\r/g, \" \").replace(/\\n/g, \" \")\n}\n\n/** 0 → A,25 → Z,26 → AA */\nexport function columnName(index: number): string {\n let n = index\n let out = \"\"\n do {\n out = String.fromCharCode(65 + (n % 26)) + out\n n = Math.floor(n / 26) - 1\n } while (n >= 0)\n return out\n}\n\n/** (0, 0) → \"A1\" */\nexport function cellRef(row: number, column: number): string {\n return `${columnName(column)}${row + 1}`\n}\n\n/** \"A\" → 0,\"Z\" → 25,\"AA\" → 26。`columnName` 的逆。认不出返回 undefined */\nexport function columnIndex(name: string): number | undefined {\n if (!/^[A-Za-z]+$/.test(name)) return undefined\n let n = 0\n for (const ch of name.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64)\n return n - 1\n}\n\n/** \"A1\" → (0, 0)。`cellRef` 的逆。认不出返回 undefined */\nexport function parseCellRef(ref: string): { row: number; column: number } | undefined {\n const m = /^([A-Za-z]+)(\\d+)$/.exec(ref.trim())\n if (!m) return undefined\n const column = columnIndex(m[1] as string)\n const row = Number.parseInt(m[2] as string, 10) - 1\n if (column === undefined || row < 0) return undefined\n return { row, column }\n}\n\n/** \"A1:C3\" → CellRange。单格引用 \"B2\" 也收(起止同格)。认不出返回 undefined */\nexport function parseRange(ref: string): CellRange | undefined {\n const [a, b] = ref.trim().split(\":\")\n const start = a ? parseCellRef(a) : undefined\n if (!start) return undefined\n const end = b ? parseCellRef(b) : start\n if (!end) return undefined\n return {\n startRow: Math.min(start.row, end.row),\n startColumn: Math.min(start.column, end.column),\n endRow: Math.max(start.row, end.row),\n endColumn: Math.max(start.column, end.column),\n }\n}\n\n/** 十六进制两位,大写 */\nfunction hex2(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .toUpperCase()\n .padStart(2, \"0\")\n}\n\n/**\n * CSS 颜色 → xlsx 的 `AARRGGBB`。\n *\n * 认得 `#RGB` / `#RGBA` / `#RRGGBB` / `#RRGGBBAA` / `rgb()` / `rgba()`。\n * 认不出的(主题色 token、`currentColor`、颜色关键字)返回 undefined,\n * 由调用方跳过 —— 猜一个颜色写进去比不写更糟。\n */\nexport function toArgb(color: ColorStyle | string | null | undefined): string | undefined {\n const raw = typeof color === \"string\" ? color : color?.rgb\n if (!raw) return undefined\n const s = raw.trim()\n\n if (s.startsWith(\"#\")) {\n const h = s.slice(1)\n if (!/^[0-9a-fA-F]+$/.test(h)) return undefined\n const dup = (c: string) => c + c\n if (h.length === 3 || h.length === 4) {\n const [r, g, b, a] = h.split(\"\") as [string, string, string, string?]\n return `${a ? dup(a) : \"FF\"}${dup(r)}${dup(g)}${dup(b)}`.toUpperCase()\n }\n if (h.length === 6) return `FF${h.toUpperCase()}`\n // CSS 是 RRGGBBAA,xlsx 是 AARRGGBB —— alpha 要挪到前面\n if (h.length === 8) return `${h.slice(6, 8)}${h.slice(0, 6)}`.toUpperCase()\n return undefined\n }\n\n const m = /^rgba?\\(([^)]+)\\)$/i.exec(s)\n if (m) {\n const parts = (m[1] as string).split(/[,/\\s]+/).filter(Boolean)\n if (parts.length < 3) return undefined\n const [r, g, b, a] = parts as [string, string, string, string?]\n const alpha = a === undefined ? 1 : Number.parseFloat(a) / (a.includes(\"%\") ? 100 : 1)\n const chan = (v: string) =>\n v.includes(\"%\") ? (Number.parseFloat(v) / 100) * 255 : Number.parseFloat(v)\n if (!Number.isFinite(alpha)) return undefined\n return `${hex2(alpha * 255)}${hex2(chan(r))}${hex2(chan(g))}${hex2(chan(b))}`\n }\n\n return undefined\n}\n\n/**\n * xlsx 的 `AARRGGBB` / `RRGGBB` → CSS 颜色。`toArgb` 的逆。\n * 全不透明出 `#RRGGBB`,带 alpha 出 `rgba()`。认不出返回 undefined。\n */\nexport function argbToCss(argb: string | null | undefined): string | undefined {\n if (!argb) return undefined\n const h = argb.trim()\n if (!/^[0-9a-fA-F]{6}$|^[0-9a-fA-F]{8}$/.test(h)) return undefined\n if (h.length === 6) return `#${h.toUpperCase()}`\n const a = Number.parseInt(h.slice(0, 2), 16)\n const rgb = h.slice(2).toUpperCase()\n if (a === 255) return `#${rgb}`\n const alpha = Math.round((a / 255) * 1000) / 1000\n return `rgba(${Number.parseInt(rgb.slice(0, 2), 16)},${Number.parseInt(rgb.slice(2, 4), 16)},${Number.parseInt(rgb.slice(4, 6), 16)},${alpha})`\n}\n\n/** px → Excel 列宽(单位是默认字体最宽数字的宽度,Calibri 11 下 MDW = 7px) */\nexport function pxToColumnWidth(px: number): number {\n return Math.round(((px - 5) / 7) * 100) / 100\n}\n\n/** Excel 列宽 → px。`pxToColumnWidth` 的逆 */\nexport function columnWidthToPx(width: number): number {\n return Math.round(width * 7 + 5)\n}\n\n/** px → pt。Excel 的行高是磅值 */\nexport function pxToPoints(px: number): number {\n return Math.round(px * 0.75 * 100) / 100\n}\n\n/** pt → px。`pxToPoints` 的逆 */\nexport function pointsToPx(pt: number): number {\n return Math.round((pt / 0.75) * 100) / 100\n}\n\nexport const XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'\n"]}
|