使用pandas读取Excel文件报错xlrd.biffh.XLRDError:工作簿已加密
报错原因
xlrd.biffh.XLRDError: Workbook is encrypted 报错表示xlrd库检测到目标xls文件存在加密/保护标识,即便手动打开无需输入密码,也可能是文件被设置了工作表/工作簿保护、下载时被网站添加了弱加密标记,或是非xls格式文件修改后缀伪装导致的误判。
解决方案
按优先度从高到低排列:
方案1:使用msoffcrypto-tool解密(跨平台通用)
该方案适用于绝大多数带弱加密、无密码保护的xls文件,无需本地安装Excel。
- 第一步:安装依赖库
pip install msoffcrypto-tool pandas xlrd
- 第二步:使用如下代码读取文件
import msoffcrypto import pandas as pd import io decrypted_stream = io.BytesIO() with open(filepath, 'rb') as f: office_file = msoffcrypto.OfficeFile(f) # 手动打开无需密码则password传空字符串,有密码填写实际密码即可 office_file.load_key(password='') office_file.decrypt(decrypted_stream) # 指针移到流开头后读取 decrypted_stream.seek(0) df = pd.read_excel(decrypted_stream, engine='xlrd')
方案2:检查是否为伪装xls文件
部分网站导出的xls文件本质是HTML表格或CSV格式修改后缀而来,xlrd会误判为加密。你可以用普通文本编辑器打开文件查看开头标识,如果存在<html>、<table>等标签,直接用read_html读取即可:
dfs = pd.read_html(filepath) # read_html返回文件中所有表格的列表,按需选取对应下标的表即可 df = dfs[0]
方案3:调用本地Excel转存(仅Windows可用)
如果上述方案都无效,可模拟手动打开文件再另存的操作,自动清除加密标识,要求本地已安装Excel软件:
- 第一步:安装依赖
pip install pywin32 pandas xlrd
- 第二步:执行转存和读取
import win32com.client as win32 import pandas as pd import os excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 打开原文件,无密码则Password参数留空 wb = excel.Workbooks.Open(os.path.abspath(filepath), Password='') # 另存为无加密的新xls文件 new_path = os.path.abspath(f'decrypted_{os.path.basename(filepath)}') wb.SaveAs(new_path, FileFormat=56) # FileFormat=56对应xls格式 wb.Close() excel.Quit() # 读取转存后的文件 df = pd.read_excel(new_path, engine='xlrd')
注意事项
- xlrd 2.0+版本仅支持xls格式读取,如果你读取的是xlsx格式文件,可指定engine为
openpyxl测试 - 部分老旧版本的xlrd(如1.2.0)可直接读取部分弱加密的xls文件,也可尝试降级xlrd版本验证
内容的提问来源于stack exchange,提问作者Py1996
相关产品推荐
相关产品推荐

