Python自动化办公之Excel拆分与自动发邮件
作者:萝卜大杂烩 时间:2022-05-03 09:05:40
需求
需要向大约 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 就是那个唯一的用户 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 所包含的数据吧
[('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)
至此,我们的编码结束,整体来看还是比较简单的
来源:https://mp.weixin.qq.com/s/EF6Vi2zdADi7E7V4hHp_iQ
标签:Python,Excel拆分,邮件
0
投稿
猜你喜欢
js中arguments的用法(实例讲解)
2024-06-15 08:20:08
从 msxml6.dll 中获取 DOMDocument 对象的方法与属性
2009-02-22 18:46:00
Pycharm 2020年最新激活码(亲测有效)
2023-07-24 00:42:14
如何在python中执行另一个py文件
2022-04-09 14:57:51
Python读取实时数据流示例
2023-09-11 14:20:00
解决Pycharm运行时找不到文件的问题
2023-06-15 00:26:39
python PyQt5 爬虫实现代码
2022-10-19 20:24:42
Python运算符重载详解及实例代码
2021-07-11 23:48:41
Pandas分组与排序的实现
2022-11-27 14:13:18
vc6编写python扩展的方法分享
2022-05-12 16:39:30
vue3的介绍和两种创建方式详解(cli和vite)
2023-07-02 16:51:31
Numpy(Pandas)删除全为零的列的方法
2022-07-23 13:13:59
详解python3中zipfile模块用法
2021-10-19 02:10:25
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2022-05-14 11:37:17
Python Tornado批量上传图片并显示功能
2023-08-07 22:33:21
Python定时任务APScheduler的实例实例详解
2023-03-18 01:33:05
python神经网络Keras实现LSTM及其参数量详解
2023-02-09 14:02:22
Python中利用sorted()函数排序的简单教程
2022-09-13 20:26:36
如何制作K线图?
2010-06-29 17:25:00
使用vue打包时gzip压缩的两种方案
2024-05-21 10:29:45