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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:04