Python自动化办公:Excel数据拆分与Outlook自动发邮件实战
本文介绍如何使用Python自动化处理Excel数据拆分与邮件发送任务。通过pandas库将主Excel文件按用户ID分组生成独立文件,利用win32com库调用Outlook接口,自动将生成的Excel文件作为附件发送给指定邮箱用户,实现批量办公自动化。
需求
任务目标是向约500名用户发送包含Excel附件的电子邮件。操作流程要求从主Excel文件中提取数据,按用户维度拆分生成各自专属的文件,随后将这些文件作为附件发送给对应的收件人。
需求解析

整体流程如示意图所示:首先对Excel数据进行拆分,提取出对应的邮件地址及用户数据信息,随后将这些信息自动添加到邮件附件中完成发送。
代码实现
首先观察源Excel数据的具体格式。
import datetime
import os
import shutil
from pathlib import Path
import pandas as pd
src_file = Path.cwd() / 'data' / 'Example4.xlsx'
df = pd.read_excel(src_file)
df.head()

数据显示,CUSTOMER_ID字段作为唯一的用户标识。我们将依据该字段进行数据分组,结果如下所示。
customer_group = df.groupby('CUSTOMER_ID')
for ID, group_df in customer_group:
print(ID)
>>>Output>>>
A1000
A1001
A1002
A1005
...
接着查看用户A1005对应的具体数据形式。

接下来,程序将为每一位用户创建独立的Excel文件,这些文件后续将作为邮件附件使用。
attachment_path = Path.cwd() / 'data' / 'attachments'
today_string = datetime.datetime.today().strftime('%m%d%Y_%I%p')
attachments = []
for ID, group_df in customer_group:
attachment = attachment_path / f'{ID}_{today_string}.xlsx'
group_df.to_excel(attachment, index=False)
attachments.append((ID, str(attachment)))
查看变量attachments中存储的数据内容,该列表记录了用户ID与生成的文件路径。
[('A1000',
'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1000_01162021_12PM.xlsx'),
('A1001',
'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1001_01162021_12PM.xlsx'),
('A1002',
'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1002_01162021_12PM.xlsx'),
('A1005',
'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1005_01162021_12PM.xlsx')]
最后,通过将DataFrame进行合并操作,生成包含电子邮件地址的文件列表。
email_merge = pd.merge(df, df2, how='left')
combined = email_merge[['CUSTOMER_ID', 'EMAIL', 'FILE']].drop_duplicates()
合并后的DataFrame结构如下所示。

此时,我们已经收集了客户名单、对应的电子邮件地址以及生成的附件文件,接下来即可通过Outlook发送电子邮件。
import win32com.client as win32
today_string2 = datetime.datetime.today().strftime('%b %d, %Y')
class EmailsSender:
def __init__(self):
self.outlook = win32.Dispatch('outlook.application')
def send_email(self, to_email_address, attachment_path):
mail = self.outlook.CreateItem(0)
mail.To = to_email_address
mail.Subject = today_string2 + ' Report'
mail.Body = """Please find today's report attached."""
mail.Attachments.Add(Source=attachment_path)
# Use this to show the email
#mail.Display(True)
# Uncomment to send
#mail.Send()
利用上述定义的类,可以生成电子邮件并成功附加Excel文件。
同时注意到代码中使用了win32库,关于该库的具体用法将在后续文章中详细展开。
email_sender = EmailsSender()
for index, row in combined.iterrows():
email_sender.send_email(row['EMAIL'], row['FILE'])

最后,将所有生成的Excel文件归档至指定目录,以便后续进行审查或比对。
archive_dir = Path.cwd() / 'archive'
for f in attachments:
shutil.move(f[1], archive_dir)
至此,编码工作结束,整体实现逻辑较为简洁。
到此这篇关于Python自动化办公之Excel拆分与自动发邮件的文章就介绍到这了,更多相关Python自动化办公内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









