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

