如何使用ExcelJS删除Excel文件中的指定列
ExcelJS 删除工作表指定列实现方法
ExcelJS 官方未提供原生的单列删除API,删除指定列(如示例中的I列,对应列序号9,ExcelJS列计数从1开始,A列对应序号1)可通过以下两种方案实现,根据表格复杂度选择即可。
方案1:逐行平移单元格(适配带复杂格式的表格)
该方案兼容性最好,会同步保留单元格原有样式、格式、批注等属性,逻辑为遍历所有行,将目标列右侧的所有单元格依次左移一位,最后清除尾部冗余列。const ExcelJS = require('exceljs'); async function deleteColumn(filePath, targetColNum, savePath) { const wb = new ExcelJS.Workbook(); await wb.xlsx.readFile(filePath); wb.eachSheet(ws => { const maxCol = ws.columnCount; if (targetColNum > maxCol) return; // 处理合并单元格:先记录所有需要保留的合并区域偏移后的位置,取消全表合并后等单元格移动完成再重新合并 const mergeRanges = []; ws.model.merges.forEach(range => { const [start, end] = range.split(':'); const startCol = ws.getCell(start).col; const endCol = ws.getCell(end).col; // 直接跳过包含目标删除列的合并区域 if (startCol <= targetColNum && endCol >= targetColNum) return; // 计算偏移后的列位置 const newStartCol = startCol > targetColNum ? startCol - 1 : startCol; const newEndCol = endCol > targetColNum ? endCol - 1 : endCol; const startRow = ws.getCell(start).row; const endRow = ws.getCell(end).row; mergeRanges.push(`${ws.getCell(startRow, newStartCol).address}:${ws.getCell(endRow, newEndCol).address}`); }); ws.unMergeCells(); // 逐行移动单元格 ws.eachRow(row => { for (let col = targetColNum; col < maxCol; col++) { const srcCell = row.getCell(col + 1); const tgtCell = row.getCell(col); // 复制单元格值 tgtCell.value = srcCell.value; // 复制附属属性,纯数据场景可删除以下逻辑提升运行速度 tgtCell.style = {...srcCell.style}; tgtCell.comment = srcCell.comment; tgtCell.hyperlink = srcCell.hyperlink; tgtCell.dataValidation = srcCell.dataValidation; } // 清空最后一列的冗余内容 const lastCell = row.getCell(maxCol); lastCell.value = null; lastCell.style = {}; lastCell.comment = null; lastCell.hyperlink = null; }); // 裁剪列数组,移除尾部空列 ws.columns = ws.columns.slice(0, maxCol - 1); // 重新生效合并规则 mergeRanges.forEach(range => ws.mergeCells(range)); }); await wb.xlsx.writeFile(savePath); } // 调用示例:删除I列(对应列号为9) deleteColumn('./源文件.xlsx', 9, './处理后文件.xlsx');注意事项:
- 列号从1开始计数,删除其他列直接修改传入的列号参数即可,例如删除C列传3
- 纯数据表格可以删除样式、批注、超链接的复制逻辑,处理速度会提升30%以上
- 带合并单元格的场景一定要先处理合并规则,否则会出现单元格位置错乱、合并区域报错的问题
方案2:直接过滤列数组(适配纯数据无复杂格式的表格)
没有自定义样式、合并单元格、批注等特殊内容的普通结构化表格,可以直接操作worksheet.columns数组过滤目标列,代码更简洁:// 读取工作簿逻辑同方案1 ws.columns = ws.columns.filter((_, idx) => idx + 1 !== targetColNum);该方案执行速度最快,但不会同步迁移行级挂载的样式、批注等属性,仅适合纯导出数据的快速处理场景。
内容的提问来源于stack exchange,提问作者blabla blabla
相关产品推荐
相关产品推荐

