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

如何用Python openpyxl基于数组删除Excel工作表

问题分析与解决

你的代码现在有两个核心问题:

  1. 关键的删除工作表代码是注释状态,根本没执行;
  2. 就算取消注释,你在同一个tempWb对象上反复删除工作表,后续循环处理其他工作表时,原文件的工作表已经被删空了,肯定出问题。

另外还有几个小问题:

  • 多次重复初始化wsToRemoveNameArray,逻辑混乱;
  • 单工作表场景下,保存的文件名是str(tempWb.sheetnames),会生成类似['Sheet1']这种带括号的奇怪文件名,应该取列表第一个元素。

下面给两种可行的修复方案,都是基于openpyxl模块(你代码里用了load_workbook,默认是这个库):


方案一:创建新工作簿复制目标工作表(推荐)

这种方式不用处理删除操作,直接为每个工作表生成全新的工作簿,逻辑更清晰,不易出错:

from openpyxl import load_workbook, Workbook

def splitExcelFiles(InputPath, OutputPath, fileNameArray):
    for file_name in fileNameArray:
        temp_file_path = f"{InputPath}\\{file_name}"
        # 加载原始工作簿
        original_wb = load_workbook(temp_file_path)
        
        for sheet_name in original_wb.sheetnames:
            # 创建新工作簿
            new_wb = Workbook()
            # 删除新工作簿默认的空Sheet
            new_wb.remove(new_wb.active)
            
            # 把目标工作表复制到新工作簿
            target_sheet = original_wb[sheet_name]
            new_wb.copy_worksheet(target_sheet)
            
            # 保存文件,用工作表名作为新文件名
            save_path = f"{OutputPath}\\{sheet_name}.xlsx"
            new_wb.save(save_path)

方案二:重新加载原文件+删除多余工作表

如果坚持要用删除的方式,每次处理一个工作表都要重新加载原始文件,保证操作的是完整的工作簿:

from openpyxl import load_workbook

def splitExcelFiles(InputPath, OutputPath, fileNameArray):
    for file_name in fileNameArray:
        temp_file_path = f"{InputPath}\\{file_name}"
        
        # 遍历原始工作簿的所有工作表
        for sheet_name in load_workbook(temp_file_path).sheetnames:
            # 每次循环都重新加载原文件,避免之前的修改影响
            tempWb = load_workbook(temp_file_path)
            
            # 收集所有需要删除的工作表名称
            ws_to_remove = [name for name in tempWb.sheetnames if name != sheet_name]
            
            # 执行删除操作
            for name in ws_to_remove:
                del tempWb[name]
            
            # 保存文件
            save_path = f"{OutputPath}\\{sheet_name}.xlsx"
            tempWb.save(save_path)

关键修改说明

  • 用f-string拼接路径,比+号更简洁,还能避免转义字符的问题;
  • 直接遍历fileNameArray和sheetnames,不用range(len()),代码更简洁易读;
  • 方案一彻底避开了删除工作表的麻烦,复制的方式更稳定,尤其适合复杂格式的Excel文件。

内容的提问来源于stack exchange,提问作者igor2001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:15:33