使用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
相关产品推荐
相关产品推荐

