如何使用Python检测xlsx文件是否受密码保护?
用Python检测Excel密码保护并请求密码的实现
所需依赖
先安装必要的库:
pip install openpyxl msoffcrypto-tool
实现步骤
1. 检测Excel文件是否加密
使用msoffcrypto-tool可以直接检测Office文件(包括Excel)是否被密码保护,无需解析文件内容:
import msoffcrypto import os def is_excel_encrypted(file_path): if not os.path.exists(file_path): raise FileNotFoundError(f"文件 {file_path} 不存在") with open(file_path, "rb") as f: try: office_file = msoffcrypto.OfficeFile(f) return office_file.is_encrypted() except Exception: # 非标准Office文件默认判定为未加密,可按需调整逻辑 return False
2. 请求密码并解密打开文件
如果检测到文件加密,就提示用户输入密码,尝试解密后用openpyxl读取内容:
import getpass from openpyxl import load_workbook import tempfile def open_encrypted_excel(file_path): if not is_excel_encrypted(file_path): return load_workbook(file_path) # 循环请求密码直到正确 while True: password = getpass.getpass("请输入Excel文件的密码:") try: with open(file_path, "rb") as f: office_file = msoffcrypto.OfficeFile(f) office_file.load_key(password=password) # 解密到临时文件 with tempfile.NamedTemporaryFile(suffix=".xlsx", delete=False) as temp_f: office_file.decrypt(temp_f) temp_path = temp_f.name # 加载解密后的文件并清理临时文件 wb = load_workbook(temp_path) os.unlink(temp_path) return wb except Exception: print("密码错误,请重新输入!") # 示例调用 if __name__ == "__main__": excel_path = "your_file.xlsx" try: wb = open_encrypted_excel(excel_path) print("Excel文件成功打开!") sheet = wb.active print(f"首个工作表名称:{sheet.title}") except Exception as e: print(f"处理失败:{str(e)}")
注意事项
- 该方案优先支持
.xlsx格式,旧版.xls文件可替换openpyxl为xlrd(需注意xlrd仅支持旧版.xls),配合msoffcrypto-tool的解密逻辑使用。 getpass.getpass会隐藏输入的密码,比普通input更安全。- 临时文件使用后立即删除,避免残留解密后的明文内容。
内容的提问来源于stack exchange,提问作者Prajna
相关产品推荐
相关产品推荐

