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
相关产品推荐
相关产品推荐

