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

如何用Python将含表格的Outlook邮件导出为Excel表格?

如何将Outlook邮件中的表格导出到Excel(Python实现)

问题背景

我想用Python把Outlook里带表格的邮件导出到Excel,已经写好了读取收件箱最后一封邮件的代码,但邮件正文(message.body)是用换行符分隔的字符串,直接导出到Excel会全部挤在一个单元格里。邮件实际包含两个表格:「今日活动详情」和「次日活动计划」,需要把这两个表格分别导出到Excel的对应位置。

我已经写好的邮件读取代码:

import win32com.client
import os
from datetime import datetime, timedelta

outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")

# 打印所有邮箱账户(可选,确认用哪个邮箱)
for account in mapi.Accounts:
    print(account.DeliveryStore.DisplayName)

# 获取收件箱
inbox = mapi.GetDefaultFolder(6)
messages = inbox.Items
# 获取最后一封邮件
message = messages.GetLast()

邮件正文示例(message.body):

'Team,\r\n\r\n \r\n\r\nToday’s Activity Details: 04-03-2023\r\n\r\nS/N\r\n\r\nPackage/Area\r\n\r\nActivity Details\r\n\r\nStatus\r\n\r\nEngineer\r\n\r\nContract\r\n\r\n1\r\n\r\nG12\r\n\r\nPlant LLF and Routine Job\r\n\r\nCompleted\r\n\r\nSam\r\n\r\nMark\r\n\r\nNext Working day’s Activity Planning: 06-03-2023\r\n\r\n1\r\n\r\nG13\r\n\r\nPlant LLF and Routine Job\r\n\r\nPending\r\n\r\nSam\r\n\r\nMark\r\n\r\n2\r\n\r\nG14\r\n\r\nPM of Comp\r\n\r\nPending\r\n\r\n \r\n\r\n \r\n\r\nRegards.\r\n'

之前尝试的导出代码(仅导出到单个单元格):

import openpyxl
wb = openpyxl.Workbook() 
sheet = wb.active 

c1 = sheet.cell(row = 1, column = 1) 
c1 = message.body
wb.save("demo.xlsx")

解决方案

步骤1:解析邮件正文,提取表格数据

先把正文按换行符拆分,过滤掉空行和无关内容(比如问候、落款),再定位两个表格的起止位置。

步骤2:将数据整理成二维表格结构

每个表格有6列,把拆分后的内容每6个元素作为一行,组成二维列表,对应Excel的行和列。

步骤3:写入Excel文件

用openpyxl逐行逐列写入数据,两个表格间隔几行放置,方便查看。

完整代码:

import win32com.client
import openpyxl

# ---------------------- 1. 读取Outlook邮件 ----------------------
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")

# 获取收件箱
inbox = mapi.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetLast()

# ---------------------- 2. 解析邮件正文 ----------------------
# 按换行符拆分正文,过滤空行和纯空格行
lines = [line.strip() for line in message.body.split('\r\n') if line.strip()]

# 动态定位表格起始行(适配不同日期的邮件)
today_start_idx = None
for idx, line in enumerate(lines):
    if "Today’s Activity Details" in line:
        today_start_idx = idx + 1
        # 顺便提取日期作为表格标题
        today_title = line
        break

next_day_start_idx = None
for idx, line in enumerate(lines):
    if "Next Working day’s Activity Planning" in line:
        next_day_start_idx = idx + 1
        next_day_title = line
        break

# 定位落款位置,作为表格结束点
regards_idx = lines.index("Regards.")

# 提取两个表格的原始数据
today_table_data = lines[today_start_idx : next_day_start_idx - 1]
next_day_table_data = lines[next_day_start_idx : regards_idx]

# 把一维列表转换成6列的二维表格
def convert_to_table(data_list):
    table = []
    for i in range(0, len(data_list), 6):
        row = data_list[i:i+6]
        table.append(row)
    return table

today_table = convert_to_table(today_table_data)
next_day_table = convert_to_table(next_day_table_data)

# ---------------------- 3. 写入Excel ----------------------
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = "活动计划表"

# 写入今日活动表格
row_num = 1
sheet.cell(row=row_num, column=1, value=today_title)
row_num += 1
for row in today_table:
    for col_num, cell_value in enumerate(row, 1):
        sheet.cell(row=row_num, column=col_num, value=cell_value)
    row_num += 1

# 空两行,写入次日活动表格
row_num += 2
sheet.cell(row=row_num, column=1, value=next_day_title)
row_num += 1
for row in next_day_table:
    for col_num, cell_value in enumerate(row, 1):
        sheet.cell(row=row_num, column=col_num, value=cell_value)
    row_num += 1

# 保存文件
wb.save("活动计划表.xlsx")
print("导出完成!")

代码说明

  • 用字符串包含的方式动态定位表格起始行,适配每天日期不同的邮件
  • convert_to_table函数负责把零散的行数据整理成标准的6列表格结构
  • 写入Excel时自动添加表格标题,两个表格间隔两行,排版更清晰
  • 确保已安装依赖库:
    pip install pywin32 openpyxl
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:07:54