You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:15:45