Node.js使用xlsx模块同时增删Excel行出现重复数据问题
问题描述
使用Node.js的xlsx模块操作Excel文件,单独调用删除行或插入行函数时功能正常,但同时调用两者时,会出现最后一条数据重复的异常,无法正常添加新数据。
测试数据:
let datos = [ { "Dato 1" : 1, "Dato 2" : 2, "Dato 3" : 3 }, { "Dato 1" : 4, "Dato 2" : 5, "Dato 3" : 6 }, { "Dato 1" : 7, "Dato 2" : 8, "Dato 3" : 9 } ]
核心问题表现:
- 仅调用插入函数:数据可正确写入
- 仅调用删除函数:可删除表头外所有数据
- 同时调用删除+插入:最终数据出现重复,不符合预期
问题原因
- 删除函数的循环逻辑缺陷:
deleteAllExcelRows采用从前往后的顺序删除行,删除一行后后续行会自动上移,导致部分行被跳过(例如删除行1后,原行2变为新行1,但循环下一个i=2时,实际操作的是原行3,漏掉了新行1)。即便单独删除时看似正常,实际可能存在残留数据,为后续插入重复埋下隐患。 - 插入函数的逻辑错误:
putDataExcel每次调用时,都会先读取当前工作表的所有数据转为JSON数组,追加新数据后再将整个数组写回工作表。这会导致每次插入时都重复写入之前的所有数据,最终造成数据重复。
解决方法
1. 修复删除循环逻辑
将deleteAllExcelRows的循环改为从后往前删除,避免行上移导致的漏删问题:
function deleteAllExcelRows(ws) { let numeroFilas = parseInt(xlsx.utils.decode_range(ws['!ref']).e.r) // 从最后一行开始往前删除,避免行上移漏删 for(let i = numeroFilas;i >=1;i--) { deleteExcelRow(ws,i); console.log("Dato " + i + " Eliminado ") } }
2. 简化插入逻辑,避免重复写入
不需要每次读取现有数据再追加,直接使用sheet_add_json的追加模式插入单条数据:
function putDataExcel(ws, data) { // origin: -1 表示追加到工作表末尾 xlsx.utils.sheet_add_json(ws, [data], { origin: -1 }); xlsx.writeFile(wb, FILENAME); }
同时修改调用插入函数的循环:
console.log("Put new data...\n"); for (let i = 0; i < datos.length; i++) { putDataExcel(woorksheet, datos[i]); }
3. 可选:高效批量删除所有数据
如果不需要逐行删除的日志,可直接重置工作表范围并清空数据单元格,效率更高:
function deleteAllExcelRows(ws) { const range = xlsx.utils.decode_range(ws['!ref']); // 仅保留表头行(行索引0) range.e.r = range.s.r; ws['!ref'] = xlsx.utils.encode_range(range); // 清空所有原数据单元格 const originalRowCount = parseInt(xlsx.utils.decode_range(ws['!ref']).e.r); for (let R = range.s.r + 1; R <= originalRowCount; R++) { for (let C = range.s.c; C <= range.e.c; C++) { delete ws[ec(R, C)]; } } xlsx.writeFile(wb, FILENAME); }
内容的提问来源于stack exchange,提问作者Harold Burbano
相关产品推荐
相关产品推荐

