上午好☀️☀️☀️️
本答案参考通义千问
你遇到的问题是 openpyxl 无法读取 Excel 文件,并且报错为:
zipfile.BadZipFile: File is not a zip file
这个错误通常表示 文件不是有效的 ZIP 文件。而 Excel 文件(.xlsx)本质上是一个 ZIP 压缩包,里面包含 XML 文件和资源文件。如果文件损坏、被加密或格式不正确,就可能导致 openpyxl 无法识别。
✅ 问题分析
-
是否是加密导致?
- 是的,Excel 文件如果被加密,openpyxl 就无法直接读取。
- 虽然 Office 可以正常打开,但 openpyxl 不支持解密加密的
.xlsx 文件。
-
为什么报错 zipfile.BadZipFile?
- 因为文件可能被加密后修改了结构,不再是标准的 ZIP 格式,导致 openpyxl 无法解析。
-
其他方式是否可以读取?
🔧 解决方案
1. 尝试用 Python 的 pywin32 库通过 COM 接口读取 Excel
这是最直接的方法,前提是你的系统中安装了 Microsoft Excel,并且可以运行。
import win32com.client as win32
# 启动 Excel
excel = win32.Dispatch('Excel.Application')
excel.Visible = False # 不显示 Excel 界面
# 打开工作簿
wb = excel.Workbooks.Open(r'c:\users\Desktop\某某某.xlsx')
# 选择第一个工作表
ws = wb.Sheets(1)
# 读取数据
data = []
for row in ws.UsedRange.Rows:
data.append([cell.Value for cell in row])
# 关闭工作簿并退出 Excel
wb.Close(SaveChanges=False)
excel.Quit()
# 打印数据
print(data)
⚠️ 注意:这种方式依赖于系统中安装了 Excel,而且在某些企业环境中可能因权限限制无法使用。
2. 使用 pandas + pyxlsb 或 xlrd 读取 .xls 文件(非 .xlsx)
如果你的文件是 .xls 格式(旧版 Excel),可以尝试以下方法:
import pandas as pd
# 使用 xlrd 引擎读取 .xls 文件
df = pd.read_excel("c:\\users\\Desktop\\某某某.xls", engine='xlrd')
print(df)
⚠️ xlrd 不支持 .xlsx,只支持 .xls,所以不适用于你的情况。
3. 使用 msoffcrypto-tool 解密 Excel 文件
这是一个开源库,可以解密加密的 Excel 文件,然后你可以再用 openpyxl 读取。
安装:
pip install msoffcrypto-tool
示例代码:
from msoffcrypto import OfficeFile
import openpyxl as opx
# 加密文件路径
encrypted_file = r'c:\users\Desktop\某某某.xlsx'
# 创建解密对象
file = OfficeFile(open(encrypted_file, 'rb'))
# 输入密码(假设你知道密码)
password = "your_password_here"
file.load_key(password=password)
# 保存解密后的文件
decrypted_file = r'c:\users\Desktop\解密后的文件.xlsx'
with open(decrypted_file, 'wb') as f:
file.encrypt(f)
# 用 openpyxl 读取解密后的文件
wb = opx.load_workbook(decrypted_file)
sheet = wb.active
for row in sheet.iter_rows(values_only=True):
print(row)
⚠️ 需要你有正确的密码才能解密。
4. 联系 IT 部门获取未加密文件
如果你无法自己解密,建议联系公司 IT 部门,请求他们提供未加密的 Excel 文件,这样你就可以用 openpyxl 正常读取了。
📌 总结
| 方法 | 是否可行 | 说明 |
|------|----------|------|
| pywin32 通过 COM 接口读取 | ✅ 可行 | 依赖 Excel 安装,适合本地环境 |
| msoffcrypto-tool 解密文件 | ✅ 可行 | 需要知道密码,适合已知密码的情况 |
| 联系 IT 获取未加密文件 | ✅ 最佳 | 安全、稳定、无需额外操作 |
🛡️ 附加建议
- 如果你没有权限使用
pywin32,可以考虑使用 Jupyter Notebook 或 Docker 容器 来运行脚本。 - 如果你需要自动化处理多个加密文件,建议开发一个 解密+读取 的流程,避免重复操作。
如有更多具体信息(如文件类型、是否需要密码等),我可以进一步帮助你定制解决方案。