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

如何用Python在Outlook邮件中插入带格式的动态Excel表格?

解决方案

核心改进点

  • 动态识别每个表格的有效数据行数
  • 批量生成带原始格式的表格图片
  • 按指定顺序拼接邮件内容

完整代码

import sys
from pathlib import Path
import win32com.client as win32
from PIL import ImageGrab
import os

# 初始化路径与COM对象
excel_path = str(Path.cwd() / 'master_file.xlsm')
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(excel_path)
ws = wb.Worksheets(1)
win32c = win32.constants

# 定义三个表格的列范围与临时图片存储路径
tables = [
    {"col_range": "A:R", "img_path": str(Path.cwd() / 'table1.png')},
    {"col_range": "S:AJ", "img_path": str(Path.cwd() / 'table2.png')},
    {"col_range": "AK:BD", "img_path": str(Path.cwd() / 'table3.png')}
]

# 遍历处理每个表格:动态获取范围并生成带格式图片
for table in tables:
    # 获取当前表格列的起始单元格(A1/S1/AK1)
    start_cell = ws.Range(table["col_range"]).Cells(1, 1)
    # 向下查找最后一个非空单元格,确定有效行数
    last_row = start_cell.End(win32c.xlDown).Row
    # 构建完整的数据范围
    data_range = ws.Range(f"{start_cell.Address}:{ws.Range(table['col_range']).Cells(last_row, 1).Address}")
    # 复制为图片(保留Excel原有格式)
    data_range.CopyPicture(Appearance=win32c.xlScreen, Format=win32c.xlBitmap)
    img = ImageGrab.grabclipboard()
    img.save(table["img_path"])

# 初始化Outlook邮件
outlook = win32.gencache.EnsureDispatch('Outlook.Application')
new_mail = outlook.CreateItem(0)
new_mail.To = 'person@email.com'

# 按要求顺序构建邮件HTML内容片段
body_parts = [
    "<h2>开头说明文本</h2>",
    f'<img src="cid:{Path(tables[0]["img_path"]).name}">',
    "<p>表格1与表格2之间的过渡文本</p>",
    f'<img src="cid:{Path(tables[1]["img_path"]).name}">',
    "<p>表格2与表格3之间的过渡文本</p>",
    f'<img src="cid:{Path(tables[2]["img_path"]).name}">',
    "<h3>结尾总结文本</h3>"
]

# 将图片作为内嵌附件添加,并设置CID确保邮件内正常显示
for table in tables:
    att = new_mail.Attachments.Add(Source=table["img_path"])
    att.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", Path(table["img_path"]).name)

# 拼接所有内容并设置邮件HTML正文
new_mail.HTMLBody = "<br><br>".join(body_parts)
new_mail.Display()

# 清理资源与临时文件
wb.Close(SaveChanges=False)
excel.Quit()
for table in tables:
    if os.path.exists(table["img_path"]):
        os.remove(table["img_path"])

关键细节说明

  • 动态行数识别:通过start_cell.End(win32c.xlDown).Row自动定位每个表格的最后一行,无需硬编码固定行数。
  • 格式完整保留:使用CopyPicture以屏幕外观模式复制表格,完整保留Excel中的单元格颜色、边框、字体等格式。
  • 图片内嵌显示:利用CID标记将图片作为邮件内嵌资源,避免图片显示依赖外部链接或附件下载。
  • 自动清理:邮件生成后自动删除临时图片文件,避免本地冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:45:30