教你用Python拆分表格並發送郵件

  • 2020 年 1 月 16 日
  • 筆記

大家好,我是11haoren。

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

決定舉一反三一下,ta拆成sheet,那我就拆成工作簿,如果能拆完直接發郵件給不同的人就更有意思了。

照葫蘆畫個瓢。


本人在huang的文末一張表拆成多個sheet的基礎上,修改了程式碼,可實現一表拆成多個工作簿。

因為平時經常要拆成工作簿,拆完還要發給不同的對象,工作又使用outlook發郵件,所以本文調用outlook帳號進行郵件的發送作為示例,如果想調用其他郵箱可參見文末參考鏈接,你也可以舉一反三。

01

一表拆成多個表

展示一下『葫蘆』。

huang的拆表程式碼是我能找到的最簡潔的了,ta首先用 ExcelWriter 生成一個拆完表後的容納工作簿,然後調用了 For 循環對某一列進行遍歷,area_list 取自表格的某一列,這一列有多少種因子,就拆成多少個表,例如北京、深圳等等。

最後通過循環每一個因子生成一個表,寫入之前建好的工作簿中直至循環結束。

小提示:python對空格敏感,不信你把writer.save和上一行對齊看看效果是什麼樣的。

(大表)

(拆分表)

import pandas as pd  import xlsxwriter  import xlrd  data = pd.read_excel(r"C:UsersPycharmProjects拆分自動郵件發送chaifen.xlsx", encoding='gbk')  area_list = list(set(data['店鋪']))  writer = pd.ExcelWriter(r"C:UsersPycharmProjects拆分自動郵件發送拆好的表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和上一個的差別了嗎?

data = pd.read_excel(r"C:UsersPycharmProjects拆分自動郵件發送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分鐘。

import pandas as pd  import xlrd  data = pd.read_excel(r"C:UsersPycharmProjects拆分自動郵件發送chaifen.xlsx", encoding='gbk')  data2 = pd.read_excel(r"C:UsersPycharmProjects拆分自動郵件發送郵件人員清單清單.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:UsersPycharmProjects拆分自動郵件發送'+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