使用openpyxl打开公司设备生成的Excel文件时出现TypeError: expected <class openpyxl.styles.fills.Fill>错误的技术求助
问题成因与批量解决办法
这个问题我之前帮团队处理过类似场景,根源其实很明确:设备生成的Excel文件没有严格遵循OOXML(Excel的标准文件格式)规范,尤其是在样式填充(Fill)的结构上存在残缺或非法定义。
openpyxl作为一款依赖标准OOXML的库,在解析这类“非标准”文件时,找不到预期的openpyxl.styles.fills.Fill对象,就会抛出你遇到的TypeError。而手动保存时,Excel桌面版会自动启动格式修复机制,补全缺失的节点、修正非法结构,把文件转换成完全合规的OOXML格式,所以再用openpyxl打开就没问题了。
针对几百个文件的批量处理需求,给你两个实用方案:
方案一:Windows环境下调用Excel自动修复(最可靠)
利用win32com.client调用本地Excel程序,模拟手动保存的修复过程,全程后台运行:
import win32com.client as win32 import os def batch_repair_excel(folder_path): # 初始化Excel应用 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行,不显示界面 excel.DisplayAlerts = False # 关闭保存提示、覆盖确认等弹窗 # 遍历目录下的Excel文件 for filename in os.listdir(folder_path): if filename.lower().endswith(('.xlsx', '.xls')): file_full_path = os.path.join(folder_path, filename) try: # 打开文件并保存(自动修复格式) workbook = excel.Workbooks.Open(file_full_path) workbook.Save() # 直接覆盖原文件,也可指定新路径保存 workbook.Close() print(f"✅ 已修复: {filename}") except Exception as e: print(f"❌ 处理{filename}失败: {str(e)}") # 退出Excel excel.Quit() # 替换成你的文件目录 batch_repair_excel(r"D:\公司设备生成的Excel文件")
方案二:跨平台用LibreOffice批量转换
如果是Linux/macOS环境,或者没有安装Excel桌面版,可以用LibreOffice的命令行工具来修复转换,它同样能处理非标准Excel文件:
# 进入Excel文件所在目录,执行以下命令 # --headless 表示后台运行,--convert-to 指定输出格式为xlsx libreoffice --headless --convert-to xlsx --outdir ./fixed_files *.xlsx
这个命令会将当前目录下的所有xlsx文件修复后,保存到fixed_files子目录中。
额外提示
如果你的业务只需要读取Excel中的数据,不需要样式信息,也可以尝试用pandas配合openpyxl读取,但这个方法不一定能绕过样式解析错误,还是上面的文件修复方案更稳妥。
内容的提问来源于stack exchange,提问作者Dikianify




