2401_84998791 2026-01-15 11:51 采纳率: 100%
浏览 2
已采纳

openpyxl无法读取Excel文件,如何解决?

公司内部电脑,带加密软件,Excel已加密,office可以正常打开
使用Python的openpyxl库读取Excel文件时会报错,报错信息
zipfile.BadZipFile:File is not a zip file
是因为文件被加密的原因吗
想问一下还有没有其他方式可以读取,感谢


import openpyxl as opx
df2 = pd.read_excel('c:\\users\\Desktop\\某某某.xlsx',engine='openpyxl')
print(df2)

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-15 11:52
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的问题是 openpyxl 无法读取 Excel 文件,并且报错为:

    zipfile.BadZipFile: File is not a zip file
    

    这个错误通常表示 文件不是有效的 ZIP 文件。而 Excel 文件(.xlsx)本质上是一个 ZIP 压缩包,里面包含 XML 文件和资源文件。如果文件损坏、被加密或格式不正确,就可能导致 openpyxl 无法识别。


    ✅ 问题分析

    1. 是否是加密导致?

      • 是的,Excel 文件如果被加密,openpyxl 就无法直接读取
      • 虽然 Office 可以正常打开,但 openpyxl 不支持解密加密的 .xlsx 文件。
    2. 为什么报错 zipfile.BadZipFile

      • 因为文件可能被加密后修改了结构,不再是标准的 ZIP 格式,导致 openpyxl 无法解析。
    3. 其他方式是否可以读取?

      • 可以,但需要先解密文件,或者使用支持加密的库。

    🔧 解决方案

    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 + pyxlsbxlrd 读取 .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 NotebookDocker 容器 来运行脚本。
    • 如果你需要自动化处理多个加密文件,建议开发一个 解密+读取 的流程,避免重复操作。

    如有更多具体信息(如文件类型、是否需要密码等),我可以进一步帮助你定制解决方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 1月15日
  • 创建了问题 1月15日