51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 933|回复: 1
打印 上一主题 下一主题

[转贴] Python自动化办公之Excel拆分并自动发邮件

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:02
  • 签到天数: 1046 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-4-26 09:51:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    需求
      需要向大约 500 名用户发送带有 Excel 附件的电子邮件,同时必须按用户从主 Excel 文件中拆分数据以创建他们自己的特定文件,然后将该文件通过电子邮件发送给正确的用户。
      需求解析

    大致的流程就是上图,先拆分 Excel 数据,提取出对应的邮件地址和用户的数据信息,再自动添加到邮件的附件当中。
      代码实现
      首先我们先来看下我们手中 Excel 的数据形式是怎么样的。
    1.  import datetime
    2.   import os
    3.   import shutil
    4.   from pathlib import Path
    5.   import pandas as pd
    6.   src_file = Path.cwd() / 'data' / 'Example4.xlsx'
    7.   df = pd.read_excel(src_file)
    8.   df.head()
    复制代码

    可以看出,CUSTOMER_ID 就是那个唯一的用户 ID,下面我们以该字段来分组,得到如下数据。
    1. customer_group = df.groupby('CUSTOMER_ID')
    2.   for ID, group_df in customer_group:
    3.       print(ID)
    4.   >>>Output>>>
    5.   A1000
    6.   A1001
    7.   A1002
    8.   A1005
    9.   ...
    复制代码
    我们再来看下用户 A1005 所对应的数据形式。


    接下来我们就为每一个用户创建一个 Excel,后面就可以作为附件使用。
    1.  attachment_path = Path.cwd() / 'data' / 'attachments'
    2.   today_string = datetime.datetime.today().strftime('%m%d%Y_%I%p')
    3.   attachments = []
    4.   for ID, group_df in customer_group:
    5.       attachment = attachment_path / f'{ID}_{today_string}.xlsx'
    6.       group_df.to_excel(attachment, index=False)
    7.       attachments.append((ID, str(attachment)))
    复制代码
    我们来看下变量 attachments 所包含的数据吧。

    1.  [('A1000',
    2.   'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1000_01162021_12PM.xlsx'),
    3.   ('A1001',
    4.   'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1001_01162021_12PM.xlsx'),
    5.   ('A1002',
    6.   'c:\\Users\\luobo\\notebooks\\2020-
    7. 10\\data\\attachments\\A1002_01162021_12PM.xlsx'),
    8.   ('A1005',
    9.   'c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1005_01162021_12PM.xlsx')]
    复制代码
    最后我们可以通过将 DataFrame 合并在一起来生成带有电子邮件地址的文件列表。

    1. email_merge = pd.merge(df, df2, how='left')
    2.   combined = email_merge[['CUSTOMER_ID', 'EMAIL', 'FILE']].drop_duplicates()
    复制代码
    得到的 DataFrame 如下:


    我们已经收集了客户名单、他们的电子邮件和附件,现在我们就可以用 Outlook 发送一封电子邮件了。
    1. import win32com.client as win32
    2.   today_string2 = datetime.datetime.today().strftime('%b %d, %Y')
    3.   class EmailsSender:
    4.       def __init__(self):
    5.           self.outlook = win32.Dispatch('outlook.application')
    6.       def send_email(self, to_email_address, attachment_path):
    7.           mail = self.outlook.CreateItem(0)
    8.           mail.To = to_email_address
    9.           mail.Subject = today_string2 + ' Report'
    10.           mail.Body = """Please find today's report attached."""
    11.           mail.Attachments.Add(Source=attachment_path)
    12.           # Use this to show the email
    13.           #mail.Display(True)
    14.           # Uncomment to send
    15.           #mail.Send()
    复制代码
     通过上面这个简单的类,我们可以生成电子邮件并附加 Excel 文件。
      同时我们还注意到,这里使用了 win32,关于这个库的具体使用,我们在下次的文章中再具体说明吧。
    1.  email_sender = EmailsSender()
    2.   for index, row in combined.iterrows():
    3.       email_sender.send_email(row['EMAIL'], row['FILE'])
    复制代码

    最后,我们再把所有生成的 Excel 存档,以备后面审查、比对等。
    1.  archive_dir = Path.cwd() / 'archive'
    2.   for f in attachments:
    3.       shutil.move(f[1], archive_dir)
    复制代码
    至此,我们的编码结束,整体来看还是比较简单的。



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 02:04 , Processed in 0.067403 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表