在多人协作编辑 Excel 文档时,开启"跟踪修订"(Track Changes)后,每个用户对单元格的插入、修改和删除都会被记录下来。当审阅人员处理这些改动时,往往需要接受全部修订(将他人的改动正式合并进文档)或拒绝全部修订(撤销全部改动,恢复到修改前的状态)。手动在 Excel 中逐条处理既繁琐又容易遗漏,而在 Web 应用中通过代码批量处理则高效得多。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成此操作,通过虚拟文件系统(VFS)管理输入输出文件,无需后端服务支持。
Spire.XLS for JavaScript 通过工作簿对象提供修订处理能力:加载包含修订记录的工作簿后,调用 AcceptAllTrackedChanges() 方法即可接受文档中的所有修订,调用 RejectAllTrackedChanges() 方法即可拒绝文档中的所有修订。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
接受 Excel 中的所有修订
当一个包含修订记录的工作簿经多人编辑、审阅通过后,需要把所有的改动正式合并进文档,也就是"接受修订"。接受修订后,改动内容成为文档的正式内容,修订记录随之清除。具体操作步骤如下:
- 创建一个
Workbook对象。 - 通过
Workbook.LoadFromFile()方法加载包含修订记录的工作簿。 - 调用
Workbook.AcceptAllTrackedChanges()方法接受文档中的所有修订。 - 通过
Workbook.SaveToFile()方法保存工作簿。
下面是一个完整的代码示例,展示了在 React 中接受 Excel 工作簿中的所有修订:
function App() {
const acceptTrackedChanges = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'TrackChanges.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 创建 Workbook 对象并加载包含修订的工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 接受文档中的所有修订
workbook.AcceptAllTrackedChanges();
// 保存文档
const outputFileName = 'AcceptTrackedChanges_output.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放资源
workbook.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
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>Accept All Tracked Changes</h1>
<button onClick={acceptTrackedChanges}>
Start
</button>
</div>
);
}
export default App;
接受修订后的效果

拒绝 Excel 中的所有修订
当修订内容存在争议或不再需要时,审阅人员可以一次性拒绝全部修订,使文档恢复到修改前的状态。具体操作步骤如下:
- 创建一个
Workbook对象。 - 通过
Workbook.LoadFromFile()方法加载包含修订记录的工作簿。 - 调用
Workbook.RejectAllTrackedChanges()方法拒绝文档中的所有修订。 - 通过
Workbook.SaveToFile()方法保存工作簿。
下面是一个完整的代码示例,展示了在 React 中拒绝 Excel 工作簿中的所有修订:
function App() {
const rejectTrackedChanges = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体和 Excel 文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'TrackChanges.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 创建 Workbook 对象并加载包含修订的工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 拒绝文档中的所有修订
workbook.RejectAllTrackedChanges();
// 保存文档
const outputFileName = 'RejectTrackedChanges_output.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2010 });
// 释放资源
workbook.Dispose();
// 从 VFS 读取转换后的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
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>Reject All Tracked Changes</h1>
<button onClick={rejectTrackedChanges}>
Start
</button>
</div>
);
}
export default App;
拒绝修订后的效果

常见问题
拒绝修订后内容没有恢复到修改前的状态
原因:RejectAllTrackedChanges() 拒绝的是被"跟踪修订"记录下来的单元格改动。如果某些改动发生在启用跟踪修订之前,或者通过其他方式写入且未被记录,它们不会成为可拒绝的修订,处理后仍会保留当前值,因此文档不会完全恢复到最初的基线。
能否只接受或拒绝部分修订,而不是全部
原因:AcceptAllTrackedChanges() 与 RejectAllTrackedChanges() 对整个工作簿的修订进行整体处理,不提供按用户、时间或单元格区域筛选的单条处理接口。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







