Python自动化办公之Excel拆分与自动发邮件

作者:萝卜大杂烩 时间:2022-05-03 09:05:40 

需求

需要向大约 500 名用户发送带有 Excel 附件的电子邮件,同时必须按用户从主 Excel 文件中拆分数据以创建他们自己的特定文件,然后将该文件通过电子邮件发送给正确的用户

需求解析

Python自动化办公之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()

Python自动化办公之Excel拆分与自动发邮件

可以看出,CUSTOMER_ID 就是那个唯一的用户 ID,下面我们以该字段来分组,得到如下数据

customer_group = df.groupby('CUSTOMER_ID')
for ID, group_df in customer_group:
    print(ID)
>>>Output>>>
A1000
A1001
A1002
A1005
...

我们再来看下用户 A1005 所对应的数据形式

Python自动化办公之Excel拆分与自动发邮件

接下来我们就为每一个用户创建一个 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 如下

Python自动化办公之Excel拆分与自动发邮件

我们已经收集了客户名单、他们的电子邮件和附件,现在我们就可以用 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'])

Python自动化办公之Excel拆分与自动发邮件

最后,我们再把所有生成的 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
  • asp之家 网络编程 m.aspxhome.com