按DataFrame唯一区域值循环保存文件并加密失败问题排查
解决Excel文件密码保护不生效的问题
你的代码未能实现密码保护,核心问题出在两个地方:
- 没有指定ExcelWriter使用
openpyxl引擎,导致工作簿的安全设置无法被正确应用 - 仅设置了密码,但未启用工作簿保护的触发开关(比如锁定结构)
下面是修正后的完整代码:
import os import pandas as pd import numpy as np from openpyxl.workbook.protection import WorkbookProtection grouped = list(consolidated_df.groupby(['Business Region'])) passwords = {'AE': 'AE_', 'CH': 'CH', 'CZ': 'CZ', 'DK': 'DK', 'ES': 'ES', 'FI': 'FI', 'FR': 'FR', 'HQ': 'HQ', 'NL': 'NL', 'NO': 'NO', 'PE': 'PE', 'PT': 'PT', 'SE': 'SE', 'SK': 'SK', 'TMC': 'TMC', 'London': 'GB', 'York': 'GB'} for df in grouped: region = df[0] # 简化唯一索引的拼接方式,避免原格式处理的冗余 name = ','.join(map(str, df[1].index.unique())) path = os.path.join(filepathtovalidate, f'{name} DM4 Oracle Load.xlsx') # 明确指定openpyxl引擎,确保能调用工作簿保护API writer = pd.ExcelWriter(path, engine='openpyxl') df[1].to_excel(writer, index=False) workbook = writer.book # 启用工作簿结构保护并设置密码,lockStructure=True是触发保护的关键 workbook.security = WorkbookProtection( workbookPassword=passwords.get(region), lockStructure=True ) writer.save()
关键修改点说明
- 指定openpyxl引擎:pandas默认的Excel引擎不一定是openpyxl,只有明确指定后,才能通过
writer.book获取到openpyxl的Workbook对象并应用保护设置 - 启用保护开关:
lockStructure=True会锁定工作簿的结构(禁止添加/删除工作表、重命名工作表等操作),仅设置workbookPassword不会触发保护,必须配合启用至少一项保护规则 - 优化名称生成:原代码中用
str(df[1].index.unique().format())的方式会产生多余的符号,改用','.join()更简洁可靠
补充说明
如果你的需求是打开文件时需要输入密码(整个文件加密),openpyxl无法实现这种级别保护,此时可以考虑:
- Windows环境下使用
win32com.client调用Excel的COM接口实现加密 - 使用
xlsxwriter库,它支持设置文件打开密码
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

