@4399ywkf/editor 0.8.1 → 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 +45 -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 +46 -2
- 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
package/dist/xlsx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xlsx/styles.ts","../src/xlsx/serialize.ts","../src/xlsx/index.ts"],"names":[],"mappings":"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","file":"xlsx.js","sourcesContent":["/**\n * xl/styles.xml 的构建。\n *\n * xlsx 的样式是**分表去重 + 索引引用**的:字体、填充、边框、数字格式各自成表,\n * `cellXfs` 里的每条记录把这四张表的下标组合起来,单元格再引用 `cellXfs` 的下标。\n * 直接给每个单元格写一条 xf 也能打开,但几千行的表会膨胀到几 MB,\n * 而且 Excel 的「单元格样式」面板会炸出几千个条目。所以这里每层都做去重。\n *\n * 三个 Excel 的硬性约定,踩了就是「文件已损坏」:\n * 1. `fills` 的第 0 项必须是 `none`、第 1 项必须是 `gray125`;\n * 2. `borders`、`fonts`、`cellStyleXfs`、`cellXfs` 的第 0 项是缺省项,必须存在;\n * 3. `<font>` / `<border>` 的子元素有固定顺序,乱序 Excel 直接判损坏。\n */\n\nimport { H_ALIGN, type StyleData, V_ALIGN, WRAP } from \"./types.ts\"\nimport { escapeAttr, toArgb, XML_DECL } from \"./xml.ts\"\n\n/** 对齐 `BorderStyleTypes` → Excel 的 `ST_BorderStyle` */\nconst BORDER_STYLE = [\n \"none\",\n \"thin\",\n \"hair\",\n \"dotted\",\n \"dashed\",\n \"dashDot\",\n \"dashDotDot\",\n \"double\",\n \"medium\",\n \"mediumDashed\",\n \"mediumDashDot\",\n \"mediumDashDotDot\",\n \"slantDashDot\",\n \"thick\",\n] as const\n\nconst H_ALIGN_NAME: Record<number, string> = {\n [H_ALIGN.LEFT]: \"left\",\n [H_ALIGN.CENTER]: \"center\",\n [H_ALIGN.RIGHT]: \"right\",\n [H_ALIGN.JUSTIFIED]: \"justify\",\n [H_ALIGN.BOTH]: \"justify\",\n [H_ALIGN.DISTRIBUTED]: \"distributed\",\n}\n\nconst V_ALIGN_NAME: Record<number, string> = {\n [V_ALIGN.TOP]: \"top\",\n [V_ALIGN.MIDDLE]: \"center\",\n [V_ALIGN.BOTTOM]: \"bottom\",\n}\n\n/** 第一个可用的自定义数字格式 id。0-163 是 Excel 内建的,占了会被覆盖 */\nconst FIRST_CUSTOM_NUMFMT_ID = 164\n\ninterface Alignment {\n horizontal?: string\n vertical?: string\n wrapText?: boolean\n textRotation?: number\n}\n\nexport interface StyleTable {\n /**\n * 登记一份样式,拿到 `cellXfs` 下标。\n * `quotePrefix` 对应 Univer 的 `FORCE_STRING` —— Excel 用它压掉\n * 「以文本形式存储的数字」那个绿色小三角。\n */\n xf(style: StyleData | null | undefined, quotePrefix?: boolean): number\n xml(): string\n}\n\nexport function createStyleTable(defaultStyle?: StyleData | null): StyleTable {\n const numFmts = new Map<string, number>()\n const fonts = new Map<string, number>()\n const fills = new Map<string, number>()\n const borders = new Map<string, number>()\n const xfs = new Map<string, number>()\n\n const fontXml: string[] = []\n const fillXml: string[] = []\n const borderXml: string[] = []\n const xfXml: string[] = []\n\n // —— 缺省项,顺序不能动 ——\n // 字体 0 取工作簿默认样式:它是所有没显式设字体的单元格的实际外观\n fontXml.push(buildFont(defaultStyle ?? {}))\n fonts.set(fontKey(defaultStyle ?? {}), 0)\n fillXml.push('<fill><patternFill patternType=\"none\"/></fill>')\n fillXml.push('<fill><patternFill patternType=\"gray125\"/></fill>')\n borderXml.push(\"<border><left/><right/><top/><bottom/><diagonal/></border>\")\n borders.set(\"\", 0)\n xfXml.push('<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>')\n xfs.set(\"0|0|0|0||0\", 0)\n\n function fontKey(s: StyleData): string {\n return JSON.stringify([\n s.ff ?? null,\n s.fs ?? null,\n s.bl ?? 0,\n s.it ?? 0,\n s.ul?.s ?? 0,\n s.st?.s ?? 0,\n s.va ?? 0,\n toArgb(s.cl) ?? null,\n ])\n }\n\n function buildFont(s: StyleData): string {\n const parts: string[] = []\n // CT_Font 是有序序列:b, i, strike, u, vertAlign, sz, color, name\n if (s.bl) parts.push(\"<b/>\")\n if (s.it) parts.push(\"<i/>\")\n if (s.st?.s) parts.push(\"<strike/>\")\n if (s.ul?.s) parts.push('<u val=\"single\"/>')\n if (s.va === 1) parts.push('<vertAlign val=\"superscript\"/>')\n else if (s.va === 2) parts.push('<vertAlign val=\"subscript\"/>')\n parts.push(`<sz val=\"${s.fs ?? 11}\"/>`)\n const color = toArgb(s.cl)\n if (color) parts.push(`<color rgb=\"${color}\"/>`)\n parts.push(`<name val=\"${escapeAttr(s.ff ?? \"Calibri\")}\"/>`)\n return `<font>${parts.join(\"\")}</font>`\n }\n\n function fontId(s: StyleData): number {\n const key = fontKey(s)\n const hit = fonts.get(key)\n if (hit !== undefined) return hit\n const id = fontXml.length\n fontXml.push(buildFont(s))\n fonts.set(key, id)\n return id\n }\n\n function fillId(s: StyleData): number {\n const argb = toArgb(s.bg)\n if (!argb) return 0\n const hit = fills.get(argb)\n if (hit !== undefined) return hit\n const id = fillXml.length\n // bgColor indexed=\"64\" 是「无」的意思:solid 填充只认 fgColor,\n // 但缺了 bgColor 有些解析器(含 WPS 旧版)会把整块画成黑的\n fillXml.push(\n `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${argb}\"/><bgColor indexed=\"64\"/></patternFill></fill>`,\n )\n fills.set(argb, id)\n return id\n }\n\n function borderId(s: StyleData): number {\n const bd = s.bd\n if (!bd) return 0\n const key = JSON.stringify([\n [bd.l?.s ?? 0, toArgb(bd.l?.cl) ?? null],\n [bd.r?.s ?? 0, toArgb(bd.r?.cl) ?? null],\n [bd.t?.s ?? 0, toArgb(bd.t?.cl) ?? null],\n [bd.b?.s ?? 0, toArgb(bd.b?.cl) ?? null],\n ])\n if (key === \"[[0,null],[0,null],[0,null],[0,null]]\") return 0\n const hit = borders.get(key)\n if (hit !== undefined) return hit\n\n // CT_Border 同样是有序的:left, right, top, bottom, diagonal\n const side = (name: string, data: typeof bd.l): string => {\n const style = BORDER_STYLE[data?.s ?? 0]\n if (!data || !style || style === \"none\") return `<${name}/>`\n const argb = toArgb(data.cl)\n return argb\n ? `<${name} style=\"${style}\"><color rgb=\"${argb}\"/></${name}>`\n : `<${name} style=\"${style}\"/>`\n }\n const id = borderXml.length\n borderXml.push(\n `<border>${side(\"left\", bd.l)}${side(\"right\", bd.r)}${side(\"top\", bd.t)}${side(\"bottom\", bd.b)}<diagonal/></border>`,\n )\n borders.set(key, id)\n return id\n }\n\n function numFmtId(s: StyleData): number {\n const pattern = s.n?.pattern?.trim()\n // General 就是 0 号内建格式,不要为它造自定义格式\n if (!pattern || pattern.toLowerCase() === \"general\") return 0\n const hit = numFmts.get(pattern)\n if (hit !== undefined) return hit\n const id = FIRST_CUSTOM_NUMFMT_ID + numFmts.size\n numFmts.set(pattern, id)\n return id\n }\n\n function alignmentOf(s: StyleData): Alignment | undefined {\n const a: Alignment = {}\n if (s.ht && H_ALIGN_NAME[s.ht]) a.horizontal = H_ALIGN_NAME[s.ht]\n if (s.vt && V_ALIGN_NAME[s.vt]) a.vertical = V_ALIGN_NAME[s.vt]\n if (s.tb === WRAP.WRAP) a.wrapText = true\n const angle = s.tr?.a\n if (s.tr?.v === 1) {\n // 255 是 Excel 约定的「竖排」,不是角度\n a.textRotation = 255\n } else if (typeof angle === \"number\" && angle !== 0) {\n // Excel 的编码:0-90 表示逆时针,91-180 表示顺时针 (值 - 90) 度\n const clamped = Math.max(-90, Math.min(90, Math.round(angle)))\n a.textRotation = clamped >= 0 ? clamped : 90 - clamped\n }\n return Object.keys(a).length ? a : undefined\n }\n\n function xf(style: StyleData | null | undefined, quotePrefix = false): number {\n const s = style ?? {}\n const nf = numFmtId(s)\n const font = fontId(s)\n const fill = fillId(s)\n const border = borderId(s)\n const align = alignmentOf(s)\n const key = `${nf}|${font}|${fill}|${border}|${align ? JSON.stringify(align) : \"\"}|${quotePrefix ? 1 : 0}`\n const hit = xfs.get(key)\n if (hit !== undefined) return hit\n\n const attrs = [\n `numFmtId=\"${nf}\"`,\n `fontId=\"${font}\"`,\n `fillId=\"${fill}\"`,\n `borderId=\"${border}\"`,\n 'xfId=\"0\"',\n ]\n // applyXxx 不是可有可无的:漏了它们,部分解析器(LibreOffice、部分在线预览)\n // 会认为该维度「沿用 cellStyleXfs 的缺省」,样式看着就丢了\n if (nf) attrs.push('applyNumberFormat=\"1\"')\n if (font) attrs.push('applyFont=\"1\"')\n if (fill) attrs.push('applyFill=\"1\"')\n if (border) attrs.push('applyBorder=\"1\"')\n if (align) attrs.push('applyAlignment=\"1\"')\n if (quotePrefix) attrs.push('quotePrefix=\"1\"')\n\n const body = align\n ? `<alignment${align.horizontal ? ` horizontal=\"${align.horizontal}\"` : \"\"}${\n align.vertical ? ` vertical=\"${align.vertical}\"` : \"\"\n }${align.wrapText ? ' wrapText=\"1\"' : \"\"}${\n align.textRotation !== undefined ? ` textRotation=\"${align.textRotation}\"` : \"\"\n }/>`\n : \"\"\n\n const id = xfXml.length\n xfXml.push(body ? `<xf ${attrs.join(\" \")}>${body}</xf>` : `<xf ${attrs.join(\" \")}/>`)\n xfs.set(key, id)\n return id\n }\n\n function xml(): string {\n const numFmtXml = [...numFmts.entries()]\n .map(([pattern, id]) => `<numFmt numFmtId=\"${id}\" formatCode=\"${escapeAttr(pattern)}\"/>`)\n .join(\"\")\n return (\n `${XML_DECL}<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">` +\n (numFmts.size ? `<numFmts count=\"${numFmts.size}\">${numFmtXml}</numFmts>` : \"\") +\n `<fonts count=\"${fontXml.length}\">${fontXml.join(\"\")}</fonts>` +\n `<fills count=\"${fillXml.length}\">${fillXml.join(\"\")}</fills>` +\n `<borders count=\"${borderXml.length}\">${borderXml.join(\"\")}</borders>` +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n `<cellXfs count=\"${xfXml.length}\">${xfXml.join(\"\")}</cellXfs>` +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/>' +\n \"</styleSheet>\"\n )\n }\n\n return { xf, xml }\n}\n","/**\n * Univer 快照 → xlsx 的各个 XML 部件。\n *\n * 纯函数、无 DOM、无引擎依赖:Node 里拿一份 JSON 就能出文件,\n * 不需要把 871KB 的 Univer 渲染引擎拉起来。\n *\n * **能保住的**:多工作表、值与类型、公式(含共享公式与缓存值)、数字格式、\n * 字体/颜色/填充/边框/对齐/换行/旋转、合并单元格、行高列宽、隐藏行列、\n * 冻结窗格、网格线开关、标签颜色、工作表隐藏。\n *\n * **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、超链接。\n * 它们不在 `cellData` 里,而是各插件自己序列化进 `resources` 的私有结构 ——\n * 逐个反解等于把 Univer 的插件模型抄一遍。所以这里不假装支持,\n * 而是扫一遍 `resources` **如实报告丢了什么**(见 `warnings`),\n * 让宿主能把话原样告诉用户,而不是让人打开文件才发现。\n */\n\nimport { numericKeys, richTextToPlain } from \"./cell.ts\"\nimport { createStyleTable } from \"./styles.ts\"\nimport {\n CELL_TYPE,\n type CellData,\n type StyleData,\n type WorkbookData,\n type WorksheetData,\n} from \"./types.ts\"\nimport {\n cellRef,\n columnName,\n escapeAttr,\n escapeXml,\n pxToColumnWidth,\n pxToPoints,\n toArgb,\n XML_DECL,\n} from \"./xml.ts\"\n\nexport interface SerializeXlsxOptions {\n /**\n * 是否写入公式的缓存值,默认 true。\n *\n * 关掉的话单元格只剩 `<f>`,Excel 打开时自己重算 —— 值一定是对的,\n * 但在**不重算的**消费方(网页预览、pandas、部分在线表格)里会显示成空。\n * 开着则 Univer 算出来的值直接可见,代价是 Univer 与 Excel 的函数实现\n * 有差异时会先看到 Univer 的结果,直到用户在 Excel 里触发重算。\n */\n cachedFormulaValues?: boolean\n /** docProps 里的作者 */\n creator?: string\n /** docProps 里的时间。传固定值可得到逐字节确定的产物(测试用) */\n created?: Date\n}\n\nexport interface SerializeXlsxResult {\n /** zip 条目:路径 → 内容 */\n files: Record<string, Uint8Array>\n /** 导出时丢掉/降级了什么。**要展示给用户**,别吞 */\n warnings: string[]\n /** 计数,用于量化保真度 */\n stats: Record<string, number>\n}\n\n/** `resources` 里的插件名 → 人话。用户看得懂才算报告 */\nconst RESOURCE_LABELS: Record<string, string> = {\n SHEET_DRAWING_PLUGIN: \"图片与图表\",\n SHEET_CONDITIONAL_FORMATTING_PLUGIN: \"条件格式\",\n SHEET_DATA_VALIDATION_PLUGIN: \"数据校验\",\n SHEET_FILTER_PLUGIN: \"筛选\",\n SHEET_SORT_PLUGIN: \"排序状态\",\n SHEET_HYPER_LINK_PLUGIN: \"超链接\",\n SHEET_NOTE_PLUGIN: \"批注\",\n SHEET_THREAD_COMMENT_BASE_PLUGIN: \"评论\",\n SHEET_TABLE_PLUGIN: \"表格样式(Table)\",\n SHEET_DEFINED_NAME_PLUGIN: \"定义名称\",\n SHEET_RANGE_PROTECTION_PLUGIN: \"区域保护\",\n SHEET_WORKSHEET_PROTECTION_PLUGIN: \"工作表保护\",\n}\n\n/** Excel 不接受的工作表名字符 */\nconst BAD_SHEET_NAME = /[\\\\/?*[\\]:]/g\n\nconst RELS_NS = 'xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"'\nconst MAIN_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\nconst DOC_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n\nexport function serializeXlsx(\n workbook: WorkbookData,\n options: SerializeXlsxOptions = {},\n): SerializeXlsxResult {\n const { cachedFormulaValues = true, creator = \"@4399ywkf/editor\", created = new Date() } = options\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 richTextFlattened: 0,\n }\n\n const encoder = new TextEncoder()\n const files: Record<string, Uint8Array> = {}\n const put = (path: string, xml: string) => {\n files[path] = encoder.encode(xml)\n }\n\n const styleMap = workbook.styles ?? {}\n const resolveStyle = (s: StyleData | string | null | undefined): StyleData | undefined => {\n if (!s) return undefined\n if (typeof s === \"string\") return styleMap[s] ?? undefined\n return s\n }\n const styles = createStyleTable(resolveStyle(workbook.defaultStyle))\n\n // 共享字符串表。字符串走 sst 而不是 inlineStr:重复文本(同一列的枚举值)\n // 在真实表格里占比极高,去重后文件常小一个量级\n const sst = new Map<string, number>()\n const sstOrder: string[] = []\n let sstTotal = 0\n const stringIndex = (text: string): number => {\n sstTotal++\n const hit = sst.get(text)\n if (hit !== undefined) return hit\n const id = sstOrder.length\n sst.set(text, id)\n sstOrder.push(text)\n return id\n }\n\n /* ---------------------------- 工作表 ---------------------------- */\n\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n const sheets: Array<{ name: string; hidden: boolean; path: string }> = []\n const usedNames = new Set<string>()\n\n const safeName = (raw: string | undefined, index: number): string => {\n let name = (raw ?? \"\").replace(BAD_SHEET_NAME, \"\")\n if (name.startsWith(\"'\") || name.endsWith(\"'\")) name = name.replace(/^'+|'+$/g, \"\")\n if (!name.trim()) name = `Sheet${index + 1}`\n if (name.length > 31) name = name.slice(0, 31)\n let unique = name\n let n = 2\n // Excel 的工作表名不区分大小写地唯一\n while (usedNames.has(unique.toLowerCase())) {\n const suffix = `(${n++})`\n unique = `${name.slice(0, 31 - suffix.length)}${suffix}`\n }\n usedNames.add(unique.toLowerCase())\n if (unique !== raw) {\n warnings.push(`工作表名「${raw ?? \"\"}」不被 Excel 接受,已改成「${unique}」`)\n }\n return unique\n }\n\n order.forEach((sheetId, index) => {\n const sheet = workbook.sheets?.[sheetId] as WorksheetData\n const name = safeName(sheet.name, index)\n const path = `xl/worksheets/sheet${index + 1}.xml`\n sheets.push({ name, hidden: sheet.hidden === 1, path })\n put(path, buildSheetXml(sheet))\n stats.sheets++\n })\n\n // Excel 不接受零工作表的工作簿\n if (!sheets.length) {\n sheets.push({ name: \"Sheet1\", hidden: false, path: \"xl/worksheets/sheet1.xml\" })\n put(\"xl/worksheets/sheet1.xml\", buildSheetXml({}))\n stats.sheets++\n }\n\n function buildSheetXml(sheet: WorksheetData): string {\n const cellData = sheet.cellData ?? {}\n const rowData = sheet.rowData ?? {}\n const columnData = sheet.columnData ?? {}\n const sheetDefault = resolveStyle(sheet.defaultStyle)\n\n // 有内容的行 ∪ 只设了行高/隐藏/样式的行\n const rows = [...new Set([...numericKeys(cellData), ...numericKeys(rowData)])].sort(\n (a, b) => a - b,\n )\n\n let maxRow = -1\n let maxCol = -1\n const track = (r: number, c: number) => {\n if (r > maxRow) maxRow = r\n if (c > maxCol) maxCol = c\n }\n\n /* 共享公式:Univer 用字符串 si 分组,组里只有一个单元格带 f。\n 不还原的话,填充出来的一整列公式会退化成纯数值 —— 用户改了源数据就不再联动。\n Excel 要求 master 位于 ref 区域的左上角,不满足就退回逐格写普通公式。 */\n const groups = new Map<\n string,\n {\n master?: { row: number; col: number; f: string }\n minR: number\n maxR: number\n minC: number\n maxC: number\n }\n >()\n for (const r of numericKeys(cellData)) {\n for (const c of numericKeys(cellData[r])) {\n const cell = cellData[r]?.[c]\n const si = cell?.si\n if (!si) continue\n const g = groups.get(si) ?? { minR: r, maxR: r, minC: c, maxC: c }\n g.minR = Math.min(g.minR, r)\n g.maxR = Math.max(g.maxR, r)\n g.minC = Math.min(g.minC, c)\n g.maxC = Math.max(g.maxC, c)\n if (cell?.f) g.master = { row: r, col: c, f: cell.f }\n groups.set(si, g)\n }\n }\n const sharedIndex = new Map<string, number>()\n for (const [si, g] of groups) {\n if (!g.master) {\n warnings.push(`共享公式组 ${si} 在快照里找不到源格,组内单元格只保留静态值`)\n continue\n }\n if (g.master.row !== g.minR || g.master.col !== g.minC) {\n warnings.push(\n `共享公式组 ${si} 的源格不在区域左上角(Excel 不允许),源格按普通公式写出,其余单元格只保留静态值`,\n )\n continue\n }\n sharedIndex.set(si, sharedIndex.size)\n }\n\n const rowXml: string[] = []\n for (const r of rows) {\n const cols = numericKeys(cellData[r])\n const meta = rowData[r]\n const cellXml: string[] = []\n\n for (const c of cols) {\n const cell = cellData[r]?.[c]\n if (!cell) continue\n const piece = buildCell(r, c, cell)\n if (piece) {\n cellXml.push(piece)\n track(r, c)\n }\n }\n\n const height = meta?.ia === 1 && meta?.ah ? meta.ah : meta?.h\n const rowStyle = resolveStyle(meta?.s)\n const attrs = [`r=\"${r + 1}\"`]\n if (height) attrs.push(`ht=\"${pxToPoints(height)}\"`, 'customHeight=\"1\"')\n if (meta?.hd === 1) attrs.push('hidden=\"1\"')\n if (rowStyle) attrs.push(`s=\"${styles.xf(rowStyle)}\"`, 'customFormat=\"1\"')\n // 空行只有在带格式信息(行高/隐藏/样式)时才值得写出来\n if (!cellXml.length && attrs.length === 1) continue\n rowXml.push(\n cellXml.length\n ? `<row ${attrs.join(\" \")}>${cellXml.join(\"\")}</row>`\n : `<row ${attrs.join(\" \")}/>`,\n )\n }\n\n function buildCell(r: number, c: number, cell: CellData): string {\n const ref = cellRef(r, c)\n const style = resolveStyle(cell.s) ?? sheetDefault\n const forceString = cell.t === CELL_TYPE.FORCE_STRING\n const styleIndex = style || forceString ? styles.xf(style, forceString) : 0\n const s = styleIndex ? ` s=\"${styleIndex}\"` : \"\"\n\n if (cell.ref && cell.f) {\n // 数组公式(CSE):Excel 要 t=\"array\" + ref,且溢出格不能自己再带公式。\n // Univer 的溢出格是普通值,直接照搬会让 Excel 报「数组公式被修改」\n warnings.push(`${ref} 是数组公式,已降级成普通公式(溢出区域的值按静态值写出)`)\n }\n\n const formula = cell.f?.replace(/^=/, \"\")\n if (formula || cell.si) {\n stats.cells++\n const si = cell.si ? sharedIndex.get(cell.si) : undefined\n const group = cell.si ? groups.get(cell.si) : undefined\n let fXml = \"\"\n if (formula && si !== undefined && group) {\n const range = `${cellRef(group.minR, group.minC)}:${cellRef(group.maxR, group.maxC)}`\n fXml = `<f t=\"shared\" ref=\"${range}\" si=\"${si}\">${escapeXml(formula)}</f>`\n stats.formulas++\n stats.sharedFormulas++\n } else if (formula) {\n fXml = `<f>${escapeXml(formula)}</f>`\n stats.formulas++\n } else if (si !== undefined) {\n fXml = `<f t=\"shared\" si=\"${si}\"/>`\n stats.sharedFormulas++\n }\n const cached = cachedFormulaValues ? formulaValue(cell) : \"\"\n // 公式格的 t 跟着缓存值走;纯数字不需要 t\n const t = cachedFormulaValues && typeof cell.v === \"string\" ? ' t=\"str\"' : \"\"\n return `<c r=\"${ref}\"${s}${t}>${fXml}${cached}</c>`\n }\n\n const rich = richTextToPlain(cell)\n if (rich !== undefined) {\n stats.cells++\n stats.richTextFlattened++\n return `<c r=\"${ref}\"${s} t=\"s\"><v>${stringIndex(rich)}</v></c>`\n }\n\n const v = cell.v\n if (v === undefined || v === null || v === \"\") {\n // 没值但有格式的格子仍要写出来,否则底色/边框会丢\n return styleIndex ? `<c r=\"${ref}\"${s}/>` : \"\"\n }\n\n stats.cells++\n if (typeof v === \"boolean\") return `<c r=\"${ref}\"${s} t=\"b\"><v>${v ? 1 : 0}</v></c>`\n if (typeof v === \"number\" && cell.t !== CELL_TYPE.FORCE_STRING && Number.isFinite(v)) {\n return `<c r=\"${ref}\"${s}><v>${v}</v></c>`\n }\n return `<c r=\"${ref}\"${s} t=\"s\"><v>${stringIndex(String(v))}</v></c>`\n }\n\n function formulaValue(cell: CellData): string {\n const v = cell.v\n if (v === undefined || v === null || v === \"\") return \"\"\n if (typeof v === \"boolean\") return `<v>${v ? 1 : 0}</v>`\n if (typeof v === \"number\") return Number.isFinite(v) ? `<v>${v}</v>` : \"\"\n return `<v>${escapeXml(String(v))}</v>`\n }\n\n /* ------------------------- 表级结构 ------------------------- */\n\n const merges = (sheet.mergeData ?? []).filter(\n (m) => m && (m.endRow > m.startRow || m.endColumn > m.startColumn),\n )\n for (const m of merges) track(m.endRow, m.endColumn)\n stats.merges += merges.length\n const mergeXml = merges.length\n ? `<mergeCells count=\"${merges.length}\">${merges\n .map(\n (m) =>\n `<mergeCell ref=\"${cellRef(m.startRow, m.startColumn)}:${cellRef(m.endRow, m.endColumn)}\"/>`,\n )\n .join(\"\")}</mergeCells>`\n : \"\"\n\n const colsXml = numericKeys(columnData)\n .map((index) => {\n const col = columnData[index]\n if (!col) return \"\"\n const attrs = [`min=\"${index + 1}\"`, `max=\"${index + 1}\"`]\n if (col.w) attrs.push(`width=\"${pxToColumnWidth(col.w)}\"`, 'customWidth=\"1\"')\n if (col.hd === 1) attrs.push('hidden=\"1\"')\n const colStyle = resolveStyle(col.s)\n if (colStyle) attrs.push(`style=\"${styles.xf(colStyle)}\"`)\n return attrs.length > 2 ? `<col ${attrs.join(\" \")}/>` : \"\"\n })\n .filter(Boolean)\n .join(\"\")\n\n const freeze = sheet.freeze\n const xSplit = Math.max(0, freeze?.xSplit ?? 0)\n const ySplit = Math.max(0, freeze?.ySplit ?? 0)\n const paneXml =\n xSplit || ySplit\n ? `<pane${xSplit ? ` xSplit=\"${xSplit}\"` : \"\"}${ySplit ? ` ySplit=\"${ySplit}\"` : \"\"}` +\n ` topLeftCell=\"${cellRef(ySplit, xSplit)}\" activePane=\"${\n xSplit && ySplit ? \"bottomRight\" : xSplit ? \"topRight\" : \"bottomLeft\"\n }\" state=\"frozen\"/>`\n : \"\"\n\n const viewAttrs = ['workbookViewId=\"0\"']\n if (sheet.showGridlines === 0) viewAttrs.push('showGridLines=\"0\"')\n if (sheet.rightToLeft === 1) viewAttrs.push('rightToLeft=\"1\"')\n const sheetViewXml = `<sheetViews><sheetView ${viewAttrs.join(\" \")}>${paneXml}</sheetView></sheetViews>`\n\n const formatAttrs = [`defaultRowHeight=\"${pxToPoints(sheet.defaultRowHeight ?? 24)}\"`]\n if (sheet.defaultColumnWidth) {\n formatAttrs.push(`defaultColWidth=\"${pxToColumnWidth(sheet.defaultColumnWidth)}\"`)\n }\n\n const dimension = maxRow < 0 ? \"A1\" : `A1:${columnName(Math.max(maxCol, 0))}${maxRow + 1}`\n const tabColor = toArgb(sheet.tabColor)\n const sheetPr = tabColor ? `<sheetPr><tabColor rgb=\"${tabColor}\"/></sheetPr>` : \"\"\n\n // 元素顺序是 schema 规定的:sheetPr → dimension → sheetViews → sheetFormatPr\n // → cols → sheetData → mergeCells。顺序错了 Excel 判文件损坏\n return (\n `${XML_DECL}<worksheet xmlns=\"${MAIN_NS}\" xmlns:r=\"${DOC_REL}\">` +\n sheetPr +\n `<dimension ref=\"${dimension}\"/>` +\n sheetViewXml +\n `<sheetFormatPr ${formatAttrs.join(\" \")}/>` +\n (colsXml ? `<cols>${colsXml}</cols>` : \"\") +\n `<sheetData>${rowXml.join(\"\")}</sheetData>` +\n mergeXml +\n \"</worksheet>\"\n )\n }\n\n /* ------------------------- 工作簿与包 ------------------------- */\n\n const sheetEntries = sheets\n .map(\n (s, i) =>\n `<sheet name=\"${escapeAttr(s.name)}\" sheetId=\"${i + 1}\"${s.hidden ? ' state=\"hidden\"' : \"\"} r:id=\"rId${i + 1}\"/>`,\n )\n .join(\"\")\n\n put(\n \"xl/workbook.xml\",\n `${XML_DECL}<workbook xmlns=\"${MAIN_NS}\" xmlns:r=\"${DOC_REL}\">` +\n \"<workbookPr/>\" +\n `<sheets>${sheetEntries}</sheets>` +\n // 没写缓存值时必须让 Excel 打开就重算,否则整列公式显示成空白。\n // 写了缓存值就别加:fullCalcOnLoad 会把文件标脏,用户没改动也会被问「是否保存」\n (cachedFormulaValues ? \"\" : '<calcPr calcId=\"0\" fullCalcOnLoad=\"1\"/>') +\n \"</workbook>\",\n )\n\n const stylesRelId = sheets.length + 1\n const sstRelId = sheets.length + 2\n put(\n \"xl/_rels/workbook.xml.rels\",\n `${XML_DECL}<Relationships ${RELS_NS}>` +\n sheets\n .map(\n (s, i) =>\n `<Relationship Id=\"rId${i + 1}\" Type=\"${DOC_REL}/worksheet\" Target=\"worksheets/${s.path.split(\"/\").pop()}\"/>`,\n )\n .join(\"\") +\n `<Relationship Id=\"rId${stylesRelId}\" Type=\"${DOC_REL}/styles\" Target=\"styles.xml\"/>` +\n `<Relationship Id=\"rId${sstRelId}\" Type=\"${DOC_REL}/sharedStrings\" Target=\"sharedStrings.xml\"/>` +\n \"</Relationships>\",\n )\n\n put(\n \"xl/sharedStrings.xml\",\n `${XML_DECL}<sst xmlns=\"${MAIN_NS}\" count=\"${sstTotal}\" uniqueCount=\"${sstOrder.length}\">` +\n sstOrder.map((t) => `<si><t xml:space=\"preserve\">${escapeXml(t)}</t></si>`).join(\"\") +\n \"</sst>\",\n )\n\n // styles.xml 必须最后写:上面遍历单元格时还在往样式表里登记\n put(\"xl/styles.xml\", styles.xml())\n\n put(\n \"[Content_Types].xml\",\n `${XML_DECL}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n sheets\n .map(\n (s) =>\n `<Override PartName=\"/${s.path}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`,\n )\n .join(\"\") +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>' +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>' +\n \"</Types>\",\n )\n\n put(\n \"_rels/.rels\",\n `${XML_DECL}<Relationships ${RELS_NS}>` +\n `<Relationship Id=\"rId1\" Type=\"${DOC_REL}/officeDocument\" Target=\"xl/workbook.xml\"/>` +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n `<Relationship Id=\"rId3\" Type=\"${DOC_REL}/extended-properties\" Target=\"docProps/app.xml\"/>` +\n \"</Relationships>\",\n )\n\n const iso = created.toISOString().replace(/\\.\\d+Z$/, \"Z\")\n put(\n \"docProps/core.xml\",\n `${XML_DECL}<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"` +\n ' xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\"' +\n ' xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n `<dc:title>${escapeXml(workbook.name ?? \"\")}</dc:title>` +\n `<dc:creator>${escapeXml(creator)}</dc:creator>` +\n `<cp:lastModifiedBy>${escapeXml(creator)}</cp:lastModifiedBy>` +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${iso}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${iso}</dcterms:modified>` +\n \"</cp:coreProperties>\",\n )\n\n put(\n \"docProps/app.xml\",\n `${XML_DECL}<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\"` +\n ' xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n \"<Application>@4399ywkf/editor</Application>\" +\n `<TitlesOfParts><vt:vector size=\"${sheets.length}\" baseType=\"lpstr\">` +\n sheets.map((s) => `<vt:lpstr>${escapeXml(s.name)}</vt:lpstr>`).join(\"\") +\n \"</vt:vector></TitlesOfParts>\" +\n \"</Properties>\",\n )\n\n /* --------------------- 如实报告丢了什么 --------------------- */\n\n for (const res of workbook.resources ?? []) {\n const label = RESOURCE_LABELS[res.name]\n if (!label) continue\n // data 是插件自己的 JSON 字符串。空对象/空数组说明该插件其实没数据,别误报\n const payload = res.data?.trim()\n if (!payload || payload === \"{}\" || payload === \"[]\" || payload === \"null\") continue\n warnings.push(`${label}未随 xlsx 导出(Univer 把它存在插件数据里,不在单元格模型内)`)\n stats[`dropped:${res.name}`] = 1\n }\n\n return { files, warnings, stats }\n}\n","/**\n * `@4399ywkf/editor/xlsx` —— 表格导入导出。\n *\n * 和 `./docx` 同一套思路:**在本地转换,文档不出内网**,不依赖任何转换服务,\n * 也不引 SheetJS —— 打包只多出 fflate(本来就有)和这千把行 OOXML 拼装/解析。\n *\n * ```ts\n * import { downloadXlsx } from \"@4399ywkf/editor/xlsx\"\n *\n * // SheetView 的 onReady 给的就是 univerAPI\n * <DocumentView format=\"sheet\" onReady={(api) => (ref.current = api)} />\n * downloadXlsx(ref.current, \"年度报表.xlsx\")\n * ```\n *\n * 导入是反方向 —— File / Blob / URL 都收,`SheetView` 的 `source` 走的就是它:\n *\n * ```ts\n * import { importSheetSource } from \"@4399ywkf/editor/xlsx\"\n * const { workbook, warnings } = await importSheetSource(file)\n * univerAPI.createWorkbook(workbook)\n * ```\n *\n * 服务端 / 定时任务只有 JSON 也能用 —— 整条链路不碰 DOM:\n *\n * ```ts\n * import { xlsxFromSnapshot } from \"@4399ywkf/editor/xlsx\"\n * const { bytes, warnings } = xlsxFromSnapshot(snapshot)\n * ```\n *\n * `warnings` 一定要透给用户。Univer 把图片、条件格式、数据校验这些存在插件数据里,\n * 不在单元格模型内,导出必然丢;导入侧同理(drawing / pivot / comments 是独立部件)——\n * 打开文件才发现远比转换时被告知糟糕。\n */\n\nimport { zipSync } from \"fflate\"\n\nimport { type SerializeXlsxOptions, type SerializeXlsxResult, serializeXlsx } from \"./serialize.ts\"\nimport { toSnapshot } from \"./snapshot.ts\"\nimport type { WorkbookData } from \"./types.ts\"\n\nexport type { CsvParseOptions, CsvToSnapshotResult } from \"./csv-parse.ts\"\nexport { csvToSnapshot, parseCsv } from \"./csv-parse.ts\"\nexport type {\n ImportCsvOptions,\n ImportSheetResult,\n ImportSheetSourceResult,\n ImportXlsxOptions,\n} from \"./import.ts\"\nexport { importCsv, importSheetSource, importXlsx } from \"./import.ts\"\nexport type { ParseXlsxOptions, ParseXlsxResult, XlsxEntries } from \"./parse.ts\"\nexport { parseXlsx } from \"./parse.ts\"\nexport type { SerializeXlsxOptions, SerializeXlsxResult } from \"./serialize.ts\"\nexport { serializeXlsx } from \"./serialize.ts\"\nexport { snapshotFromUniver } from \"./snapshot.ts\"\nexport type {\n CellData,\n CellRange,\n CellValue,\n ColumnData,\n RowData,\n StyleData,\n WorkbookData,\n WorksheetData,\n} from \"./types.ts\"\n\nexport const XLSX_MIME = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n\nexport interface XlsxResult {\n bytes: Uint8Array\n /** 导出时丢掉/降级了什么。**请展示给用户** */\n warnings: string[]\n stats: Record<string, number>\n}\n\n/** 纯函数:Univer 快照 → .xlsx 字节。不依赖 DOM 与引擎,服务端 / 测试直接可用。 */\nexport function xlsxFromSnapshot(\n workbook: WorkbookData,\n options: SerializeXlsxOptions = {},\n): XlsxResult {\n const { files, warnings, stats }: SerializeXlsxResult = serializeXlsx(workbook, options)\n return { bytes: zipSync(files, { level: 6 }), warnings, stats }\n}\n\n/** Univer 实例或快照 → .xlsx 字节 */\nexport function exportXlsx(\n source: WorkbookData | unknown,\n options?: SerializeXlsxOptions,\n): XlsxResult {\n return xlsxFromSnapshot(toSnapshot(source), options)\n}\n\n/** Univer 实例或快照 → Blob,便于交给上传接口 */\nexport function xlsxBlob(source: WorkbookData | unknown, options?: SerializeXlsxOptions): Blob {\n return new Blob([exportXlsx(source, options).bytes as BlobPart], { type: XLSX_MIME })\n}\n\n/**\n * 触发浏览器下载。返回 warnings / stats —— 别丢,那是「这次导出丢了什么」的唯一出口。\n *\n * 只在浏览器里可用;Node 环境请用 `xlsxFromSnapshot` 自己落盘。\n */\nexport function downloadXlsx(\n source: WorkbookData | unknown,\n filename = \"工作簿.xlsx\",\n options?: SerializeXlsxOptions,\n): XlsxResult {\n const result = exportXlsx(source, options)\n if (typeof document === \"undefined\") {\n throw new Error(\"downloadXlsx 需要浏览器环境,服务端请改用 xlsxFromSnapshot\")\n }\n const url = URL.createObjectURL(new Blob([result.bytes as BlobPart], { type: XLSX_MIME }))\n const a = document.createElement(\"a\")\n a.href = url\n a.download = filename.endsWith(\".xlsx\") ? filename : `${filename}.xlsx`\n document.body.appendChild(a)\n a.click()\n a.remove()\n // 立刻 revoke 会让部分浏览器(Safari)来不及取数据\n setTimeout(() => URL.revokeObjectURL(url), 10_000)\n return result\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/xlsx/styles.ts","../src/xlsx/serialize.ts","../src/xlsx/index.ts"],"names":["index"],"mappings":"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","file":"xlsx.js","sourcesContent":["/**\n * xl/styles.xml 的构建。\n *\n * xlsx 的样式是**分表去重 + 索引引用**的:字体、填充、边框、数字格式各自成表,\n * `cellXfs` 里的每条记录把这四张表的下标组合起来,单元格再引用 `cellXfs` 的下标。\n * 直接给每个单元格写一条 xf 也能打开,但几千行的表会膨胀到几 MB,\n * 而且 Excel 的「单元格样式」面板会炸出几千个条目。所以这里每层都做去重。\n *\n * 三个 Excel 的硬性约定,踩了就是「文件已损坏」:\n * 1. `fills` 的第 0 项必须是 `none`、第 1 项必须是 `gray125`;\n * 2. `borders`、`fonts`、`cellStyleXfs`、`cellXfs` 的第 0 项是缺省项,必须存在;\n * 3. `<font>` / `<border>` 的子元素有固定顺序,乱序 Excel 直接判损坏。\n */\n\nimport { H_ALIGN, type StyleData, UNDERLINE, V_ALIGN, WRAP } from \"./types.ts\"\nimport { escapeAttr, toArgb, XML_DECL } from \"./xml.ts\"\n\n/** 对齐 `BorderStyleTypes` → Excel 的 `ST_BorderStyle` */\nconst BORDER_STYLE = [\n \"none\",\n \"thin\",\n \"hair\",\n \"dotted\",\n \"dashed\",\n \"dashDot\",\n \"dashDotDot\",\n \"double\",\n \"medium\",\n \"mediumDashed\",\n \"mediumDashDot\",\n \"mediumDashDotDot\",\n \"slantDashDot\",\n \"thick\",\n] as const\n\nconst H_ALIGN_NAME: Record<number, string> = {\n [H_ALIGN.LEFT]: \"left\",\n [H_ALIGN.CENTER]: \"center\",\n [H_ALIGN.RIGHT]: \"right\",\n [H_ALIGN.JUSTIFIED]: \"justify\",\n [H_ALIGN.BOTH]: \"justify\",\n [H_ALIGN.DISTRIBUTED]: \"distributed\",\n}\n\nconst V_ALIGN_NAME: Record<number, string> = {\n [V_ALIGN.TOP]: \"top\",\n [V_ALIGN.MIDDLE]: \"center\",\n [V_ALIGN.BOTTOM]: \"bottom\",\n}\n\n/** `ul.t` → Excel 的 `ST_UnderlineValues`。其余线型 Excel 没有,按单下划线写 */\nconst UNDERLINE_NAME: Record<number, string> = {\n [UNDERLINE.DOUBLE]: \"double\",\n [UNDERLINE.SINGLE_ACCOUNTING]: \"singleAccounting\",\n [UNDERLINE.DOUBLE_ACCOUNTING]: \"doubleAccounting\",\n}\n\nfunction underlineOf(s: StyleData): string | undefined {\n if (!s.ul?.s) return undefined\n return UNDERLINE_NAME[s.ul.t ?? UNDERLINE.SINGLE] ?? \"single\"\n}\n\n/** xlsx 的字体只有一个名字:没设 ff 时用东亚字体顶上,总比退成 Calibri 接近原貌 */\nfunction fontNameOf(s: StyleData): string {\n return s.ff ?? s.eastAsiaFontFamily ?? \"Calibri\"\n}\n\n/** 第一个可用的自定义数字格式 id。0-163 是 Excel 内建的,占了会被覆盖 */\nconst FIRST_CUSTOM_NUMFMT_ID = 164\n\ninterface Alignment {\n horizontal?: string\n vertical?: string\n wrapText?: boolean\n textRotation?: number\n shrinkToFit?: boolean\n}\n\nexport interface StyleTable {\n /**\n * 登记一份样式,拿到 `cellXfs` 下标。\n * `quotePrefix` 对应 Univer 的 `FORCE_STRING` —— Excel 用它压掉\n * 「以文本形式存储的数字」那个绿色小三角。\n */\n xf(style: StyleData | null | undefined, quotePrefix?: boolean): number\n xml(): string\n}\n\nexport function createStyleTable(defaultStyle?: StyleData | null): StyleTable {\n const numFmts = new Map<string, number>()\n const fonts = new Map<string, number>()\n const fills = new Map<string, number>()\n const borders = new Map<string, number>()\n const xfs = new Map<string, number>()\n\n const fontXml: string[] = []\n const fillXml: string[] = []\n const borderXml: string[] = []\n const xfXml: string[] = []\n\n // —— 缺省项,顺序不能动 ——\n // 字体 0 取工作簿默认样式:它是所有没显式设字体的单元格的实际外观\n fontXml.push(buildFont(defaultStyle ?? {}))\n fonts.set(fontKey(defaultStyle ?? {}), 0)\n fillXml.push('<fill><patternFill patternType=\"none\"/></fill>')\n fillXml.push('<fill><patternFill patternType=\"gray125\"/></fill>')\n borderXml.push(\"<border><left/><right/><top/><bottom/><diagonal/></border>\")\n borders.set(\"\", 0)\n xfXml.push('<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>')\n xfs.set(\"0|0|0|0||0\", 0)\n\n function fontKey(s: StyleData): string {\n return JSON.stringify([\n fontNameOf(s),\n s.fs ?? null,\n s.bl ?? 0,\n s.it ?? 0,\n underlineOf(s) ?? null,\n s.st?.s ?? 0,\n s.va ?? 0,\n toArgb(s.cl) ?? null,\n ])\n }\n\n function buildFont(s: StyleData): string {\n const parts: string[] = []\n // CT_Font 是有序序列:b, i, strike, u, vertAlign, sz, color, name\n if (s.bl) parts.push(\"<b/>\")\n if (s.it) parts.push(\"<i/>\")\n if (s.st?.s) parts.push(\"<strike/>\")\n const underline = underlineOf(s)\n if (underline) parts.push(`<u val=\"${underline}\"/>`)\n if (s.va === 1) parts.push('<vertAlign val=\"superscript\"/>')\n else if (s.va === 2) parts.push('<vertAlign val=\"subscript\"/>')\n parts.push(`<sz val=\"${s.fs ?? 11}\"/>`)\n const color = toArgb(s.cl)\n if (color) parts.push(`<color rgb=\"${color}\"/>`)\n parts.push(`<name val=\"${escapeAttr(fontNameOf(s))}\"/>`)\n return `<font>${parts.join(\"\")}</font>`\n }\n\n function fontId(s: StyleData): number {\n const key = fontKey(s)\n const hit = fonts.get(key)\n if (hit !== undefined) return hit\n const id = fontXml.length\n fontXml.push(buildFont(s))\n fonts.set(key, id)\n return id\n }\n\n function fillId(s: StyleData): number {\n const argb = toArgb(s.bg)\n if (!argb) return 0\n const hit = fills.get(argb)\n if (hit !== undefined) return hit\n const id = fillXml.length\n // bgColor indexed=\"64\" 是「无」的意思:solid 填充只认 fgColor,\n // 但缺了 bgColor 有些解析器(含 WPS 旧版)会把整块画成黑的\n fillXml.push(\n `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${argb}\"/><bgColor indexed=\"64\"/></patternFill></fill>`,\n )\n fills.set(argb, id)\n return id\n }\n\n function borderId(s: StyleData): number {\n const bd = s.bd\n if (!bd) return 0\n const key = JSON.stringify([\n [bd.l?.s ?? 0, toArgb(bd.l?.cl) ?? null],\n [bd.r?.s ?? 0, toArgb(bd.r?.cl) ?? null],\n [bd.t?.s ?? 0, toArgb(bd.t?.cl) ?? null],\n [bd.b?.s ?? 0, toArgb(bd.b?.cl) ?? null],\n ])\n if (key === \"[[0,null],[0,null],[0,null],[0,null]]\") return 0\n const hit = borders.get(key)\n if (hit !== undefined) return hit\n\n // CT_Border 同样是有序的:left, right, top, bottom, diagonal\n const side = (name: string, data: typeof bd.l): string => {\n const style = BORDER_STYLE[data?.s ?? 0]\n if (!data || !style || style === \"none\") return `<${name}/>`\n const argb = toArgb(data.cl)\n return argb\n ? `<${name} style=\"${style}\"><color rgb=\"${argb}\"/></${name}>`\n : `<${name} style=\"${style}\"/>`\n }\n const id = borderXml.length\n borderXml.push(\n `<border>${side(\"left\", bd.l)}${side(\"right\", bd.r)}${side(\"top\", bd.t)}${side(\"bottom\", bd.b)}<diagonal/></border>`,\n )\n borders.set(key, id)\n return id\n }\n\n function numFmtId(s: StyleData): number {\n const pattern = s.n?.pattern?.trim()\n // General 就是 0 号内建格式,不要为它造自定义格式\n if (!pattern || pattern.toLowerCase() === \"general\") return 0\n const hit = numFmts.get(pattern)\n if (hit !== undefined) return hit\n const id = FIRST_CUSTOM_NUMFMT_ID + numFmts.size\n numFmts.set(pattern, id)\n return id\n }\n\n function alignmentOf(s: StyleData): Alignment | undefined {\n const a: Alignment = {}\n if (s.ht && H_ALIGN_NAME[s.ht]) a.horizontal = H_ALIGN_NAME[s.ht]\n if (s.vt && V_ALIGN_NAME[s.vt]) a.vertical = V_ALIGN_NAME[s.vt]\n if (s.tb === WRAP.WRAP) a.wrapText = true\n if (s.stf === 1) a.shrinkToFit = true\n const angle = s.tr?.a\n if (s.tr?.v === 1) {\n // 255 是 Excel 约定的「竖排」,不是角度\n a.textRotation = 255\n } else if (typeof angle === \"number\" && angle !== 0) {\n // Excel 的编码:0-90 表示逆时针,91-180 表示顺时针 (值 - 90) 度\n const clamped = Math.max(-90, Math.min(90, Math.round(angle)))\n a.textRotation = clamped >= 0 ? clamped : 90 - clamped\n }\n return Object.keys(a).length ? a : undefined\n }\n\n function xf(style: StyleData | null | undefined, quotePrefix = false): number {\n const s = style ?? {}\n const nf = numFmtId(s)\n const font = fontId(s)\n const fill = fillId(s)\n const border = borderId(s)\n const align = alignmentOf(s)\n const key = `${nf}|${font}|${fill}|${border}|${align ? JSON.stringify(align) : \"\"}|${quotePrefix ? 1 : 0}`\n const hit = xfs.get(key)\n if (hit !== undefined) return hit\n\n const attrs = [\n `numFmtId=\"${nf}\"`,\n `fontId=\"${font}\"`,\n `fillId=\"${fill}\"`,\n `borderId=\"${border}\"`,\n 'xfId=\"0\"',\n ]\n // applyXxx 不是可有可无的:漏了它们,部分解析器(LibreOffice、部分在线预览)\n // 会认为该维度「沿用 cellStyleXfs 的缺省」,样式看着就丢了\n if (nf) attrs.push('applyNumberFormat=\"1\"')\n if (font) attrs.push('applyFont=\"1\"')\n if (fill) attrs.push('applyFill=\"1\"')\n if (border) attrs.push('applyBorder=\"1\"')\n if (align) attrs.push('applyAlignment=\"1\"')\n if (quotePrefix) attrs.push('quotePrefix=\"1\"')\n\n const body = align\n ? `<alignment${align.horizontal ? ` horizontal=\"${align.horizontal}\"` : \"\"}${\n align.vertical ? ` vertical=\"${align.vertical}\"` : \"\"\n }${align.wrapText ? ' wrapText=\"1\"' : \"\"}${\n align.textRotation !== undefined ? ` textRotation=\"${align.textRotation}\"` : \"\"\n }${align.shrinkToFit ? ' shrinkToFit=\"1\"' : \"\"}/>`\n : \"\"\n\n const id = xfXml.length\n xfXml.push(body ? `<xf ${attrs.join(\" \")}>${body}</xf>` : `<xf ${attrs.join(\" \")}/>`)\n xfs.set(key, id)\n return id\n }\n\n function xml(): string {\n const numFmtXml = [...numFmts.entries()]\n .map(([pattern, id]) => `<numFmt numFmtId=\"${id}\" formatCode=\"${escapeAttr(pattern)}\"/>`)\n .join(\"\")\n return (\n `${XML_DECL}<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">` +\n (numFmts.size ? `<numFmts count=\"${numFmts.size}\">${numFmtXml}</numFmts>` : \"\") +\n `<fonts count=\"${fontXml.length}\">${fontXml.join(\"\")}</fonts>` +\n `<fills count=\"${fillXml.length}\">${fillXml.join(\"\")}</fills>` +\n `<borders count=\"${borderXml.length}\">${borderXml.join(\"\")}</borders>` +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n `<cellXfs count=\"${xfXml.length}\">${xfXml.join(\"\")}</cellXfs>` +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>' +\n '<dxfs count=\"0\"/>' +\n \"</styleSheet>\"\n )\n }\n\n return { xf, xml }\n}\n","/**\n * Univer 快照 → xlsx 的各个 XML 部件。\n *\n * 纯函数、无 DOM、无引擎依赖:Node 里拿一份 JSON 就能出文件,\n * 不需要把 871KB 的 Univer 渲染引擎拉起来。\n *\n * **能保住的**:多工作表、值与类型、公式(含共享公式、数组公式、动态数组与缓存值)、\n * 1904 日期系统、数字格式、字体/颜色/填充/边框/对齐/换行/旋转/缩小字体填充、会计用下划线、\n * 合并单元格、行高列宽、隐藏行列、冻结窗格、网格线开关、标签颜色、工作表隐藏与深度隐藏、\n * 工作表背景图(data URL 形式的)。\n *\n * **保不住的**:图片、图表、透视表、条件格式、数据校验、筛选、批注、超链接。\n * 它们不在 `cellData` 里,而是各插件自己序列化进 `resources` 的私有结构 ——\n * 逐个反解等于把 Univer 的插件模型抄一遍。所以这里不假装支持,\n * 而是扫一遍 `resources` **如实报告丢了什么**(见 `warnings`),\n * 让宿主能把话原样告诉用户,而不是让人打开文件才发现。\n */\n\nimport { numericKeys, richTextToPlain } from \"./cell.ts\"\nimport { dataUrlToImage, imageMimeOf } from \"./media.ts\"\nimport { createStyleTable } from \"./styles.ts\"\nimport {\n CELL_TYPE,\n type CellData,\n type CellRange,\n FORMULA_TYPE,\n type StyleData,\n type WorkbookData,\n type WorksheetData,\n} from \"./types.ts\"\nimport {\n cellRef,\n columnName,\n escapeAttr,\n escapeXml,\n parseRange,\n pxToColumnWidth,\n pxToPoints,\n toArgb,\n XML_DECL,\n} from \"./xml.ts\"\n\nexport interface SerializeXlsxOptions {\n /**\n * 是否写入公式的缓存值,默认 true。\n *\n * 关掉的话单元格只剩 `<f>`,Excel 打开时自己重算 —— 值一定是对的,\n * 但在**不重算的**消费方(网页预览、pandas、部分在线表格)里会显示成空。\n * 开着则 Univer 算出来的值直接可见,代价是 Univer 与 Excel 的函数实现\n * 有差异时会先看到 Univer 的结果,直到用户在 Excel 里触发重算。\n */\n cachedFormulaValues?: boolean\n /** docProps 里的作者 */\n creator?: string\n /** docProps 里的时间。传固定值可得到逐字节确定的产物(测试用) */\n created?: Date\n}\n\nexport interface SerializeXlsxResult {\n /** zip 条目:路径 → 内容 */\n files: Record<string, Uint8Array>\n /** 导出时丢掉/降级了什么。**要展示给用户**,别吞 */\n warnings: string[]\n /** 计数,用于量化保真度 */\n stats: Record<string, number>\n}\n\n/** `resources` 里的插件名 → 人话。用户看得懂才算报告 */\nconst RESOURCE_LABELS: Record<string, string> = {\n SHEET_DRAWING_PLUGIN: \"图片与图表\",\n SHEET_CONDITIONAL_FORMATTING_PLUGIN: \"条件格式\",\n SHEET_DATA_VALIDATION_PLUGIN: \"数据校验\",\n SHEET_FILTER_PLUGIN: \"筛选\",\n SHEET_SORT_PLUGIN: \"排序状态\",\n SHEET_HYPER_LINK_PLUGIN: \"超链接\",\n SHEET_NOTE_PLUGIN: \"批注\",\n SHEET_THREAD_COMMENT_BASE_PLUGIN: \"评论\",\n SHEET_TABLE_PLUGIN: \"表格样式(Table)\",\n SHEET_DEFINED_NAME_PLUGIN: \"定义名称\",\n SHEET_RANGE_PROTECTION_PLUGIN: \"区域保护\",\n SHEET_WORKSHEET_PROTECTION_PLUGIN: \"工作表保护\",\n}\n\n/** Excel 不接受的工作表名字符 */\nconst BAD_SHEET_NAME = /[\\\\/?*[\\]:]/g\n\n/** 快照的 `hidden` → workbook.xml 里 `<sheet state>` */\nconst SHEET_STATE: Record<number, string> = { 1: \"hidden\", 2: \"veryHidden\" }\n\nconst RELS_NS = 'xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"'\nconst MAIN_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\nconst DOC_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n\n/**\n * 动态数组的元数据,Excel 365 写出来就是这一份固定内容。\n * 单元格 `cm=\"1\"` 指向唯一那条 cellMetadata —— 没有它,同样的 t=\"array\" 会被当成老式 CSE 数组。\n */\nconst DYNAMIC_ARRAY_METADATA =\n `${XML_DECL}<metadata xmlns=\"${MAIN_NS}\" xmlns:xda=\"http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray\">` +\n '<metadataTypes count=\"1\"><metadataType name=\"XLDAPR\" minSupportedVersion=\"120000\" copy=\"1\" pasteAll=\"1\"' +\n ' pasteValues=\"1\" merge=\"1\" splitFirst=\"1\" rowColShift=\"1\" clearFormats=\"1\" clearComments=\"1\" assign=\"1\"' +\n ' coerce=\"1\" cellMeta=\"1\"/></metadataTypes>' +\n '<futureMetadata name=\"XLDAPR\" count=\"1\"><bk><extLst><ext uri=\"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}\">' +\n '<xda:dynamicArrayProperties fDynamic=\"1\" fCollapsed=\"0\"/></ext></extLst></bk></futureMetadata>' +\n '<cellMetadata count=\"1\"><bk><rc t=\"1\" v=\"0\"/></bk></cellMetadata>' +\n \"</metadata>\"\n\nexport function serializeXlsx(\n workbook: WorkbookData,\n options: SerializeXlsxOptions = {},\n): SerializeXlsxResult {\n const { cachedFormulaValues = true, creator = \"@4399ywkf/editor\", created = new Date() } = options\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 richTextFlattened: 0,\n }\n\n const encoder = new TextEncoder()\n const files: Record<string, Uint8Array> = {}\n const put = (path: string, xml: string) => {\n files[path] = encoder.encode(xml)\n }\n\n const styleMap = workbook.styles ?? {}\n const resolveStyle = (s: StyleData | string | null | undefined): StyleData | undefined => {\n if (!s) return undefined\n if (typeof s === \"string\") return styleMap[s] ?? undefined\n return s\n }\n const styles = createStyleTable(resolveStyle(workbook.defaultStyle))\n\n // 共享字符串表。字符串走 sst 而不是 inlineStr:重复文本(同一列的枚举值)\n // 在真实表格里占比极高,去重后文件常小一个量级\n const sst = new Map<string, number>()\n const sstOrder: string[] = []\n let sstTotal = 0\n const stringIndex = (text: string): number => {\n sstTotal++\n const hit = sst.get(text)\n if (hit !== undefined) return hit\n const id = sstOrder.length\n sst.set(text, id)\n sstOrder.push(text)\n return id\n }\n\n /* ---------------------------- 工作表 ---------------------------- */\n\n const order = (\n workbook.sheetOrder?.length ? workbook.sheetOrder : Object.keys(workbook.sheets ?? {})\n ).filter((id) => workbook.sheets?.[id])\n\n const sheets: Array<{ name: string; state?: string; path: string }> = []\n const usedNames = new Set<string>()\n\n const safeName = (raw: string | undefined, index: number): string => {\n let name = (raw ?? \"\").replace(BAD_SHEET_NAME, \"\")\n if (name.startsWith(\"'\") || name.endsWith(\"'\")) name = name.replace(/^'+|'+$/g, \"\")\n if (!name.trim()) name = `Sheet${index + 1}`\n if (name.length > 31) name = name.slice(0, 31)\n let unique = name\n let n = 2\n // Excel 的工作表名不区分大小写地唯一\n while (usedNames.has(unique.toLowerCase())) {\n const suffix = `(${n++})`\n unique = `${name.slice(0, 31 - suffix.length)}${suffix}`\n }\n usedNames.add(unique.toLowerCase())\n if (unique !== raw) {\n warnings.push(`工作表名「${raw ?? \"\"}」不被 Excel 接受,已改成「${unique}」`)\n }\n return unique\n }\n\n /** 用到的图片扩展名,[Content_Types].xml 要逐个声明 */\n const imageExts = new Set<string>()\n let dynamicArrays = 0\n let dataTableCells = 0\n\n order.forEach((sheetId, index) => {\n const sheet = workbook.sheets?.[sheetId] as WorksheetData\n const name = safeName(sheet.name, index)\n const path = `xl/worksheets/sheet${index + 1}.xml`\n sheets.push({ name, state: SHEET_STATE[sheet.hidden ?? 0], path })\n put(path, buildSheetXml(sheet, index, name))\n stats.sheets++\n })\n\n // Excel 不接受零工作表的工作簿\n if (!sheets.length) {\n sheets.push({ name: \"Sheet1\", path: \"xl/worksheets/sheet1.xml\" })\n put(\"xl/worksheets/sheet1.xml\", buildSheetXml({}, 0, \"Sheet1\"))\n stats.sheets++\n }\n\n /** 背景图落成 xl/media 里的文件 + 本表的关系,返回 `<picture>`;导不出就点名并返回空串 */\n function backgroundPictureXml(sheet: WorksheetData, index: number, name: string): string {\n const bg = sheet.backgroundImage\n if (!bg?.source) return \"\"\n const image = bg.imageSourceType === \"BASE64\" ? dataUrlToImage(bg.source) : undefined\n if (!image) {\n warnings.push(\n bg.imageSourceType === \"BASE64\"\n ? `工作表「${name}」的背景图格式不支持(只认 png / jpg / gif / bmp),未随 xlsx 导出`\n : `工作表「${name}」的背景图是${bg.imageSourceType === \"URL\" ? \"外链地址\" : \"图床里的图片\"},` +\n \"导出不联网取图,未随 xlsx 导出\",\n )\n return \"\"\n }\n const file = `background${index + 1}.${image.ext}`\n files[`xl/media/${file}`] = image.bytes\n imageExts.add(image.ext)\n put(\n `xl/worksheets/_rels/sheet${index + 1}.xml.rels`,\n `${XML_DECL}<Relationships ${RELS_NS}>` +\n `<Relationship Id=\"rId1\" Type=\"${DOC_REL}/image\" Target=\"../media/${file}\"/>` +\n \"</Relationships>\",\n )\n stats.backgroundImages = (stats.backgroundImages ?? 0) + 1\n return '<picture r:id=\"rId1\"/>'\n }\n\n function buildSheetXml(sheet: WorksheetData, index: number, name: string): string {\n const cellData = sheet.cellData ?? {}\n const rowData = sheet.rowData ?? {}\n const columnData = sheet.columnData ?? {}\n const sheetDefault = resolveStyle(sheet.defaultStyle)\n const merges = (sheet.mergeData ?? []).filter(\n (m) => m && (m.endRow > m.startRow || m.endColumn > m.startColumn),\n )\n\n // 有内容的行 ∪ 只设了行高/隐藏/样式的行\n const rows = [...new Set([...numericKeys(cellData), ...numericKeys(rowData)])].sort(\n (a, b) => a - b,\n )\n\n let maxRow = -1\n let maxCol = -1\n const track = (r: number, c: number) => {\n if (r > maxRow) maxRow = r\n if (c > maxCol) maxCol = c\n }\n\n /* 共享公式:Univer 用字符串 si 分组,组里只有一个单元格带 f。\n 不还原的话,填充出来的一整列公式会退化成纯数值 —— 用户改了源数据就不再联动。\n Excel 要求 master 位于 ref 区域的左上角,不满足就退回逐格写普通公式。 */\n const groups = new Map<\n string,\n {\n master?: { row: number; col: number; f: string }\n minR: number\n maxR: number\n minC: number\n maxC: number\n }\n >()\n for (const r of numericKeys(cellData)) {\n for (const c of numericKeys(cellData[r])) {\n const cell = cellData[r]?.[c]\n const si = cell?.si\n if (!si) continue\n const g = groups.get(si) ?? { minR: r, maxR: r, minC: c, maxC: c }\n g.minR = Math.min(g.minR, r)\n g.maxR = Math.max(g.maxR, r)\n g.minC = Math.min(g.minC, c)\n g.maxC = Math.max(g.maxC, c)\n if (cell?.f) g.master = { row: r, col: c, f: cell.f }\n groups.set(si, g)\n }\n }\n const sharedIndex = new Map<string, number>()\n for (const [si, g] of groups) {\n if (!g.master) {\n warnings.push(`共享公式组 ${si} 在快照里找不到源格,组内单元格只保留静态值`)\n continue\n }\n if (g.master.row !== g.minR || g.master.col !== g.minC) {\n warnings.push(\n `共享公式组 ${si} 的源格不在区域左上角(Excel 不允许),源格按普通公式写出,其余单元格只保留静态值`,\n )\n continue\n }\n sharedIndex.set(si, sharedIndex.size)\n }\n\n /* 数组公式:源格写 <f t=\"array\" ref>,区域里其余格只写缓存值 —— Univer 的溢出格本来就是纯值。\n Excel 不许数组区域里另有公式、也不许和合并单元格相交,碰上就退回普通公式,否则文件判损坏 */\n const arrayRefs = new Map<string, string>()\n const arrayConflict = (range: CellRange, r0: number, c0: number): string | undefined => {\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (const c of numericKeys(cellData[r])) {\n if (c < range.startColumn || c > range.endColumn || (r === r0 && c === c0)) continue\n const other = cellData[r]?.[c]\n if (other?.f || other?.si) return `区域里的 ${cellRef(r, c)} 另有公式`\n }\n }\n const overlapsMerge = merges.some(\n (m) =>\n m.startRow <= range.endRow &&\n m.endRow >= range.startRow &&\n m.startColumn <= range.endColumn &&\n m.endColumn >= range.startColumn,\n )\n return overlapsMerge ? \"区域和合并单元格相交\" : undefined\n }\n for (const r of numericKeys(cellData)) {\n for (const c of numericKeys(cellData[r])) {\n const cell = cellData[r]?.[c]\n if (!cell?.f || !cell.ref || (cell.ft != null && cell.ft !== FORMULA_TYPE.ARRAY)) continue\n const range = parseRange(cell.ref)\n const reason =\n !range || range.startRow !== r || range.startColumn !== c\n ? `引用范围 ${cell.ref} 不以它为左上角`\n : arrayConflict(range, r, c)\n if (reason || !range) {\n warnings.push(\n `${cellRef(r, c)} 是数组公式,${reason},已降级成普通公式(区域内的值按静态值写出)`,\n )\n continue\n }\n arrayRefs.set(\n `${r},${c}`,\n `${cellRef(range.startRow, range.startColumn)}:${cellRef(range.endRow, range.endColumn)}`,\n )\n }\n }\n\n const rowXml: string[] = []\n for (const r of rows) {\n const cols = numericKeys(cellData[r])\n const meta = rowData[r]\n const cellXml: string[] = []\n\n for (const c of cols) {\n const cell = cellData[r]?.[c]\n if (!cell) continue\n const piece = buildCell(r, c, cell)\n if (piece) {\n cellXml.push(piece)\n track(r, c)\n }\n }\n\n const height = meta?.ia === 1 && meta?.ah ? meta.ah : meta?.h\n const rowStyle = resolveStyle(meta?.s)\n const attrs = [`r=\"${r + 1}\"`]\n if (height) attrs.push(`ht=\"${pxToPoints(height)}\"`, 'customHeight=\"1\"')\n if (meta?.hd === 1) attrs.push('hidden=\"1\"')\n if (rowStyle) attrs.push(`s=\"${styles.xf(rowStyle)}\"`, 'customFormat=\"1\"')\n // 空行只有在带格式信息(行高/隐藏/样式)时才值得写出来\n if (!cellXml.length && attrs.length === 1) continue\n rowXml.push(\n cellXml.length\n ? `<row ${attrs.join(\" \")}>${cellXml.join(\"\")}</row>`\n : `<row ${attrs.join(\" \")}/>`,\n )\n }\n\n function buildCell(r: number, c: number, cell: CellData): string {\n const ref = cellRef(r, c)\n const style = resolveStyle(cell.s) ?? sheetDefault\n const forceString = cell.t === CELL_TYPE.FORCE_STRING\n const styleIndex = style || forceString ? styles.xf(style, forceString) : 0\n const s = styleIndex ? ` s=\"${styleIndex}\"` : \"\"\n if (cell.ft === FORMULA_TYPE.DATA_TABLE) dataTableCells++\n\n const formula = cell.f?.replace(/^=/, \"\")\n if (formula || cell.si) {\n stats.cells++\n const si = cell.si ? sharedIndex.get(cell.si) : undefined\n const group = cell.si ? groups.get(cell.si) : undefined\n const arrayRef = arrayRefs.get(`${r},${c}`)\n let fXml = \"\"\n let cm = \"\"\n if (formula && si !== undefined && group) {\n const range = `${cellRef(group.minR, group.minC)}:${cellRef(group.maxR, group.maxC)}`\n fXml = `<f t=\"shared\" ref=\"${range}\" si=\"${si}\">${escapeXml(formula)}</f>`\n stats.formulas++\n stats.sharedFormulas++\n } else if (formula && arrayRef) {\n fXml = `<f t=\"array\" ref=\"${arrayRef}\">${escapeXml(formula)}</f>`\n stats.formulas++\n stats.arrayFormulas = (stats.arrayFormulas ?? 0) + 1\n if (cell.fd === 1) {\n cm = ' cm=\"1\"'\n dynamicArrays++\n }\n } else if (formula) {\n fXml = `<f>${escapeXml(formula)}</f>`\n stats.formulas++\n } else if (si !== undefined) {\n fXml = `<f t=\"shared\" si=\"${si}\"/>`\n stats.sharedFormulas++\n }\n const cached = cachedFormulaValues ? formulaValue(cell) : \"\"\n // 公式格的 t 跟着缓存值走;纯数字不需要 t\n const t = cachedFormulaValues && typeof cell.v === \"string\" ? ' t=\"str\"' : \"\"\n return `<c r=\"${ref}\"${s}${t}${cm}>${fXml}${cached}</c>`\n }\n\n const rich = richTextToPlain(cell)\n if (rich !== undefined) {\n stats.cells++\n stats.richTextFlattened++\n return `<c r=\"${ref}\"${s} t=\"s\"><v>${stringIndex(rich)}</v></c>`\n }\n\n const v = cell.v\n if (v === undefined || v === null || v === \"\") {\n // 没值但有格式的格子仍要写出来,否则底色/边框会丢\n return styleIndex ? `<c r=\"${ref}\"${s}/>` : \"\"\n }\n\n stats.cells++\n if (typeof v === \"boolean\") return `<c r=\"${ref}\"${s} t=\"b\"><v>${v ? 1 : 0}</v></c>`\n if (typeof v === \"number\" && cell.t !== CELL_TYPE.FORCE_STRING && Number.isFinite(v)) {\n return `<c r=\"${ref}\"${s}><v>${v}</v></c>`\n }\n return `<c r=\"${ref}\"${s} t=\"s\"><v>${stringIndex(String(v))}</v></c>`\n }\n\n function formulaValue(cell: CellData): string {\n const v = cell.v\n if (v === undefined || v === null || v === \"\") return \"\"\n if (typeof v === \"boolean\") return `<v>${v ? 1 : 0}</v>`\n if (typeof v === \"number\") return Number.isFinite(v) ? `<v>${v}</v>` : \"\"\n return `<v>${escapeXml(String(v))}</v>`\n }\n\n /* ------------------------- 表级结构 ------------------------- */\n\n for (const m of merges) track(m.endRow, m.endColumn)\n stats.merges += merges.length\n const mergeXml = merges.length\n ? `<mergeCells count=\"${merges.length}\">${merges\n .map(\n (m) =>\n `<mergeCell ref=\"${cellRef(m.startRow, m.startColumn)}:${cellRef(m.endRow, m.endColumn)}\"/>`,\n )\n .join(\"\")}</mergeCells>`\n : \"\"\n\n const colsXml = numericKeys(columnData)\n .map((index) => {\n const col = columnData[index]\n if (!col) return \"\"\n const attrs = [`min=\"${index + 1}\"`, `max=\"${index + 1}\"`]\n if (col.w) attrs.push(`width=\"${pxToColumnWidth(col.w)}\"`, 'customWidth=\"1\"')\n if (col.hd === 1) attrs.push('hidden=\"1\"')\n const colStyle = resolveStyle(col.s)\n if (colStyle) attrs.push(`style=\"${styles.xf(colStyle)}\"`)\n return attrs.length > 2 ? `<col ${attrs.join(\" \")}/>` : \"\"\n })\n .filter(Boolean)\n .join(\"\")\n\n const freeze = sheet.freeze\n const xSplit = Math.max(0, freeze?.xSplit ?? 0)\n const ySplit = Math.max(0, freeze?.ySplit ?? 0)\n const paneXml =\n xSplit || ySplit\n ? `<pane${xSplit ? ` xSplit=\"${xSplit}\"` : \"\"}${ySplit ? ` ySplit=\"${ySplit}\"` : \"\"}` +\n ` topLeftCell=\"${cellRef(ySplit, xSplit)}\" activePane=\"${\n xSplit && ySplit ? \"bottomRight\" : xSplit ? \"topRight\" : \"bottomLeft\"\n }\" state=\"frozen\"/>`\n : \"\"\n\n const viewAttrs = ['workbookViewId=\"0\"']\n if (sheet.showGridlines === 0) viewAttrs.push('showGridLines=\"0\"')\n if (sheet.rightToLeft === 1) viewAttrs.push('rightToLeft=\"1\"')\n const sheetViewXml = `<sheetViews><sheetView ${viewAttrs.join(\" \")}>${paneXml}</sheetView></sheetViews>`\n\n const formatAttrs = [`defaultRowHeight=\"${pxToPoints(sheet.defaultRowHeight ?? 24)}\"`]\n if (sheet.defaultColumnWidth) {\n formatAttrs.push(`defaultColWidth=\"${pxToColumnWidth(sheet.defaultColumnWidth)}\"`)\n }\n\n const dimension = maxRow < 0 ? \"A1\" : `A1:${columnName(Math.max(maxCol, 0))}${maxRow + 1}`\n const tabColor = toArgb(sheet.tabColor)\n const sheetPr = tabColor ? `<sheetPr><tabColor rgb=\"${tabColor}\"/></sheetPr>` : \"\"\n\n // 元素顺序是 schema 规定的:sheetPr → dimension → sheetViews → sheetFormatPr\n // → cols → sheetData → mergeCells → picture。顺序错了 Excel 判文件损坏\n return (\n `${XML_DECL}<worksheet xmlns=\"${MAIN_NS}\" xmlns:r=\"${DOC_REL}\">` +\n sheetPr +\n `<dimension ref=\"${dimension}\"/>` +\n sheetViewXml +\n `<sheetFormatPr ${formatAttrs.join(\" \")}/>` +\n (colsXml ? `<cols>${colsXml}</cols>` : \"\") +\n `<sheetData>${rowXml.join(\"\")}</sheetData>` +\n mergeXml +\n backgroundPictureXml(sheet, index, name) +\n \"</worksheet>\"\n )\n }\n\n /* ------------------------- 工作簿与包 ------------------------- */\n\n const sheetEntries = sheets\n .map(\n (s, i) =>\n `<sheet name=\"${escapeAttr(s.name)}\" sheetId=\"${i + 1}\"${s.state ? ` state=\"${s.state}\"` : \"\"} r:id=\"rId${i + 1}\"/>`,\n )\n .join(\"\")\n\n if (dataTableCells) {\n warnings.push(\n `${dataTableCells} 个模拟运算表(数据表)单元格按静态值导出:快照里没有模拟运算表的定义`,\n )\n }\n\n put(\n \"xl/workbook.xml\",\n `${XML_DECL}<workbook xmlns=\"${MAIN_NS}\" xmlns:r=\"${DOC_REL}\">` +\n (workbook.dateSystem === \"date1904\" ? '<workbookPr date1904=\"1\"/>' : \"<workbookPr/>\") +\n `<sheets>${sheetEntries}</sheets>` +\n // 没写缓存值时必须让 Excel 打开就重算,否则整列公式显示成空白。\n // 写了缓存值就别加:fullCalcOnLoad 会把文件标脏,用户没改动也会被问「是否保存」\n (cachedFormulaValues ? \"\" : '<calcPr calcId=\"0\" fullCalcOnLoad=\"1\"/>') +\n \"</workbook>\",\n )\n\n const stylesRelId = sheets.length + 1\n const sstRelId = sheets.length + 2\n const metadataRelId = sheets.length + 3\n if (dynamicArrays) {\n put(\"xl/metadata.xml\", DYNAMIC_ARRAY_METADATA)\n stats.dynamicArrays = dynamicArrays\n }\n put(\n \"xl/_rels/workbook.xml.rels\",\n `${XML_DECL}<Relationships ${RELS_NS}>` +\n sheets\n .map(\n (s, i) =>\n `<Relationship Id=\"rId${i + 1}\" Type=\"${DOC_REL}/worksheet\" Target=\"worksheets/${s.path.split(\"/\").pop()}\"/>`,\n )\n .join(\"\") +\n `<Relationship Id=\"rId${stylesRelId}\" Type=\"${DOC_REL}/styles\" Target=\"styles.xml\"/>` +\n `<Relationship Id=\"rId${sstRelId}\" Type=\"${DOC_REL}/sharedStrings\" Target=\"sharedStrings.xml\"/>` +\n (dynamicArrays\n ? `<Relationship Id=\"rId${metadataRelId}\" Type=\"${DOC_REL}/sheetMetadata\" Target=\"metadata.xml\"/>`\n : \"\") +\n \"</Relationships>\",\n )\n\n put(\n \"xl/sharedStrings.xml\",\n `${XML_DECL}<sst xmlns=\"${MAIN_NS}\" count=\"${sstTotal}\" uniqueCount=\"${sstOrder.length}\">` +\n sstOrder.map((t) => `<si><t xml:space=\"preserve\">${escapeXml(t)}</t></si>`).join(\"\") +\n \"</sst>\",\n )\n\n // styles.xml 必须最后写:上面遍历单元格时还在往样式表里登记\n put(\"xl/styles.xml\", styles.xml())\n\n put(\n \"[Content_Types].xml\",\n `${XML_DECL}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n [...imageExts]\n .map((ext) => `<Default Extension=\"${ext}\" ContentType=\"${imageMimeOf(`x.${ext}`)}\"/>`)\n .join(\"\") +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n sheets\n .map(\n (s) =>\n `<Override PartName=\"/${s.path}\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`,\n )\n .join(\"\") +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\n '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>' +\n (dynamicArrays\n ? '<Override PartName=\"/xl/metadata.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\"/>'\n : \"\") +\n '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>' +\n '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>' +\n \"</Types>\",\n )\n\n put(\n \"_rels/.rels\",\n `${XML_DECL}<Relationships ${RELS_NS}>` +\n `<Relationship Id=\"rId1\" Type=\"${DOC_REL}/officeDocument\" Target=\"xl/workbook.xml\"/>` +\n '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' +\n `<Relationship Id=\"rId3\" Type=\"${DOC_REL}/extended-properties\" Target=\"docProps/app.xml\"/>` +\n \"</Relationships>\",\n )\n\n const iso = created.toISOString().replace(/\\.\\d+Z$/, \"Z\")\n put(\n \"docProps/core.xml\",\n `${XML_DECL}<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"` +\n ' xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\"' +\n ' xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' +\n `<dc:title>${escapeXml(workbook.name ?? \"\")}</dc:title>` +\n `<dc:creator>${escapeXml(creator)}</dc:creator>` +\n `<cp:lastModifiedBy>${escapeXml(creator)}</cp:lastModifiedBy>` +\n `<dcterms:created xsi:type=\"dcterms:W3CDTF\">${iso}</dcterms:created>` +\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${iso}</dcterms:modified>` +\n \"</cp:coreProperties>\",\n )\n\n put(\n \"docProps/app.xml\",\n `${XML_DECL}<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\"` +\n ' xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' +\n \"<Application>@4399ywkf/editor</Application>\" +\n `<TitlesOfParts><vt:vector size=\"${sheets.length}\" baseType=\"lpstr\">` +\n sheets.map((s) => `<vt:lpstr>${escapeXml(s.name)}</vt:lpstr>`).join(\"\") +\n \"</vt:vector></TitlesOfParts>\" +\n \"</Properties>\",\n )\n\n /* --------------------- 如实报告丢了什么 --------------------- */\n\n for (const res of workbook.resources ?? []) {\n const label = RESOURCE_LABELS[res.name]\n if (!label) continue\n // data 是插件自己的 JSON 字符串。空对象/空数组说明该插件其实没数据,别误报\n const payload = res.data?.trim()\n if (!payload || payload === \"{}\" || payload === \"[]\" || payload === \"null\") continue\n warnings.push(`${label}未随 xlsx 导出(Univer 把它存在插件数据里,不在单元格模型内)`)\n stats[`dropped:${res.name}`] = 1\n }\n\n return { files, warnings, stats }\n}\n","/**\n * `@4399ywkf/editor/xlsx` —— 表格导入导出。\n *\n * 和 `./docx` 同一套思路:**在本地转换,文档不出内网**,不依赖任何转换服务,\n * 也不引 SheetJS —— 打包只多出 fflate(本来就有)和这千把行 OOXML 拼装/解析。\n *\n * ```ts\n * import { downloadXlsx } from \"@4399ywkf/editor/xlsx\"\n *\n * // SheetView 的 onReady 给的就是 univerAPI\n * <DocumentView format=\"sheet\" onReady={(api) => (ref.current = api)} />\n * downloadXlsx(ref.current, \"年度报表.xlsx\")\n * ```\n *\n * 导入是反方向 —— File / Blob / URL 都收,`SheetView` 的 `source` 走的就是它:\n *\n * ```ts\n * import { importSheetSource } from \"@4399ywkf/editor/xlsx\"\n * const { workbook, warnings } = await importSheetSource(file)\n * univerAPI.createWorkbook(workbook)\n * ```\n *\n * 服务端 / 定时任务只有 JSON 也能用 —— 整条链路不碰 DOM:\n *\n * ```ts\n * import { xlsxFromSnapshot } from \"@4399ywkf/editor/xlsx\"\n * const { bytes, warnings } = xlsxFromSnapshot(snapshot)\n * ```\n *\n * `warnings` 一定要透给用户。Univer 把图片、条件格式、数据校验这些存在插件数据里,\n * 不在单元格模型内,导出必然丢;导入侧同理(drawing / pivot / comments 是独立部件)——\n * 打开文件才发现远比转换时被告知糟糕。\n */\n\nimport { zipSync } from \"fflate\"\n\nimport { type SerializeXlsxOptions, type SerializeXlsxResult, serializeXlsx } from \"./serialize.ts\"\nimport { toSnapshot } from \"./snapshot.ts\"\nimport type { WorkbookData } from \"./types.ts\"\n\nexport type { CsvParseOptions, CsvToSnapshotResult } from \"./csv-parse.ts\"\nexport { csvToSnapshot, parseCsv } from \"./csv-parse.ts\"\nexport type {\n ImportCsvOptions,\n ImportSheetResult,\n ImportSheetSourceResult,\n ImportXlsxOptions,\n} from \"./import.ts\"\nexport { importCsv, importSheetSource, importXlsx } from \"./import.ts\"\nexport type { ParseXlsxOptions, ParseXlsxResult, XlsxEntries } from \"./parse.ts\"\nexport { parseXlsx } from \"./parse.ts\"\nexport type { SerializeXlsxOptions, SerializeXlsxResult } from \"./serialize.ts\"\nexport { serializeXlsx } from \"./serialize.ts\"\nexport { snapshotFromUniver } from \"./snapshot.ts\"\nexport type {\n CellData,\n CellRange,\n CellValue,\n ColumnData,\n RowData,\n StyleData,\n WorkbookData,\n WorksheetData,\n} from \"./types.ts\"\n\nexport const XLSX_MIME = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n\nexport interface XlsxResult {\n bytes: Uint8Array\n /** 导出时丢掉/降级了什么。**请展示给用户** */\n warnings: string[]\n stats: Record<string, number>\n}\n\n/** 纯函数:Univer 快照 → .xlsx 字节。不依赖 DOM 与引擎,服务端 / 测试直接可用。 */\nexport function xlsxFromSnapshot(\n workbook: WorkbookData,\n options: SerializeXlsxOptions = {},\n): XlsxResult {\n const { files, warnings, stats }: SerializeXlsxResult = serializeXlsx(workbook, options)\n return { bytes: zipSync(files, { level: 6 }), warnings, stats }\n}\n\n/** Univer 实例或快照 → .xlsx 字节 */\nexport function exportXlsx(\n source: WorkbookData | unknown,\n options?: SerializeXlsxOptions,\n): XlsxResult {\n return xlsxFromSnapshot(toSnapshot(source), options)\n}\n\n/** Univer 实例或快照 → Blob,便于交给上传接口 */\nexport function xlsxBlob(source: WorkbookData | unknown, options?: SerializeXlsxOptions): Blob {\n return new Blob([exportXlsx(source, options).bytes as BlobPart], { type: XLSX_MIME })\n}\n\n/**\n * 触发浏览器下载。返回 warnings / stats —— 别丢,那是「这次导出丢了什么」的唯一出口。\n *\n * 只在浏览器里可用;Node 环境请用 `xlsxFromSnapshot` 自己落盘。\n */\nexport function downloadXlsx(\n source: WorkbookData | unknown,\n filename = \"工作簿.xlsx\",\n options?: SerializeXlsxOptions,\n): XlsxResult {\n const result = exportXlsx(source, options)\n if (typeof document === \"undefined\") {\n throw new Error(\"downloadXlsx 需要浏览器环境,服务端请改用 xlsxFromSnapshot\")\n }\n const url = URL.createObjectURL(new Blob([result.bytes as BlobPart], { type: XLSX_MIME }))\n const a = document.createElement(\"a\")\n a.href = url\n a.download = filename.endsWith(\".xlsx\") ? filename : `${filename}.xlsx`\n document.body.appendChild(a)\n a.click()\n a.remove()\n // 立刻 revoke 会让部分浏览器(Safari)来不及取数据\n setTimeout(() => URL.revokeObjectURL(url), 10_000)\n return result\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@4399ywkf/editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "4399 多格式文档编辑器:doc(tiptap) / sheet(univer) / pdf / pptx,含 docx·xlsx·csv 双向导入导出与 AI 可驱动的结构化编辑面(./doc-runtime、./sheet-runtime)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -103,13 +103,57 @@
|
|
|
103
103
|
"yjs": "^13.6.30"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
|
106
|
-
"@univerjs/
|
|
106
|
+
"@univerjs/preset-sheets-conditional-formatting": "^1.0.3",
|
|
107
|
+
"@univerjs/preset-sheets-core": "^1.0.3",
|
|
108
|
+
"@univerjs/preset-sheets-data-validation": "^1.0.3",
|
|
109
|
+
"@univerjs/preset-sheets-drawing": "^1.0.3",
|
|
110
|
+
"@univerjs/preset-sheets-filter": "^1.0.3",
|
|
111
|
+
"@univerjs/preset-sheets-find-replace": "^1.0.3",
|
|
112
|
+
"@univerjs/preset-sheets-hyper-link": "^1.0.3",
|
|
113
|
+
"@univerjs/preset-sheets-note": "^1.0.3",
|
|
114
|
+
"@univerjs/preset-sheets-sort": "^1.0.3",
|
|
115
|
+
"@univerjs/preset-sheets-table": "^1.0.3",
|
|
116
|
+
"@univerjs/preset-sheets-thread-comment": "^1.0.3",
|
|
117
|
+
"@univerjs/presets": "^1.0.3",
|
|
107
118
|
"pdfjs-dist": "^4.0.0 || ^5.0.0",
|
|
108
119
|
"pptx-preview": "^1.0.7",
|
|
109
120
|
"react": "^19.0.0",
|
|
110
121
|
"react-dom": "^19.0.0"
|
|
111
122
|
},
|
|
112
123
|
"peerDependenciesMeta": {
|
|
124
|
+
"@univerjs/preset-sheets-conditional-formatting": {
|
|
125
|
+
"optional": true
|
|
126
|
+
},
|
|
127
|
+
"@univerjs/preset-sheets-core": {
|
|
128
|
+
"optional": true
|
|
129
|
+
},
|
|
130
|
+
"@univerjs/preset-sheets-data-validation": {
|
|
131
|
+
"optional": true
|
|
132
|
+
},
|
|
133
|
+
"@univerjs/preset-sheets-drawing": {
|
|
134
|
+
"optional": true
|
|
135
|
+
},
|
|
136
|
+
"@univerjs/preset-sheets-filter": {
|
|
137
|
+
"optional": true
|
|
138
|
+
},
|
|
139
|
+
"@univerjs/preset-sheets-find-replace": {
|
|
140
|
+
"optional": true
|
|
141
|
+
},
|
|
142
|
+
"@univerjs/preset-sheets-hyper-link": {
|
|
143
|
+
"optional": true
|
|
144
|
+
},
|
|
145
|
+
"@univerjs/preset-sheets-note": {
|
|
146
|
+
"optional": true
|
|
147
|
+
},
|
|
148
|
+
"@univerjs/preset-sheets-sort": {
|
|
149
|
+
"optional": true
|
|
150
|
+
},
|
|
151
|
+
"@univerjs/preset-sheets-table": {
|
|
152
|
+
"optional": true
|
|
153
|
+
},
|
|
154
|
+
"@univerjs/preset-sheets-thread-comment": {
|
|
155
|
+
"optional": true
|
|
156
|
+
},
|
|
113
157
|
"@univerjs/presets": {
|
|
114
158
|
"optional": true
|
|
115
159
|
},
|
|
@@ -1 +0,0 @@
|
|
|
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-DGUNVCOM.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, 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/**\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 if (u && u.getAttribute(\"val\") !== \"none\") s.ul = { s: 1 }\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 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 * 数字格式、字体/颜色/填充/边框/对齐/换行/旋转、合并单元格、行高列宽、\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 { parseStylesXml } from \"./parse-styles.ts\"\nimport {\n CELL_TYPE,\n type CellData,\n type CellRange,\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 的遗产。序列号整体差 1462 天,\n // 而 Univer 按 1900 系统解释 —— 不悄悄换算(数字格式之外的数字分不清是不是日期)\n if (boolAttr(childOf(workbookRoot, \"workbookPr\"), \"date1904\")) {\n warnings.push(\"此文件使用 1904 日期系统,日期单元格会整体偏差约 4 年,请核对后手动调整\")\n }\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 // rId → 包内路径。Target 可能是相对 xl/ 的,也可能是从包根起的绝对路径\n const relTargets = new Map<string, string>()\n const relsDom = parseEntry(\"xl/_rels/workbook.xml.rels\")\n for (const rel of childrenOf(relsDom?.documentElement, \"Relationship\")) {\n const id = rel.getAttribute(\"Id\")\n const target = rel.getAttribute(\"Target\")\n if (!id || !target) continue\n relTargets.set(id, target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`)\n }\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 =\n el.getAttribute(\"r:id\") ??\n el.getAttributeNS?.(\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"id\",\n )\n // 找不到关系就按约定路径猜一次 —— 部分生成器的 rels 写得不规范\n const path = (rId && relTargets.get(rId)) || `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 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 })\n sheet.id = id\n sheet.name = name\n if (el.getAttribute(\"state\") === \"hidden\" || el.getAttribute(\"state\") === \"veryHidden\") {\n sheet.hidden = 1\n }\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\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 }\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\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}\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\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/** 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/** `<f>`:普通 / 共享(t=\"shared\")/ 数组(t=\"array\")公式 */\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 const ref = f.getAttribute(\"ref\")\n if (ref) cell.ref = ref\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"]}
|