Excel工资表、客户名单和财务报表通常包含敏感数据,通过邮件或网盘共享前设置打开密码,可以限制未经授权的人员查看工作簿内容。本文围绕Spire.XLS for Python,整理用脚本为Excel工作簿设置打开密码、用密码打开已加密文件、解除密码保护以及批量处理文件夹中Excel文件的方法。需要先说明:这里处理的是工作簿打开密码,和限制工作表编辑、保护单元格不是同一类功能。
一、环境准备
原文使用Spire.XLS for Python完成加密和解密,不依赖本地安装Microsoft Excel。先在终端或命令提示符中安装:
安装后在Python脚本中导入模块:
- from spire.xls import *
- from spire.xls.common import *
复制代码
二、为Excel工作簿设置打开密码
如果希望其他人打开文件时必须输入密码,可以在加载工作簿后调用Protect(password)设置打开密码,再通过SaveToFile()保存修改。下面的示例用密码eiceblue保护工作簿,并另存为新文件:
- 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属性,使用时要注意顺序:必须先设置OpenPassword,再调用LoadFromFile()。如果密码不正确,加载文件时可能抛出SpireException,因此可以用try/except捕获异常,避免程序直接中断。
下面的示例遍历候选密码,尝试打开指定文件并判断密码是否正确:
- 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
复制代码
这种方式适合在已有合法授权候选密码的情况下验证密码,实际使用时不要把密码尝试用于未经授权的文件。
四、解除Excel工作簿的密码保护
如果需要对已加密的Excel文件继续处理,或者希望移除打开密码,可以在使用正确密码加载工作簿后调用UnProtect()解除保护。原文示例先用Workbook.IsPasswordProtected(inputFile)判断文件是否受密码保护,再决定是否执行解密流程:
- 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()直接接收文件路径并返回布尔值,可作为解密前的检查步骤。解除密码保护的前提是能够用正确密码打开工作簿;调用UnProtect()后还需要SaveToFile()保存,生成的文件才会真正移除原有打开密码。
五、批量加密文件夹中的Excel文档
当需要处理的Excel文件较多时,逐个加载并设置密码比较耗时。可以结合os.walk()遍历指定目录,将加密操作放进循环中。下面的示例遍历excel_files文件夹,为其中的.xlsx和.xls文件设置统一打开密码,并在原文件名前添加enc_前缀保存结果:
- 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(),最后保存处理结果。
六、实用技巧与注意事项
密码需要妥善管理。加密时设置的打开密码,就是后续加载文件时需要提供的密码。实际项目中建议把密码放在安全的配置或密钥管理服务中,不要直接硬编码在脚本里。
处理前建议备份原始文件。加密和解密都会改变工作簿的密码保护状态,最好把结果另存为新文件,保留原始文件以便检查或重新处理。
每个工作簿处理完成后调用Dispose(),批量处理多个文件时尤其重要,可以减少资源持续占用。密码不正确时,可以用try/except SpireException捕获加载异常,避免单个文件失败导致整个批处理任务中断。
最后要注意功能边界:本文介绍的是工作簿打开密码,并不等同于限制用户修改工作表结构或编辑特定单元格。实际使用时,应根据保护目标选择对应功能。
总结来说,Spire.XLS for Python可以通过Protect()设置打开密码,通过OpenPassword配合LoadFromFile()打开加密工作簿,通过UnProtect()解除密码保护;结合os.walk()和IsPasswordProtected(),还可以自动完成批量加密或解密。把这些方法用于日常文档处理流程,可以减少手动设置密码的工作量,也便于管理敏感Excel文件。 |