共享工作簿修订
共享工作簿的更改追踪会记录每位协作者所做的每一次编辑。本库无损地读写这三个修订部件,因此工作簿的完整修订历史在往返过程中得以保留。
部件
| 部件 | 类型 | 作用 |
|---|---|---|
xl/revisionHeaders.xml | CT_RevisionHeaders | 修订日志索引(每次保存的修订对应一条) |
xl/revisions/revisionN.xml | CT_Revisions | 单个修订日志(实际的更改内容) |
xl/users.xml | CT_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] 通过其 rId 与 headers.headers[i] 对应。
SharedWorkbookOptions
| 字段 | 类型 | 说明 |
|---|---|---|
headers | RevisionHeadersOptions | xl/revisionHeaders.xml |
logs | RevisionLogOptions[] | 每条 header 对应一个修订日志 |
users | UsersOptions | xl/users.xml(可选) |
修订头
RevisionHeadersOptions 包含集合元数据(guid、revisionId、version、trackRevisions、preserveHistory 等)以及一个 headers[] 数组。每个 RevisionHeaderEntry 记录一次修订:guid、dateTime、userName、rId、maxSheetId 和 sheetIds[]。
修订条目
每个日志的 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 字段
携带单元格或差异格式数据(cellChange、formatting 等)的修订条目,会将内嵌的 CT_Cell(nc/oc)与 CT_Dxf(ndxf/odxf/dxf)内容以原始 XML 字符串形式存储——newCellXml、oldCellXml、newDxfXml、oldDxfXml、dxfXml。这些内容模型庞大,而往返仅需无损保留,因此以原始形式透传而非重新构造。
往返
parseWorkbook 会将这三个部件读回相同的 revisionLog 结构,因此 parse → generate 可保留完整的修订历史。