You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按DataFrame唯一区域值循环保存文件并加密失败问题排查

解决Excel文件密码保护不生效的问题

你的代码未能实现密码保护,核心问题出在两个地方:

  1. 没有指定ExcelWriter使用openpyxl引擎,导致工作簿的安全设置无法被正确应用
  2. 仅设置了密码,但未启用工作簿保护的触发开关(比如锁定结构)

下面是修正后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:29