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
相关产品推荐
相关产品推荐

