使用Python提取Excel嵌入的.msg附件并嵌入另一Excel的方案咨询
解决方案
前置依赖
先安装需要的第三方库:
pip install openpyxl olefile xlwings
步骤1:从原Excel中提取.msg格式附件
Excel的嵌入对象默认以OLE二进制包的形式存储在文件内部的xl/embeddings路径下,我们可以通过openpyxl读取嵌入对象,再用olefile解析出.msg实体文件:
import openpyxl import olefile import os # 配置路径 src_excel_path = "你的原文件路径.xlsx" save_msg_path = "提取出的附件.msg" # 加载原Excel wb = openpyxl.load_workbook(src_excel_path) # 遍历所有嵌入对象 for obj in wb.ole_objects: ole_bin = obj._data # 写入临时bin文件用于ole解析 with open("temp_ole.bin", "wb") as f: f.write(ole_bin) # 解析ole文件提取msg if olefile.isOleFile("temp_ole.bin"): ole = olefile.OleFileIO("temp_ole.bin") # .msg文件在OLE包内的流名称为__o if ole.exists("__o"): msg_data = ole.openstream("__o").read() with open(save_msg_path, "wb") as msg_f: msg_f.write(msg_data) print(f".msg附件已提取到{save_msg_path}") # 删除临时文件 os.remove("temp_ole.bin")
注意:如果Excel内有多个嵌入对象,可以添加文件名判断逻辑筛选需要的.msg文件
步骤2:将.msg文件嵌入新Excel
我们使用xlwings调用Excel原生COM接口完成嵌入,兼容所有格式的附件嵌入需求:
import xlwings as xw # 配置路径 target_excel_path = "目标Excel路径.xlsx" msg_path = "提取出的附件.msg" # 启动Excel(设置visible=False可以后台运行) with xw.App(visible=True, add_book=False) as app: # 打开目标Excel(如果是新建文件可以用wb = app.books.add()) wb = app.books.open(target_excel_path) # 选择要嵌入附件的工作表 sht = wb.sheets["Sheet1"] # 嵌入附件,left/top为嵌入位置,width/height为显示图标大小 sht.api.OLEObjects().Add( Filename=msg_path, Link=False, DisplayAsIcon=True, Left=100, Top=100, Width=100, Height=50 ) # 保存文件 wb.save() wb.close() print("附件已嵌入完成")
注意事项
- xlwings需要本地安装Microsoft Excel软件,仅适用于Windows、macOS桌面环境
- 如果需要在无桌面环境的Linux服务器运行,可以手动构造OLE对象包写入新Excel的
xl/embeddings路径,实现逻辑相对复杂,优先推荐上述桌面环境方案
内容的提问来源于stack exchange,提问作者Rupal Shah
相关产品推荐
相关产品推荐

