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

如何读取密码保护的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:39:02