使用 Python 轻松加密或解密 Excel 文档

工资表、客户名单和财务报表等 Excel 文件通常包含企业的敏感数据。如果需要通过邮件或网盘分享,最好先设置打开密码,避免未经授权的人员查看文件内容。

使用 Spire.XLS for Python,可以通过简单的 API 为 Excel 工作簿设置打开密码,也可以在提供正确密码后解除已有的密码保护。本文将介绍如何使用 Python 加密和解密 Excel 文档,并演示密码验证和批量处理的方法。

为什么要加密 Excel 文档?

Excel 加密主要用于限制文件访问,常见用途包括:

  • 保护敏感数据: 设置打开密码后,用户必须输入正确的密码才能查看工作簿内容。
  • 降低文件流转风险: 对通过邮件、网盘等渠道共享的敏感文件进行加密,减少文件误发或被未经授权人员访问的风险。
  • 简化文档管理: 在自动化处理流程中使用代码批量加密或解密文件,比逐个通过 Excel 界面设置密码更加方便。

需要注意,本文介绍的加密方式主要针对工作簿的打开密码,与限制工作表编辑、保护单元格等功能不同。

环境准备

本文使用 Spire.XLS for Python 实现 Excel 文档的密码加密与解密,无需依赖本地安装的 Microsoft Excel。

首先,打开终端或命令提示符,执行以下命令安装:

bash 复制代码
pip install Spire.XLS

安装完成后,在 Python 脚本中导入相关模块:

python 复制代码
from spire.xls import *
from spire.xls.common import *

方法一:为 Excel 文档设置打开密码

如果希望限制其他人打开 Excel 文件,可以在加载工作簿后调用 Protect(password) 设置密码。

下面的示例使用密码 eiceblue 保护一个 Excel 工作簿,并将加密后的文件另存为新文件:

python 复制代码
from spire.xls import *
from spire.xls.common import *

inputFile = "EncryptWorkbook.xlsx"
outputFile = "EncryptWorkbook_out.xlsx"

workbook = Workbook()
workbook.LoadFromFile(inputFile)

# 为工作簿设置打开密码
workbook.Protect("eiceblue")

workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

这里的关键代码是 workbook.Protect("eiceblue"),用于为工作簿设置打开密码。设置完成后,还需要调用 SaveToFile() 将修改保存到文件中。

生成的 EncryptWorkbook_out.xlsx 在 Excel 中打开时,会要求输入密码。只有提供正确的密码,才能查看工作簿内容。

方法二:使用密码打开已加密的 Excel 文档

如果需要读取或修改已经加密的 Excel 文件,首先要使用正确的密码打开工作簿。

Spire.XLS 提供了 OpenPassword 属性,可以在调用 LoadFromFile() 之前设置打开密码。下面的示例通过遍历候选密码,尝试打开指定文件,并使用异常捕获判断密码是否正确:

python 复制代码
from spire.xls import *
from spire.xls.common import *

inputFile = "EncryptedFile.xlsx"

passwords = ["password1", "password2", "password3", "1234"]
i = 0

while i < len(passwords):
    try:
        workbook = Workbook()

        # 设置打开密码
        workbook.OpenPassword = passwords[i]

        # 加载加密文档
        workbook.LoadFromFile(inputFile)

        print("密码 = " + passwords[i] + " 正确,文件已成功打开!")
        workbook.Dispose()

    except SpireException as ex:
        print("密码 = " + passwords[i] + " 不正确")

    i += 1

这里需要注意,必须先设置 OpenPassword,再调用 LoadFromFile() 。如果密码不正确,加载文件时可能会抛出 SpireException,因此可以使用 try/except 捕获异常,避免程序直接中断。

这种方式适合在已知候选密码的情况下验证密码是否正确。实际使用时,应确保这些密码来自合法授权的记录,不要将密码尝试用于未经授权的文件。

方法三:解除 Excel 文档的密码保护

如果需要对已加密的 Excel 文件进行后续处理,或者希望移除打开密码,可以在使用正确密码加载工作簿后,调用 UnProtect() 解除密码保护。

下面的示例会先检查文件是否受到密码保护,再尝试使用原密码打开并解除保护:

python 复制代码
from spire.xls import *
from spire.xls.common import *

inputFile = "DecryptWorkbook.xlsx"
outputFile = "DecryptWorkbook_out.xlsx"

# 判断文档是否受密码保护
isProtected = Workbook.IsPasswordProtected(inputFile)

if isProtected:
    workbook = Workbook()

    # 使用原密码打开工作簿
    workbook.OpenPassword = "eiceblue"
    workbook.LoadFromFile(inputFile)

    # 解除密码保护
    workbook.UnProtect()

    workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
    workbook.Dispose()

    print("已成功解除密码保护。")
else:
    print("该文件未加密,无需解密。")

这里通过 Workbook.IsPasswordProtected() 判断文件是否设置了密码保护。该方法直接接收文件路径,并返回布尔值,可以作为解密前的检查步骤。

如果文件已经加密,代码会先设置正确的 OpenPassword,再加载工作簿。成功打开后,调用 UnProtect() 移除密码保护,最后将结果保存为新文件。

需要注意,解除密码保护的前提是能够使用正确的密码打开工作簿。调用 UnProtect() 后,还需要通过 SaveToFile() 保存修改,生成的文件才会解除原有的打开密码。

方法四:批量加密整个文件夹中的 Excel 文档

如果需要处理的 Excel 文件比较多,逐个加载和设置密码会比较耗时。可以使用 Python 的 os.walk() 遍历指定目录,将加密操作放入循环中,实现批量处理。

下面的示例会遍历 excel_files 文件夹,为其中的 .xlsx 和 .xls 文件设置统一的打开密码,并在原文件名前添加 enc_ 前缀保存结果:

python 复制代码
import os
from spire.xls import *
from spire.xls.common import *

folder = "excel_files"
password = "eiceblue"

for root, dirs, files in os.walk(folder):
    for file in files:
        if file.lower().endswith((".xlsx", ".xls")):
            path = os.path.join(root, file)

            workbook = Workbook()
            workbook.LoadFromFile(path)

            # 为工作簿设置打开密码
            workbook.Protect(password)

            out = os.path.join(root, "enc_" + file)
            workbook.SaveToFile(out, ExcelVersion.Version2010)

            workbook.Dispose()
            print("已加密:" + file)

这段代码主要通过两层循环遍历指定目录及其子目录,筛选出 Excel 文件后,依次执行加载、加密和保存操作。

批量处理时,需要注意及时调用 Dispose() 释放每个 Workbook 对象,避免大量文件处理过程中持续占用内存和文件资源。

如果需要批量解密,也可以采用类似的循环结构:先为每个工作簿设置正确的 OpenPassword,加载文件后调用 UnProtect(),最后保存处理结果。

实用技巧与注意事项

使用 Python 加密或解密 Excel 文档时,还需要留意以下几点:

  • 妥善管理密码。 加密时设置的打开密码,就是后续加载文件时需要提供的密码。实际项目中建议将密码存储在安全的配置或密钥管理服务中,避免直接写在脚本里。
  • 提前备份原始文件。 加密和解密都会改变工作簿的密码保护状态。建议将处理结果另存为新文件,保留原始文件以便后续检查或重新处理。
  • 及时释放资源。 每个工作簿处理完成后都应调用 Dispose(),尤其是在批量处理多个文件时,避免资源持续占用。
  • 合理处理密码错误。 可以使用 try/except SpireException 捕获加载文件时的异常,避免单个文件密码不正确导致整个批处理任务中断。
  • 区分工作簿加密与工作表保护。 本文介绍的是设置工作簿打开密码,并不等同于限制用户修改工作表结构或编辑特定单元格。实际使用时需要根据保护目标选择对应功能。

总结

使用 Spire.XLS for Python 可以方便地为 Excel 工作簿设置打开密码,也可以在提供正确密码后解除已有的密码保护。如果需要处理加密文件,可以先设置打开密码,再加载工作簿;如果需要批量处理多个文件,则可以结合目录遍历和密码状态检查,自动完成加密或解密操作。将这些方法应用到日常文档处理流程中,可以减少手动设置密码的工作量,也让敏感 Excel 文件的管理更加高效。

相关推荐
CyrusYiVPP1 小时前
手写 MCP Server:给问答机器人接上本地文件工具,Python 实战第 13 期
人工智能·python
特立独行的猫A2 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
qq_1588954111110 小时前
AI 音乐生成完成后,音频 URL 为什么会过期?一套可恢复的交付方案
python·api·ai音乐
Warson_L12 小时前
高性能架构设计
python·go
databook13 小时前
新数据到手,先跑哪几步检查
python·数据分析
czq_268671948713 小时前
Python打卡第46天
开发语言·python
Flynt15 小时前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
曲径海盗17 小时前
【Python 学习第 53 天】列表基础
python·学习笔记·编程入门
Dumbness17 小时前
群里 @ 机器人发"查订单",指令一条都没命中:微信群机器人在路由前漏掉的几步归一化
python·微信