前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教你用Python拆分表格并发送邮件

教你用Python拆分表格并发送邮件

作者头像
朱小五
发布2020-01-16 11:27:03
1.9K0
发布2020-01-16 11:27:03
举报
文章被收录于专栏:凹凸玩数据凹凸玩数据

大家好,我是11haoren。

周末看了「凹凸玩数据」交流群内Huang Supreme的分享,有一篇写到了日常拆表操作挺有意思的。

决定举一反三一下,ta拆成sheet,那我就拆成工作簿,如果能拆完直接发邮件给不同的人就更有意思了。

照葫芦画个瓢。


本人在huang的文末一张表拆成多个sheet的基础上,修改了代码,可实现一表拆成多个工作簿。

因为平时经常要拆成工作簿,拆完还要发给不同的对象,工作又使用outlook发邮件,所以本文调用outlook账号进行邮件的发送作为示例,如果想调用其他邮箱可参见文末参考链接,你也可以举一反三。

01

一表拆成多个表

展示一下‘葫芦’。

huang的拆表代码是我能找到的最简洁的了,ta首先用 ExcelWriter 生成一个拆完表后的容纳工作簿,然后调用了 For 循环对某一列进行遍历,area_list 取自表格的某一列,这一列有多少种因子,就拆成多少个表,例如北京、深圳等等。

最后通过循环每一个因子生成一个表,写入之前建好的工作簿中直至循环结束。

小提示:python对空格敏感,不信你把writer.save和上一行对齐看看效果是什么样的。

(大表)

(拆分表)

代码语言:javascript
复制
import pandas as pd
import xlsxwriter
import xlrd
data = pd.read_excel(r"C:\Users\PycharmProjects\拆分自动邮件发送\chaifen.xlsx", encoding='gbk')
area_list = list(set(data['店铺']))
writer = pd.ExcelWriter(r"C:\Users\PycharmProjects\拆分自动邮件发送\拆好的表1.xlsx", engine='xlsxwriter')
data.to_excel(writer, sheet_name="总表", index=False)
# 遍历
for j in area_list:
    df = data[data['店铺'] == j]
    df.to_excel(writer, sheet_name=j, index=False)
writer.save()  # 一定要加上这句代码,“拆好的表”才会显示出来     

参考:https://me.csdn.net/weixin_41261833

02

一表拆成多个工作簿

画个‘瓢’。

拆成多个表的关键步骤在于怎么生成表,huang用to_excel(),类比可得,拆成多个工作簿的关键步骤在于怎么生成工作簿,用ExcelWriter(),结合遍历,给每个因子都生成一个工作簿,并写入文件夹就完成了吗?

不,每个工作簿不能重名,因此还需要用变量的方式给文件进行命名,f'能让{}内的功能生效。

发现此处的writer.save和上一个的差别了吗?

代码语言:javascript
复制
data = pd.read_excel(r"C:\Users\PycharmProjects\拆分自动邮件发送\chaifen.xlsx", encoding='gbk')
area_list = list(set(data['店铺']))
# 遍历
for j in area_list:
    df = data[data['店铺'] == j]
    writer = pd.ExcelWriter(f'{str( j )} 拆分自动邮件发送.xlsx', engine='xlsxwriter')# 用变量进行文件名称
    df.to_excel(writer, sheet_name=j, index=False)
    writer.save()    

03

分别发送和抄送给多个人

发'瓢'。

建一个附件和收件人的索引,用之前给文件命名的变量j ,索引到收件人'Rec'列中'店铺'列等于 j的行。

最后构建邮件发送的函数,包括收件人、抄送人、附件、正文等,从拆分到邮件整个过程不超过1分钟。

代码语言:javascript
复制
import pandas as pd
import xlrd
data = pd.read_excel(r"C:\Users\PycharmProjects\拆分自动邮件发送\chaifen.xlsx", encoding='gbk')
data2 = pd.read_excel(r"C:\Users\PycharmProjects\拆分自动邮件发送\邮件人员清单清单.xlsx", converters={'dep2':str, 'Rec':str, 'Cc':str},encoding='gbk')
area_list = list(set(data['店铺']))
# 遍历
for j in area_list:
    df = data[data['店铺'] == j]
    writer = pd.ExcelWriter(f'{str( j )} 拆分自动邮件发送.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name=j, index=False)
    writer.save()  # 一定要加上这句代码,“拆好的表”才会显示出来
for j in area_list:
    def send_mail():
        outlook = win32.Dispatch('Outlook.Application') # 固定写法
        mail_item = outlook.CreateItem(0) # 0: olMailItem
        mail_item.to = list(data2['Rec'][data2['店铺'] == j])[0] #收件人
        mail_item.cc = list(data2['Cc'][data2['店铺'] == j]) [0] #抄送人
        # mail.Recipients.Add(addressee)
        mail_item.Subject = 'Mail Test5'+'you are the best'
        mail_item.BodyFormat = 2          # 2: Html format
        mail_item.HTMLBody  = '''
            <H2>Hello, This is a test mail.</H2>
            Hello Guys. 
            Do you want to come with us?
            '''

        mail_item.Attachments.Add(r'C:\Users\PycharmProjects\拆分自动邮件发送'+f'\{str( j )} 拆分自动邮件发送.xlsx', 1, 1, f'{str( j )} 拆分自动邮件发送.xls')
        mail_item.Send()
    if __name__ == '__main__':
        send_mail()
        print('success')

成功√

参考:https://blog.csdn.net/qq_20417499/article/details/80566265

获取数据:后台回复“邮件01”

作者:11haoren,同时感谢Huang Supreme的分享。

公众号「凹凸玩数据」,有趣的不像个技术号~

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 凹凸数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档