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

Python遍历受密码保护的XLSB/XLSM文件时出错问题求助

解决受密码保护的.xlsm/.xlsb文件转CSV并合并的问题

针对你提到的「脚本无法处理以文件名前5位为密码的加密.xlsm/.xlsb文件」的问题,我整理了一套优化方案,通过调用Excel COM对象来处理加密文件,同时保留转CSV、合并文件并溯源原始文件名的功能。

问题背景回顾

现有Python脚本可正常处理未加密的.xlsm与.xlsb格式文件,但在处理文件名前5位作为密码的受密码保护文件时出现错误,需求是实现加密文件的读取、转CSV、合并并保留原始文件名。

优化后的完整代码

import pandas as pd
import os
import glob
import win32com.client
from win32com.client import constants

def convert_encrypted_excel_to_csv(file_path, output_dir):
    # 提取文件名前5位作为密码
    file_name = os.path.basename(file_path)
    password = file_name[:5]
    excel_app = win32com.client.Dispatch("Excel.Application")
    excel_app.Visible = False  # 后台静默运行,不弹出Excel窗口
    excel_app.DisplayAlerts = False  # 关闭保存/覆盖等弹窗提示
    
    try:
        # 打开受密码保护的工作簿
        wb = excel_app.Workbooks.Open(file_path, Password=password)
        # 遍历工作簿内所有工作表(如果只需要处理第一个表,可改为wb.Sheets(1))
        for sheet in wb.Sheets:
            # 构造CSV文件名:原始文件名_工作表名.csv,避免重名
            csv_file_name = f"{os.path.splitext(file_name)[0]}_{sheet.Name}.csv"
            csv_path = os.path.join(output_dir, csv_file_name)
            # 保存为CSV格式
            sheet.SaveAs(csv_path, constants.xlCSV)
        wb.Close(SaveChanges=False)
        print(f✅ 成功处理文件:{file_path}")
    except Exception as e:
        print(f❌ 处理文件{file_path}时出错:{str(e)}")
    finally:
        excel_app.Quit()
        # 释放COM对象,彻底关闭Excel进程
        del excel_app

def merge_csv_files(csv_dir, output_merge_file):
    all_csv_files = glob.glob(os.path.join(csv_dir, "*.csv"))
    df_list = []
    for csv_file in all_csv_files:
        # 读取CSV文件
        df = pd.read_csv(csv_file)
        # 还原原始Excel文件名(去掉工作表后缀)
        base_name = os.path.basename(csv_file).split("_")[0]
        original_file_name = f"{base_name}.xlsb" if ".xlsb" in csv_file else f"{base_name}.xlsm"
        # 添加原始文件名列,方便数据溯源
        df["原始文件名"] = original_file_name
        df_list.append(df)
    # 合并所有数据,重置索引
    merged_df = pd.concat(df_list, ignore_index=True)
    # 保存合并结果,用utf-8-sig避免中文乱码
    merged_df.to_csv(output_merge_file, index=False, encoding="utf-8-sig")
    print(f📊 合并完成!结果已保存至:{output_merge_file}")

if __name__ == "__main__":
    # 配置你的路径
    input_path = r'C:\Users\user\Desktop\Test Binary'
    output_csv_dir = os.path.join(input_path, "converted_csv")
    output_merge_path = os.path.join(input_path, "merged_result.csv")
    
    # 创建CSV输出目录(不存在则自动创建)
    os.makedirs(output_csv_dir, exist_ok=True)
    
    # 收集所有目标格式文件
    target_files = glob.glob(os.path.join(input_path, "*.xlsm")) + glob.glob(os.path.join(input_path, "*.xlsb"))
    
    # 批量转换加密文件为CSV
    for file in target_files:
        convert_encrypted_excel_to_csv(file, output_csv_dir)
    
    # 合并所有CSV文件
    merge_csv_files(output_csv_dir, output_merge_path)

关键细节说明

  • 加密文件处理:由于pandas原生不支持读取加密的二进制Excel文件(.xlsb/xlsm),这里通过win32com调用本地Excel程序来打开加密文件,这是目前最稳定的解决方案
  • 密码自动匹配:通过file_name[:5]自动提取文件名前5位作为密码,完全匹配你的需求
  • 避免Excel残留:在finally块中强制退出Excel并释放COM对象,防止后台遗留Excel进程占用资源
  • 数据溯源:合并时添加原始文件名列,每个数据行都能追溯到来源的原始Excel文件
  • 格式兼容:同时支持.xlsm和.xlsb两种格式,自动遍历目录内的目标文件

内容的提问来源于stack exchange,提问作者Hatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:13:13