0

0

使用 msoffcrypto 解密并读取密码保护的 Excel 文件

花韻仙語

花韻仙語

发布时间:2025-08-20 17:10:21

|

550人浏览过

|

来源于php中文网

原创

使用 msoffcrypto 解密并读取密码保护的 excel 文件

本文档旨在解决使用 msoffcrypto 库解密密码保护的 Excel (.xls 或 .xlsx) 文件后,使用 pandas 读取时遇到 UnicodeDecodeError 的问题。我们将提供一个完整的代码示例,展示如何正确解密文件并将其加载到 pandas DataFrame 中,同时讨论可能导致问题的原因和相应的解决方案。

解密并读取 Excel 文件

以下代码展示了如何使用 msoffcrypto 解密 Excel 文件,并使用 pandas 读取解密后的数据。

import msoffcrypto
import io
import pandas as pd

def read_decrypted_excel(file_path, password):
    """
    解密并读取密码保护的 Excel 文件。

    Args:
        file_path (str): Excel 文件的路径。
        password (str): 解密密码。

    Returns:
        pandas.DataFrame: 解密后的 Excel 数据,如果解密失败则返回 None。
    """
    decrypted_workbook = io.BytesIO()

    try:
        with open(file_path, 'rb') as file:
            office_file = msoffcrypto.OfficeFile(file)
            office_file.load_key(password=password)
            office_file.decrypt(decrypted_workbook)

        # Reset the buffer position to the beginning
        decrypted_workbook.seek(0)

        # 使用 pd.ExcelFile 避免直接使用 read_excel 时的编码问题
        xls = pd.ExcelFile(decrypted_workbook)

        # 读取第一个 sheet 的数据,如果需要读取其他 sheet,可以指定 sheet_name
        df = xls.parse(xls.sheet_names[0])

        return df

    except msoffcrypto.exceptions.InvalidKeyError:
        print("密码不正确!")
        return None
    except Exception as e:
        print(f"发生错误: {e}")
        return None

# 示例用法
file_path = "test_encrypted.xlsx"  # 替换为你的 Excel 文件路径
password = "test"  # 替换为你的密码

df = read_decrypted_excel(file_path, password)

if df is not None:
    print(df.head())  # 打印 DataFrame 的前几行

代码解释:

  1. 导入必要的库: 导入 msoffcrypto 用于解密,io 用于处理内存中的数据,pandas 用于读取 Excel 文件。
  2. read_decrypted_excel 函数:
    • 接受文件路径和密码作为参数。
    • 创建一个 io.BytesIO 对象 decrypted_workbook,用于存储解密后的数据。
    • 使用 with open(...) 打开文件,确保文件在使用后会被正确关闭。
    • 创建 msoffcrypto.OfficeFile 对象,加载密钥(密码),并解密文件,将解密后的数据写入 decrypted_workbook。
    • 关键步骤: decrypted_workbook.seek(0) 将缓冲区的位置重置到开头,以便 pandas 可以从头开始读取数据。 如果不重置,pandas 会尝试从缓冲区的当前位置开始读取,这会导致错误。
    • 使用 pd.ExcelFile 对象处理解密后的数据,这比直接使用 pd.read_excel 更可靠,尤其是在处理编码问题时。
    • 使用 xls.parse(xls.sheet_names[0]) 读取第一个 sheet 的数据。 可以根据需要修改 sheet_name 参数来读取其他 sheet。
    • 捕获 msoffcrypto.exceptions.InvalidKeyError 异常,以便在密码错误时提供有用的错误消息。
    • 捕获其他异常,并打印错误信息。
  3. 示例用法:
    • 替换 file_path 和 password 为你的实际值。
    • 调用 read_decrypted_excel 函数,并将返回的 DataFrame 存储在 df 中。
    • 如果 df 不为 None,则打印 DataFrame 的前几行。

解决 UnicodeDecodeError

UnicodeDecodeError 通常发生在 pandas 尝试使用错误的编码解码 Excel 文件时。 使用 pd.ExcelFile 对象可以更可靠地处理编码问题,因为它允许 pandas 自动检测编码,或者手动指定编码。

Quillbot
Quillbot

一款AI写作润色工具,QuillBot的人工智能改写工具将提高你的写作能力。

下载

如果仍然遇到 UnicodeDecodeError,可以尝试以下方法:

  1. 检查文件是否损坏: 尝试使用 Microsoft Excel 打开文件,看是否可以正常打开。如果文件损坏,可能需要修复文件。
  2. 尝试不同的编码: 如果知道文件的正确编码,可以在 xls.parse() 方法中指定 encoding 参数。 例如,df = xls.parse(xls.sheet_names[0], encoding='utf-8')。 常见的编码包括 utf-8、latin-1、gbk 等。 但是,通常情况下,让 pandas 自动检测编码是最好的方法。
  3. 更新 pandas 和 openpyxl: 确保你使用的 pandas 和 openpyxl 库是最新版本。 旧版本可能存在一些 bug。
  4. 检查密码是否正确: 确保你使用的密码是正确的。 msoffcrypto.exceptions.InvalidKeyError 异常会告诉你密码是否错误。

注意事项

  • 确保你已经安装了 msoffcrypto-tool 和 pandas 库。 可以使用 pip install msoffcrypto-tool pandas openpyxl 命令安装它们。 openpyxl 是 pandas 读取 Excel 文件所需的依赖项。
  • 此方法适用于使用标准密码保护的 Excel 文件。 对于使用更高级加密方法的 Excel 文件,可能需要使用其他工具
  • 请注意,处理密码保护的文件需要谨慎,确保你拥有合法的权限。

总结

本文档提供了一个完整的解决方案,用于解密并读取密码保护的 Excel 文件,并解决了可能遇到的 UnicodeDecodeError 问题。 通过使用 msoffcrypto 和 pandas 库,可以轻松地解密和读取 Excel 文件,并将其加载到 pandas DataFrame 中进行分析。 记住,正确处理编码问题和确保密码正确是成功的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

65

2025.12.04

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

339

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

415

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

761

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

349

2025.07.23

vsd文件打开方法
vsd文件打开方法

vsd文件打开方法有使用Microsoft Visio软件、使用Microsoft Visio查看器、转换为其他格式等。想了解更多vsd文件相关内容,可以阅读本专题下面的文章。

488

2023.10.30

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

1401

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.07.31

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号