You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取带密码保护的xlsm Excel文件找不到文件报错如何解决

问题解决方法

报错根因

报错的核心原因是win32com调用的微软Excel程序不会以Python脚本的当前工作目录为基准解析相对路径,你传入的SAE/SAE_R360.xlsm相对路径在Excel的上下文里无法定位到文件,同时你现有代码还缺失了打开加密文件的必填参数。

具体解决步骤

  • 第一步:将文件路径转换为绝对路径传入,避免相对路径解析错误
  • 第二步:调用Workbooks.Open方法时传入Password参数,用于打开带密码加密的Excel文件
  • 第三步:增加异常捕获逻辑,避免程序报错后Excel进程残留在后台占用文件
  • 第四步:如果需要彻底移除文件密码,在保存时可传入空密码参数,后续openpyxl就可以直接读取

修正后的完整代码

import os
import openpyxl
import win32com.client
import gc

def unprotect_xlsm(relative_path):
    # 转换为绝对路径
    abs_path = os.path.abspath(relative_path)
    pw_str = 'mypassword'
    xcl = None
    wb = None
    try:
        xcl = win32com.client.Dispatch('Excel.Application')
        xcl.Visible = False
        xcl.DisplayAlerts = False
        # 打开带密码的文件,传入密码参数
        wb = xcl.Workbooks.Open(abs_path, Password=pw_str)
        # 解除工作簿/工作表保护
        wb.Unprotect(pw_str)
        if wb.HasPassword:
            # 移除文件打开密码
            wb.Password = ''
        # 保存修改,也可以指定另存为新文件避免覆盖原文件
        wb.Save()
    finally:
        # 无论是否报错都关闭资源
        if wb is not None:
            wb.Close(SaveChanges=True)
        if xcl is not None:
            xcl.Quit()
        # 释放COM对象,避免进程残留
        del wb, xcl
        gc.collect()

# 调用函数
unprotect_xlsm("SAE/SAE_R360.xlsm")
# 读取无密码的文件
wb = openpyxl.load_workbook("SAE/SAE_R360.xlsm", data_only=True)

额外注意事项

  • 该方案仅适用于本地安装了微软Excel的Windows设备,使用WPS的用户需要将Dispatch参数改为'Ket.Application'适配WPS的COM接口
  • 不要在文件路径中使用中文、空格或特殊字符,避免路径解析失败
  • 如果不想修改原文件,可以将Save()改为SaveAs()指定新的无密码文件路径,操作更安全

内容的提问来源于stack exchange,提问作者Felipe Dourado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:27:04