Python无法直接用pandas.read_excel读取密码保护的Excel文件,因其底层openpyxl/xlsxwriter不支持解密“打开密码”;唯一稳定方案是Windows下用pywin32调用本地Excel应用程序解密并另存,macOS/Linux无可靠纯Python方案。

Python无法直接用pandas.read_excel读取密码保护的Excel文件
因为 pandas.read_excel 底层依赖 openpyxl 或 xlsxwriter,而这两个库原生不支持解密受密码保护的 .xlsx 文件(Excel 的“打开密码”或“工作簿密码”)。你调用 read_excel 时会直接报错:InvalidFileException: openpyxl does not support the encryption 或类似提示。
必须先用pywin32在Windows上解密(仅限Windows)
目前唯一稳定可行的方案是借助 Excel 应用程序本身——通过 pywin32 自动调用本地安装的 Microsoft Excel,在后台打开并另存为无密码文件。这要求:
- 操作系统为 Windows(
pywin32不支持 macOS/Linux 上的 Excel 自动化) - 本机已安装 Microsoft Excel(不是 WPS、不是在线版)
- Python 环境已安装
pywin32:pip install pywin32
示例代码逻辑:
import win32com.client
import pandas as pd
import os
<p>def excel_decrypt_and_read(file_path, password, temp_path=None):
if temp_path is None:
temp_path = file_path.replace('.xlsx', '_decrypted.xlsx')</p><pre class="brush:php;toolbar:false;">excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False
try:
wb = excel.Workbooks.Open(
Filename=file_path,
Password=password,
UpdateLinks=0,
ReadOnly=True
)
wb.SaveAs(temp_path, FileFormat=51) # 51 = xlOpenXMLWorkbook (xlsx)
wb.Close(SaveChanges=False)
df = pd.read_excel(temp_path)
return df
finally:
excel.Quit()
if os.path.exists(temp_path):
os.remove(temp_path) # 清理临时文件macOS/Linux用户只能尝试“编辑密码”绕过(不推荐)
如果文件只设置了“修改密码”(即保存时需密码,但可只读打开),pandas.read_excel 可能正常读取——因为这种密码不加密文件结构,只是 Excel UI 层限制。但“打开密码”(必须输入才能看到内容)无法绕过。
- 用 LibreOffice 手动打开 → 输入密码 → 另存为新文件 → 再用 pandas 读取(非自动化)
-
xlrd已停止维护且不支持加密;openpyxl仍明确声明不支持解密(见其 GitHub issue #1278) - 没有纯 Python 方案能可靠处理 AES 加密的 Excel 打开密码——微软未公开密钥派生细节,第三方实现不可靠
容易被忽略的关键点
即使在 Windows 上用 pywin32,也要注意:
- Excel 进程可能残留:务必在
finally中调用excel.Quit(),否则多次运行后系统会卡住多个 Excel 实例 - 路径必须是绝对路径,相对路径在 COM 调用中容易失败
- 如果 Excel 弹出警告(如宏安全提示、文件损坏提示),会导致脚本卡死——需提前配置 Excel 信任中心设置或加超时逻辑(较复杂)
- 不能并发调用多个 Excel 实例;同一时间只能处理一个加密文件
真正需要自动化处理大量加密 Excel 的场景,往往得推动上游改用其他传输方式——比如导出为带认证的 CSV 或数据库快照,而不是依赖 Excel 密码保护。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











