使用openpyxl删除Excel工作表报错,需手动保存文件才可正常加载
问题描述
使用openpyxl删除Excel指定工作表时触发TypeError: SheetFormatProperties.__init__() got an unexpected keyword argument 'defaultColWidthPt'错误,仅手动打开并保存目标Excel文件后,才能正常加载并执行删除操作。
代码示例
from openpyxl import load_workbook def delete_sheet_by_name(file_path, sheet_name): wb = load_workbook(file_path) if sheet_name in wb.sheetnames: sheet = wb[sheet_name] wb.remove(sheet) wb.save(file_path) print(f"The sheet '{sheet_name}' has been deleted.") else: print(f"The sheet '{sheet_name}' does not exist in the workbook.") file_path = r'E:\Projects\Python\Delete Sheet\1.xlsx' sheet_name_to_delete = 'Evaluation Warning' delete_sheet_by_name(file_path, sheet_name_to_delete)
错误堆栈
File "E:\Projects\Python\Delete Sheet\pandas_solution.py", line 18, in <module> delete_sheet_by_name(file_path, sheet_name_to_delete) File "E:\Projects\Python\Delete Sheet\pandas_solution.py", line 5, in delete_sheet_by_name wb = load_workbook(file_path) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 346, in load_workbook reader.read() File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 301, in read self.read_worksheets() File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 237, in read_worksheets ws_parser.bind_all() File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\worksheet\_reader.py", line 465, in bind_all self.bind_cells() File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\worksheet\_reader.py", line 368, in bind_cells for idx, row in self.parser.parse(): File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\worksheet\_reader.py", line 163, in parse obj = prop[1].from_tree(element) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Skynet\anaconda3\Lib\site-packages\openpyxl\descriptors\serialisable.py", line 103, in from_tree return cls(**attrib) ^^^^^^^^^^^^^ TypeError: SheetFormatProperties.__init__() got an unexpected keyword argument 'defaultColWidthPt'
解决方法
这个错误源于当前openpyxl版本不兼容Excel文件中的defaultColWidthPt属性,手动保存时Excel会自动清理该不兼容属性,因此能正常加载。以下是三种可行解决方式:
升级openpyxl到最新版本
运行命令完成更新:pip install --upgrade openpyxl新版本已适配该属性,可直接加载文件执行操作。
跳过格式解析加载文件
若暂时无法升级,可在load_workbook时添加data_only=True参数,跳过格式相关解析(注意:此操作会丢失公式,仅保留计算后的值):wb = load_workbook(file_path, data_only=True)用win32com自动处理文件(Windows环境)
若需保留公式和格式,可借助pywin32库模拟手动打开保存的操作,再用openpyxl处理:import win32com.client as win32 from openpyxl import load_workbook def auto_save_excel(file_path): excel = win32.DispatchEx('Excel.Application') excel.Visible = False excel.DisplayAlerts = False wb = excel.Workbooks.Open(file_path) wb.Save() wb.Close() excel.Quit() def delete_sheet_by_name(file_path, sheet_name): auto_save_excel(file_path) # 先自动处理文件 wb = load_workbook(file_path) if sheet_name in wb.sheetnames: sheet = wb[sheet_name] wb.remove(sheet) wb.save(file_path) print(f"工作表'{sheet_name}'已删除。") else: print(f"工作簿中不存在'{sheet_name}'工作表。") file_path = r'E:\Projects\Python\Delete Sheet\1.xlsx' sheet_name_to_delete = 'Evaluation Warning' delete_sheet_by_name(file_path, sheet_name_to_delete)需先安装依赖:
pip install pywin32
内容的提问来源于stack exchange,提问作者user21934236
相关产品推荐
相关产品推荐

