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

使用openpyxl删除Worksheet时存在却报不存在的KeyError问题求助

问题解决:openpyxl删除工作表时的KeyError问题

错误原因

你的代码里这一行是核心问题:

std = wb.get_sheet_by_name(wb["Tabelle1"])

get_sheet_by_name()要求传入工作表名称的字符串,但你传的wb["Tabelle1"]已经是一个Worksheet对象了。openpyxl会把这个对象当作表名去查找,自然找不到对应的工作表,所以抛出KeyError。

另外补充:get_sheet_by_name()在openpyxl 2.4及以上版本已经被弃用,官方推荐直接用wb["工作表名称"]的方式获取工作表对象。

修正后的代码

根据你的需求,这里提供两种正确的写法:

写法1:直接通过下标获取工作表(推荐)

def delete_sheet_name(self, input, sheetname):
    wb: Workbook = openpyxl.load_workbook(input)
    
    # 直接通过表名字符串获取工作表对象
    std = wb["Tabelle1"]
    # 删除指定工作表
    wb.remove(std)
    
    wb.save(input)
    wb.close()

写法2:使用get_sheet_by_name(不推荐,已弃用)

如果你坚持要用这个方法,必须传入字符串名称:

def delete_sheet_name(self, input, sheetname):
    wb: Workbook = openpyxl.load_workbook(input)
    
    # 传入表名字符串
    std = wb.get_sheet_by_name("Tabelle1")
    wb.remove(std)
    
    wb.save(input)
    wb.close()

额外优化建议

从你代码里的循环来看,似乎想处理包含特定关键词的工作表?如果是要删除所有不含"Abschätzung"的工作表,可以这样写:

def delete_sheet_name(self, input, sheetname):
    wb: Workbook = openpyxl.load_workbook(input)
    
    # 先收集要删除的工作表对象(注意不能遍历sheetnames时直接删除,会导致迭代错误)
    sheets_to_delete = []
    for sheet in wb.worksheets:
        if "Abschätzung" not in sheet.title:
            sheets_to_delete.append(sheet)
    
    # 批量删除
    for sheet in sheets_to_delete:
        wb.remove(sheet)
    
    wb.save(input)
    wb.close()

注意:不能在遍历wb.sheetnames的同时删除工作表,因为这会改变集合的长度,引发迭代异常,必须先收集所有要删除的对象再批量处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:50:24