XLSX

共享工作簿修订

通过修订日志(revisionHeaders、revisions、users)追踪共享工作簿的更改

共享工作簿的更改追踪会记录每位协作者所做的每一次编辑。本库无损地读写这三个修订部件,因此工作簿的完整修订历史在往返过程中得以保留。

部件

部件类型作用
xl/revisionHeaders.xmlCT_RevisionHeaders修订日志索引(每次保存的修订对应一条)
xl/revisions/revisionN.xmlCT_Revisions单个修订日志(实际的更改内容)
xl/users.xmlCT_Users编辑过该共享工作簿的用户

附加修订日志

WorkbookOptions 顶层设置 revisionLog。其结构对应这三个部件:

import { generateWorkbook } from "@office-open/xlsx";

await generateWorkbook({
  worksheets: [{ name: "Data", rows: [{ cells: [{ value: "Product" }] }] }],
  revisionLog: {
    headers: {
      guid: "{HDR}",
      revisionId: 1,
      version: 2,
      headers: [
        {
          guid: "{H1}",
          dateTime: "2026-06-19T10:00:00Z",
          userName: "Alice",
          rId: "rId1",
          maxSheetId: 1,
          sheetIds: [1],
        },
      ],
    },
    logs: [
      {
        revisions: [
          {
            type: "cellChange",
            data: {
              rId: 1,
              sheetId: 1,
              newCellXml: `<nc r="A1" t="inlineStr"><is><t>foo</t></is></nc>`,
            },
          },
          {
            type: "comment",
            data: {
              sheetId: 1,
              cell: "B2",
              guid: "{CMT}",
              action: "add",
              author: "Alice",
              newLength: 5,
            },
          },
        ],
      },
    ],
    users: { users: [{ guid: "{U}", name: "Alice", id: 1, dateTime: "2026-06-19T10:00:00Z" }] },
  },
});

logs[i] 通过其 rIdheaders.headers[i] 对应。

SharedWorkbookOptions

字段类型说明
headersRevisionHeadersOptionsxl/revisionHeaders.xml
logsRevisionLogOptions[]每条 header 对应一个修订日志
usersUsersOptionsxl/users.xml(可选)

修订头

RevisionHeadersOptions 包含集合元数据(guidrevisionIdversiontrackRevisionspreserveHistory 等)以及一个 headers[] 数组。每个 RevisionHeaderEntry 记录一次修订:guiddateTimeuserNamerIdmaxSheetIdsheetIds[]

修订条目

每个日志的 revisions[] 是以 type 区分的联合类型,共支持十二种修订类型:

rowColumn · move · customView · sheetRename · insertSheet · cellChange · formatting · autoFormatting · definedName · comment · queryTableField · conflict

{ type: "cellChange",  data: { rId, sheetId, newCellXml, oldCellXml?, … } }
{ type: "comment",     data: { sheetId, cell, guid, author, action?,} }
{ type: "insertSheet", data: { rId, sheetId, name, sheetPosition,} }

原始 XML 字段

携带单元格或差异格式数据(cellChangeformatting 等)的修订条目,会将内嵌的 CT_Cellnc/oc)与 CT_Dxfndxf/odxf/dxf)内容以原始 XML 字符串形式存储——newCellXmloldCellXmlnewDxfXmloldDxfXmldxfXml。这些内容模型庞大,而往返仅需无损保留,因此以原始形式透传而非重新构造。

往返

parseWorkbook 会将这三个部件读回相同的 revisionLog 结构,因此 parse → generate 可保留完整的修订历史。

Copyright © 2026