如何用Python openpyxl基于数组删除Excel工作表
问题分析与解决
你的代码现在有两个核心问题:
- 关键的删除工作表代码是注释状态,根本没执行;
- 就算取消注释,你在同一个
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
相关产品推荐
相关产品推荐

