用 Python 批量处理 Excel 文件时,“保护”这个需求经常被误解。很多刚接触 openpyxl 的开发者以为只要在代码里传一个 password,Excel 文件就无法被别人打开;也有人写完数据后直接把工作簿发给业务方,结果对方顺手改了公式,第二天的统计就出错了。真正的问题是:Excel 里的保护并不是一个统一功能,而是分成工作表保护、工作簿保护、文件打开密码三个层次。它们解决的问题不同,openpyxl 对它们的支持程度也不同。
接下来的内容围绕一份带公式的工作表展开。先说明三种保护机制分别控制什么,再给出用 openpyxl 添加工作表保护、工作簿结构保护、用 msoffcrypto 读取加密文件的完整脚本,然后把解除保护和常见报错整理成排查清单。最后会给出适合生产环境的保护策略。
1. 先分清 Excel 保护机制的三层含义
1.1 工作表保护解决的是“表内能不能改”
工作表保护通常指 Excel 的 Review 菜单里的 Protect Sheet 功能。它的核心对象是单元格、行列、筛选、排序、对象和场景。
在 Excel 的底层模型中,每个单元格都有一个 Locked 属性和 Hidden 属性。单元格默认情况下是 Locked=True、Hidden=False,但这两个属性并不会立刻生效。只有当工作表的保护开关被打开,Locked 属性才会起作用:Locked=True 的单元格不能被用户编辑,Hidden=True 的单元格会把公式隐藏,用户选中该单元格时,公式栏不会显示公式内容。
这层保护适合用来防止误改。例如一张员工奖金测算表,目标奖金和完成率在某个固定区域,实际发放金额必须由公式计算,那么可以把公式单元格锁定并隐藏,把完成率输入区域解锁。这样用户打开 Excel 后,只有完成率可以修改。
需要特别注意:工作表保护不是加密。它不会阻止别人通过代码读取文件内容,也不会阻止技术能力较强的人手动解除保护。它