从多个系统导出或人工录入的表格,常常混入重复记录:同一条记录被写入两次,同一项内容在相邻行重复出现。这些重复行会让求和、计数和透视结果偏高,也会让后续的筛选与核对难以进行。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端完成重复行删除,输入输出文件通过虚拟文件系统(VFS)管理,无需后端服务支持。
本文介绍三个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
删除工作表中的全部重复行
当整张表都按同一套字段记录时,只要两行的所有单元格内容完全相同,就可以判定为重复记录。直接调用 RemoveDuplicates() 会在整张工作表的已用区域内逐行比较,保留每组重复记录中首次出现的那一行,删除其余行,后续行随之向上移动。这种写法把首行也视为普通数据:首行会作为首次出现的一行保留,但与它完全相同的数据行会被当作重复行删除。
删除工作表中的全部重复行的写法与结果:
| 写法 | 得到的结果 |
|---|---|
sheet.RemoveDuplicates() |
在整张工作表的已用区域内比较所有列,保留首次出现的行,删除完全相同的后续行 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与 Excel 测试文件载入 VFS。 - 用
new Workbook()新建工作簿,再用workbook.LoadFromFile载入测试文件。 - 调用
workbook.Worksheets.get(0)取得第一张工作表。 - 调用
sheet.RemoveDuplicates(),删除整张工作表中所有列完全相同的重复行。 - 用
workbook.SaveToFile写出RemoveAllDuplicates.xlsx,再用workbook.Dispose释放资源并从 VFS 读取工作簿触发下载。
以下为完整的代码示例,演示如何删除工作表中的全部重复行:
function App() {
const removeAllDuplicates = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'RemoveDuplicateRows.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取第一张工作表
const sheet = workbook.Worksheets.get(0);
// 删除整张工作表中所有列完全相同的重复行
sheet.RemoveDuplicates();
// 将去重后的工作簿保存到 VFS
const outputFileName = 'RemoveAllDuplicates.xlsx';
workbook.SaveToFile({ fileName: outputFileName });
// 释放 workbook 对象以释放资源
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>在 React 中删除 Excel 重复行</h1>
<button id="remove-all-duplicates" onClick={removeAllDuplicates}>删除全部重复行</button>
</div>
);
}
export default App;
删除工作表中的全部重复行后的工作簿:

删除指定区域中的重复行
整表去重会处理已用区域内的所有数据,但有时只希望清理其中一段明细,例如一张工作表中同时放着两段互不相关的记录,只对其中一段去重。在调用时指定起止行列,就能把处理范围限定在起点与终点之间,区域之外的行不受影响,区域内的重复行仍按整行内容比较。行号与列号都从 1 开始计数,并且包含起点和终点。
删除指定区域中的重复行的写法与结果:
| 写法 | 得到的结果 |
|---|---|
sheet.RemoveDuplicates(startRow, startColumn, endRow, endColumn) |
只处理指定区域,删除该范围内完全相同的重复行 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与 Excel 测试文件载入 VFS。 - 用
new Workbook()新建工作簿,再用workbook.LoadFromFile载入测试文件。 - 调用
workbook.Worksheets.get(1)取得存放区域数据的第二张工作表。 - 调用
sheet.RemoveDuplicates(2, 1, 7, 5),只对第 2 行至第 7 行、第 1 列至第 5 列去重。 - 用
workbook.SaveToFile写出RemoveDuplicatesInRange.xlsx,再用workbook.Dispose释放资源并从 VFS 读取工作簿触发下载。
以下为完整的代码示例,演示如何删除指定区域中的重复行:
function App() {
const removeDuplicatesInRange = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'RemoveDuplicateRows.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取存放区域数据的第二张工作表
const sheet = workbook.Worksheets.get(1);
// 只删除第 2 行至第 7 行、第 1 列至第 5 列中的重复行
sheet.RemoveDuplicates(2, 1, 7, 5);
// 将去重后的工作簿保存到 VFS
const outputFileName = 'RemoveDuplicatesInRange.xlsx';
workbook.SaveToFile({ fileName: outputFileName });
// 释放 workbook 对象以释放资源
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>在 React 中删除 Excel 重复行</h1>
<button id="remove-duplicates-in-range" onClick={removeDuplicatesInRange}>删除区域内重复行</button>
</div>
);
}
export default App;
删除指定区域中的重复行后的工作簿:

按指定列和表头删除重复行
业务表中的重复往往不是整行相同,而是某些关键字段重复:多条明细共享同一个标识,其余字段各不相同,但按这几列统计时只应保留一条。在调用时声明首行是否为表头,并指定参与比较的列,就能按关键字段判断重复。注明首行为表头后,首行保留,不进入比较;列序号相对起始列计算,从 0 开始,[0, 1] 表示起始列及其右侧一列。
按指定列和表头删除重复行的写法与结果:
| 写法 | 得到的结果 |
|---|---|
sheet.RemoveDuplicates(startRow, startColumn, endRow, endColumn, hasHeaders, columnOffsets) |
保留表头,并按指定列判断重复 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与 Excel 测试文件载入 VFS。 - 用
new Workbook()新建工作簿,再用workbook.LoadFromFile载入测试文件。 - 调用
workbook.Worksheets.get(2)取得存放按列去重数据的第三张工作表。 - 调用
sheet.RemoveDuplicates(1, 1, 9, 5, true, [0, 1]),保留表头,并按客户与地区两列判断重复。 - 用
workbook.SaveToFile写出RemoveDuplicatesByColumns.xlsx,再用workbook.Dispose释放资源并从 VFS 读取工作簿触发下载。
以下为完整的代码示例,演示如何按指定列和表头删除重复行:
function App() {
const removeDuplicatesByColumns = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'RemoveDuplicateRows.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
// 获取存放按列去重数据的第三张工作表
const sheet = workbook.Worksheets.get(2);
// 保留首行表头,按客户与地区两列判断重复
sheet.RemoveDuplicates(1, 1, 9, 5, true, [0, 1]);
// 将去重后的工作簿保存到 VFS
const outputFileName = 'RemoveDuplicatesByColumns.xlsx';
workbook.SaveToFile({ fileName: outputFileName });
// 释放 workbook 对象以释放资源
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>在 React 中删除 Excel 重复行</h1>
<button id="remove-duplicates-by-columns" onClick={removeDuplicatesByColumns}>按列删除重复行</button>
</div>
);
}
export default App;
按指定列和表头删除重复行后的工作簿:

常见问题
隐藏行或筛选后的行会被删除吗
原因:RemoveDuplicates 只按单元格内容判断重复,不检查行的可见状态。手动隐藏的行、被筛选器隐藏的行都会照常参与比较;只要与其他行重复,就会被删除。保留下来的隐藏行则维持原来的隐藏状态。
解决:如果需要让某些行不参与判断,不能依靠隐藏或筛选来排除,只能缩小处理范围:把起止行列收窄到要处理的数据,或先把这些行复制到另一张工作表单独处理。
怎样知道删除了多少行
解决:调用前后各读一次工作表的 LastRow,两次的差值就是删除的行数:
const before = sheet.LastRow;
sheet.RemoveDuplicates(1, 1, 9, 5, true, [0, 1]);
const removed = before - sheet.LastRow;
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







