使用openpyxl保护现有Excel工作簿无效问题咨询
问题:使用openpyxl保护现有Excel工作簿无效
我尝试用openpyxl保护已有的Excel工作簿,写了如下代码:
from openpyxl import load_workbook wb = load_workbook("/path/raw_data.xlsx") wb.security = WorkbookProtection() wb.security.workbookPassword = 'password' wb.security.lockStructure = True wb.save("/path/protected_raw_data.xlsx")
代码执行后没有报错,也生成了protected_raw_data.xlsx文件,但打开文件后发现工作簿并没有被保护。想问下openpyxl是不是只支持保护新建工作簿,不支持现有工作簿?
解答
openpyxl支持保护现有工作簿,你的代码存在两个关键问题:
- 未导入
WorkbookProtection类,导致密码处理逻辑异常 - 新建
WorkbookProtection实例覆盖了原有工作簿的security对象,丢失了必要的默认配置
修正后的代码如下:
from openpyxl import load_workbook from openpyxl.workbook.protection import WorkbookProtection wb = load_workbook("/path/raw_data.xlsx") # 直接修改现有工作簿的security属性,而非新建实例 wb.security.workbookPassword = 'password' wb.security.lockStructure = True wb.save("/path/protected_raw_data.xlsx")
需要注意的细节:
- 导入
WorkbookProtection类是必须的,openpyxl依赖它完成密码的哈希转换(Excel要求存储哈希后的密码,而非明文) - 不要替换原有
wb.security对象,直接修改其属性即可,否则会破坏工作簿的保护上下文 - 传入明文密码即可,openpyxl内部会自动转换为Excel兼容的哈希格式
如果需要锁定工作簿窗口,可以额外添加配置:
wb.security.lockWindows = True
内容的提问来源于stack exchange,提问作者tjmhd
相关产品推荐
相关产品推荐

