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

