openpyxl 不支持设置 excel 打开或修改密码;windows 下推荐用 win32com.client 调用 excel com 接口实现,需安装 pywin32 并正确初始化;跨平台可选付费的 aspose.cells;务必做好异常处理、密码校验与 excel 进程清理。

用 openpyxl 无法直接设置密码——这是最常踩的坑
openpyxl 能读写 Excel(.xlsx),但不支持设置打开密码或修改密码。它连 workbook.security 这类属性都只是只读或已弃用。很多人试完 workbook.password = "123" 发现毫无效果,甚至报 AttributeError,就是因为这个根本性限制。
-
openpyxl只能处理“结构”和“内容”,不碰文件级加密 - Excel 打开密码(即“输入密码才能看到表格”)属于 OLE 复合文档的加密层,需底层 COM 或专门加密库介入
- 如果强行用
openpyxl保存后手动用 Excel GUI 加密,就不是“自动”了,批量场景直接不可行
Windows 上用 win32com.client 调 Excel COM 接口是目前最稳的方案
前提是目标机器装了桌面版 Microsoft Excel(2016+ 推荐),且 Python 能调通 COM。这不是纯 Python 方案,但对 Windows 批量办公场景来说,它可靠、行为与人工操作一致、支持全部密码类型(打开密码、修改密码、结构保护)。
- 必须安装
pywin32:pip install pywin32 - 首次运行后需执行
python Scripts/pywin32_postinstall.py -install(否则 COM 初始化失败) - Excel 进程默认前台弹窗,加
Visible=False可隐藏,但某些策略组会强制弹窗,需提前确认环境 - 每次打开/保存一个文件都会启停 Excel 实例,速度慢;建议用单实例复用
app对象,避免反复创建
示例关键逻辑:
import win32com.client
app = win32com.client.Dispatch("Excel.Application")
app.Visible = False
wb = app.Workbooks.Open(r"C:\data\report.xlsx")
wb.Password = "mypass" # 设置打开密码
wb.Save()
wb.Close()
app.Quit()
Aspose.Cells 是跨平台替代方案,但要付费且有学习成本
Aspose.Cells 是少数真正支持全平台 Excel 密码加密的商业库,Python 版通过 aspose-cells 包提供。它不依赖 Excel 安装,Linux/macOS 也能跑,API 明确区分 set_password(打开密码)和 set_write_password(修改密码)。
- 免费版有水印且限制功能(如不能设打开密码),商用必须买 license
- 安装后首次加载较慢(JVM 启动开销),小文件批量时不如 COM 快
- API 返回的是新文件流,原文件不会被覆盖,需显式调用
save并指定路径
简单用法:
from asposecells import Workbook
wb = Workbook("input.xlsx")
wb.get_worksheets().get(0).protect("All", "sheetpass") # 工作表保护
wb.set_password("mypass") # 文件打开密码
wb.save("output.xlsx")
别忽略密码强度和错误处理——自动流程崩在第 103 个文件就很尴尬
批量处理上百个文件时,一个路径不存在、一个 Excel 正被占用、一个密码含非法字符(如 \、&、控制符),就会让整个脚本中断。而 Excel COM 更狠:没关掉 app.Quit(),残留进程会卡死后续调用。
- 用
try/except包住每个文件操作,记录失败文件名和错误信息到日志,不要raise中断全程 - 密码统一用 ASCII 字符,避免 Unicode 或空格;Excel 对密码长度无硬限制,但少于 4 位容易被绕过
- 处理前检查文件是否被其他程序锁定(
os.access(path, os.W_OK)不可靠,得用open(..., 'r+b')尝试打开再捕获PermissionError) - 最好加个进度计数器,比如每处理 20 个 print 一次完成百分比,不然黑窗干等容易误判卡死
COM 方式下最容易被忽略的一点:Excel 应用对象必须显式 Quit(),且最好在 finally 块里做,否则第二次运行可能因残留进程导致 Dispatch 失败——这时候看到的错误往往是“拒绝访问”,而不是“Excel 已运行”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











