多人协作编写的 Word 文档通常以修订方式记录改动:插入的内容带下划线,删除的内容以删除线保留,格式调整同样留有标记。文档定稿时,需要对这些修订作出取舍。接受修订表示确认改动,插入的内容转为正文;拒绝修订表示撤销改动,文档恢复为修改前的状态。处理完成后,修订记录被清除,文档即可作为正式版本流转。
本文用 Spire.Doc for JavaScript 在浏览器中完成接受与拒绝修订。文档通过虚拟文件系统(VFS)加载,处理完成后保存并直接下载,整个过程基于 WebAssembly 在浏览器端运行,无需安装 Office,也不依赖后端服务。
本文介绍三个功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.Doc for JavaScript。下面的示例假定 Spire.Doc 已安装、WebAssembly 模块已初始化。
本文所用示例文档为一篇会议纪要,其中的插入、删除与替换均由审阅人在审阅过程中添加。
带有修订标记的会议纪要:

接受 Word 文档中的全部修订
接受 Word 文档中的全部修订时,调用 Document.AcceptChanges() 方法。该方法遍历文档中的修订记录,按修订类型分别处理,处理完成后文档中不再保留任何修订痕迹:
| 修订类型 | 接受后的结果 |
|---|---|
插入(RevisionType.Insertion) |
插入的内容保留,并转为正文 |
删除(RevisionType.Deletion) |
被删除的内容彻底移除 |
格式修改(RevisionType.FormatChange) |
采用修改后的格式 |
移动(RevisionType.Moving) |
内容保留在移动后的位置 |
示例文档中,审阅人将验证码有效期由 5 分钟改为 10 分钟,并将设计稿的提交时间由本周五改为下周三。下面的代码在加载该文档后接受全部修订,结果文件中插入的内容保留、删除的内容消失。
具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 使用
Document.AcceptChanges()方法接受文档中的全部修订。 - 使用
SaveToFile()保存结果文件。 - 从 VFS 读出结果文件并触发浏览器下载。
接受 Word 文档中的全部修订的代码如下:
function App() {
const acceptChanges = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('Sample.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('Sample.docx');
// 接受文档中的全部修订
doc.AcceptChanges();
// 保存结果文件
const outputFileName = 'AcceptChanges.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>接受 Word 文档中的全部修订</h1>
<button onClick={acceptChanges}>
接受修订
</button>
</div>
);
}
export default App;
接受 Word 文档中的全部修订后的文档:

拒绝 Word 文档中的全部修订
拒绝 Word 文档中的全部修订时,调用 Document.RejectChanges() 方法。该方法同样遍历文档中的修订记录,但处理方向相反:每一项修改都被撤销,文档回到修订产生之前的状态:
| 修订类型 | 拒绝后的结果 |
|---|---|
插入(RevisionType.Insertion) |
插入的内容被移除,文档恢复为插入前的状态 |
删除(RevisionType.Deletion) |
被删除的内容恢复为正文 |
格式修改(RevisionType.FormatChange) |
恢复为修改前的格式 |
移动(RevisionType.Moving) |
内容回到原来的位置 |
下面的代码加载同一篇会议纪要,在拒绝全部修订后保存,结果文件中的修改内容全部撤销,原文恢复。
具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 使用
Document.RejectChanges()方法拒绝文档中的全部修订。 - 使用
SaveToFile()保存结果文件。 - 从 VFS 读出结果文件并触发浏览器下载。
拒绝 Word 文档中的全部修订的代码如下:
function App() {
const rejectChanges = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('Sample.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('Sample.docx');
// 拒绝文档中的全部修订
doc.RejectChanges();
// 保存结果文件
const outputFileName = 'RejectChanges.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>拒绝 Word 文档中的全部修订</h1>
<button onClick={rejectChanges}>
拒绝修订
</button>
</div>
);
}
export default App;
拒绝 Word 文档中的全部修订后的文档:

判断文档中是否还有未处理的修订
判断文档中是否还有未处理的修订时,读取 Document.HasChanges 属性。该属性为只读,文档中存在修订记录时返回 true,接受或拒绝全部修订后返回 false。
在批量处理的场景中,该属性可用于决定是否需要执行接受或拒绝操作:先判断文档中是否存在修订,再按业务要求处理,可以避免对没有修订的文档重复写入。下面的代码在加载文档后读取该属性,仅在存在修订时接受全部修订,再保存结果。
具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 读取
Document.HasChanges属性,判断文档中是否还有未处理的修订。 - 存在修订时调用
Document.AcceptChanges()方法统一处理,随后保存结果文件。 - 从 VFS 读出结果文件并触发浏览器下载。
判断文档中是否还有未处理的修订的代码如下:
function App() {
const checkChanges = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('Sample.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('Sample.docx');
// 判断文档中是否还有未处理的修订
if (doc.HasChanges) {
// 存在修订时接受全部修订
doc.AcceptChanges();
}
// 处理完成后该属性变为 false
console.log(doc.HasChanges);
// 保存结果文件
const outputFileName = 'CheckChanges.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>判断文档中是否还有未处理的修订</h1>
<button onClick={checkChanges}>
检查修订
</button>
</div>
);
}
export default App;
常见问题
接受修订后,为什么打开文档仍能看到修订痕迹
接受修订修改的是内存中的文档对象;若没有保存结果文件,或打开的是原始文件而非处理后的文件,修订痕迹仍会保留在文档中。此外,Word 中的「显示标记」开关只控制修订的显示方式,不会改变文档中已保存的修订记录。处理完成后保存为新文件,再打开该文件确认修订是否已清除。
接受修订和拒绝修订有什么区别
接受修订确认审阅人的改动:插入的内容保留为正文,被删除的内容移除,格式修改采用修改后的结果。拒绝修订撤销这些改动:插入的内容移除,被删除的内容恢复,格式修改回到修改前的状态。两种操作都会清除文档中的修订记录,此后文档中不再区分审阅人与正文。
可以根据需要只接受或拒绝其中某一条修订吗
当前 JavaScript 绑定提供的是文档级的 Document.AcceptChanges() 与 Document.RejectChanges() 方法,Document 上不提供逐条读取修订的集合,也没有按单条修订接受或拒绝的接口。需要逐条取舍时,可在 Word 的审阅窗格中先行处理,再使用本文的方法统一接受或拒绝剩余的修订。
接受或拒绝修订后,修订的作者和时间信息还会保留吗
不会保留。接受或拒绝修订时,修订记录连同其中记录的作者与时间一并被清除,保存的文件中不再包含这些信息。若需要追溯修改来源,应在处理前保留原始文档,或将处理结果与原始文档分别存档。
文档中没有修订时调用 AcceptChanges() 会报错吗
不会报错。Document.AcceptChanges() 在文档不含修订记录时正常执行,文档内容保持不变,随后仍可正常保存。若希望在批量处理中跳过这类文档,可先读取 Document.HasChanges 属性进行判断。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







