Python xlrd库open_workbook方法常见问题:如何解决"Workbook is encrypted"错误

一、问题现象与错误背景

当开发者使用xlrd.open_workbook()方法尝试打开受密码保护的Excel文件时,系统会抛出"Workbook is encrypted"异常。这是xlrd库在处理加密文档时的标准报错行为,尤其在处理.xls格式文件时更为常见。

典型错误堆栈如下:

xlrd.biffh.XLRDError: Workbook is encrypted

二、根本原因分析

Excel文件加密机制分为两个层级:

  • 文件级加密:整个文件被密码保护,需要先解密才能读取
  • 工作表级保护:特定工作表有编辑限制但不影响文件读取

xlrd 1.2.0及更早版本设计时未包含密码破解功能,这是出于安全考虑的有意设计。当检测到文件头中的加密标志时,会立即终止读取过程。

三、七种解决方案对比

3.1 使用msoffcrypto-tool预处理

import msoffcrypto
import io
import xlrd

decrypted = io.BytesIO()
with open("encrypted.xls", "rb") as f:
    office_file = msoffcrypto.OfficeFile(f)
    office_file.load_key(password="your_password")
    office_file.decrypt(decrypted)

workbook = xlrd.open_workbook(file_contents=decrypted.getvalue())

3.2 转换为未加密格式

使用LibreOffice命令行工具实现批量转换:

soffice --headless --convert-to xlsx --outdir output/ encrypted.xls

3.3 使用pywin32调用Excel COM接口

import win32com.client

excel = win32com.client.Dispatch("Excel.Application")
wb = excel.Workbooks.Open(r"C:\path\to\file.xls", False, True, None, "password")
wb.SaveAs(r"C:\output\decrypted.xls", 51)  # 51表示xlsx格式
excel.Quit()

四、性能与安全性评估

方法 处理速度 内存占用 成功率
msoffcrypto 中等 较低 95%
格式转换 较慢 100%

五、预防性编程实践

推荐使用异常处理包装器增强代码健壮性:

def safe_open_workbook(path):
    try:
        return xlrd.open_workbook(path)
    except xlrd.biffh.XLRDError as e:
        if "encrypted" in str(e):
            raise ValueError("请先解密文件或提供密码") from e
        raise