如何读取密码保护的Excel到Pandas DataFrame并解决XLRDError报错
问题原因
你遇到的XLRDError: Can't find workbook in OLE2 compound document报错是因为pandas默认依赖的xlrd、openpyxl库均不支持直接读取密码加密的xlsx文件,需要通过Win32 COM组件调用Excel程序后台解密后再读取内容。
实现方案
该方案仅支持Windows系统,需提前安装微软Office软件,先执行依赖安装命令:pip install pywin32 pandas
完整实现代码如下,密码可直接内置到代码中,全程无需人工干预:
from glob import glob import os import pandas as pd import win32com.client as win32 from tempfile import mkstemp # 替换为实际的Excel文件密码 EXCEL_PASSWORD = "你的内置密码" # 替换为你的文件存储目录 FILE_PATH = "C:/path_to_files/*.xlsx" df_list = [] # 启动Excel后台进程 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 不弹出Excel窗口 excel.DisplayAlerts = False # 关闭所有提示弹窗 for file_path in glob(FILE_PATH): # 打开加密工作簿 wb = excel.Workbooks.Open(file_path, Password=EXCEL_PASSWORD) # 生成临时无密码文件副本 fd, temp_path = mkstemp(suffix='.xlsx') os.close(fd) # 保存无密码副本 wb.SaveAs(temp_path, Password='') wb.Close() # pandas读取临时文件,和原有逻辑保持一致 data = pd.read_excel(temp_path, header=None) data['EffectiveDate'] = os.path.basename(file_path)[11:19] df_list.append(data) # 自动删除临时文件,不占用本地存储 os.remove(temp_path) # 关闭Excel后台进程,避免残留占用 excel.Quit() # 合并所有数据,替代pandas已弃用的append方法 df3 = pd.concat(df_list, ignore_index=True) print(df3)
注意事项
- 硬编码密码存在安全风险,生产环境建议通过系统环境变量等加密方式读取密码
- 若运行时出现COM组件调用错误,可先到任务管理器关闭所有残留的Excel进程后重试
- 若需处理xls格式文件,只需将临时文件后缀改为
.xls即可
内容的提问来源于stack exchange,提问作者BJD
相关产品推荐
相关产品推荐

