XLSX

补丁修改

通过替换占位符、字面文本或元数据修改已有的 .xlsx 文件

通过三种方式修补已有的 .xlsx 模板:替换单元格中的 {{占位符}} 标记、查找并替换字面文本,或覆盖文档元数据。

patchWorkbook

替换已有 .xlsx 文件中的占位符:

import { patchWorkbook } from "@office-open/xlsx";
import { readFileSync, writeFileSync } from "node:fs";

const result = await patchWorkbook({
  outputType: "nodebuffer",
  data: readFileSync("template.xlsx"),
  placeholders: {
    name: "张三",
    amount: 1500,
    date: new Date("2024-12-31"),
  },
});

writeFileSync("output.xlsx", result);

工作原理

修补器扫描每个工作表中匹配占位符模式(默认 {{key}})的单元格,查找范围包括共享字符串表、内联字符串和打印页眉页脚。跨多个运行(因格式拆分)的占位符会被自动处理。

占位符值

每个占位符是普通标量 —— stringnumberbooleanDate

placeholders: {
  name: "Alice",                          // 字符串
  quantity: 42,                           // 数字
  active: true,                           // 布尔值
  deadline: new Date("2024-12-31"),       // 日期
}

当占位符独占整个单元格内容时,修补会把单元格重写为对应类型化值:

值类型结果单元格
string文本替换(单元格保持字符串)
number数值单元格(<v>,无 t,默认数值)
boolean布尔单元格(t="b"<v>1/0
Date数值单元格,存放 Excel 序列日期

当占位符嵌在更大的文本中(如 总计: {{amount}})时,值作为文本替换,单元格保持字符串。

查找与替换

替换字面文本,无需分隔符 — 键按字面值匹配。作用于单元格值和打印页眉页脚:

const result = await patchWorkbook({
  outputType: "nodebuffer",
  data: templateBuffer,
  findReplace: {
    "Acme Corp": "Globex Inc.",
    Draft: "Final",
  },
});

核心属性

覆盖文档元数据(docProps/core.xml),与现有值合并:

const result = await patchWorkbook({
  outputType: "nodebuffer",
  data: templateBuffer,
  coreProperties: { title: "Q4 报告", creator: "张三" },
});

工作表

追加新工作表,或按工作表名替换现有工作表。每项复用 generateWorkbook 完整的 WorksheetOptions 词汇:

const result = await patchWorkbook({
  outputType: "nodebuffer",
  data: templateBuffer,
  worksheets: {
    append: [
      {
        name: "汇总",
        rows: [{ cells: [{ reference: "A1", value: "追加的工作表" }] }],
      },
    ],
    replace: {
      Sheet1: { rows: [{ cells: [{ reference: "A1", value: "已替换" }] }] },
    },
  },
});

共享字符串表会先从模板重建,因此追加和替换的工作表会在正确的偏移处继续索引字符串 — 现有的单元格引用保持有效。追加的工作表会接入 workbook.xml、工作簿关系和 [Content_Types].xml。追加行的单元格样式不受支持 — 只能引用模板中已存在的样式。

批注

向现有工作表追加单元格批注(备注),以工作表名为键。每条批注复用 generateWorkbookCommentOptions 词汇(见)— cellauthortext

const result = await patchWorkbook({
  outputType: "nodebuffer",
  data: templateBuffer,
  comments: {
    Report: [
      { cell: "B2", author: "Alice", text: "高于目标" },
      { cell: "B3", author: "Bob", text: "需跟进" },
    ],
  },
});

工作表上的现有批注会保留 — 新批注被追加,作者被重新收集,当相关 part 为新建时才添加工作表关系、VML 绘图和 content-type 接线。

自定义分隔符

默认分隔符为 {{}}。可通过 placeholderDelimiters 修改:

await patchWorkbook({
  outputType: "nodebuffer",
  data: templateBuffer,
  placeholders: { name: "John" },
  placeholderDelimiters: { start: "<<", end: ">>" },
});

输出类型

outputType 参数控制返回类型:

outputType返回值
"nodebuffer"Buffer
"uint8array"Uint8Array
"arraybuffer"ArrayBuffer
"base64"string
"blob"Blob
"string"string

选项

选项类型默认值说明
outputTypestring输出格式(见上表)
dataBuffer | Uint8Array | ...输入 .xlsx 文件数据
placeholdersRecord<string, ScalarValue>分隔符包裹的占位符 → 值(string | number | boolean | Date
findReplaceRecord<string, ScalarValue>字面查找字符串 → 值(无分隔符)
corePropertiesPartial<CorePropertiesOptions>核心元数据覆盖,与现有值合并
worksheets{ append?, replace? }追加工作表,或按工作表名替换
commentsRecord<string, CommentOptions[]>按工作表名追加单元格批注(与现有合并)
placeholderDelimiters{ start: string, end: string}{ start: "{{", end: "}}" }自定义占位符分隔符

提示

  • 所有工作表、共享字符串和打印页眉页脚中的占位符都会被替换。
  • 替换值时会保留原始单元格的样式。
  • 当占位符独占整个单元格时,numberbooleanDate 会成为真正的类型化单元格(而非字符串化副本)。
  • placeholdersfindReplace 共享同一引擎;可在一次调用中同时使用。
Copyright © 2026