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

使用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会自动清理该不兼容属性,因此能正常加载。以下是三种可行解决方式:

  1. 升级openpyxl到最新版本
    运行命令完成更新:

    pip install --upgrade openpyxl
    

    新版本已适配该属性,可直接加载文件执行操作。

  2. 跳过格式解析加载文件
    若暂时无法升级,可在load_workbook时添加data_only=True参数,跳过格式相关解析(注意:此操作会丢失公式,仅保留计算后的值):

    wb = load_workbook(file_path, data_only=True)
    
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:37