В ходе учебного процесса была реализована автоматизация индивидуальной нарезки файлов Excel. Это является очень полезным инструментом в современное время. У крупных компаний, как правило большое количество клиентов, информация о этих клиентов очень часто храниться в Excel файлах. Данная программа, очень быстро может разделить большой файл с данными о клиентах на файлы в которых будет храниться данные о нужных нам клиентах.
Ниже представлена реализация автоматизации индивидуальной нарезки файлов Excel и их распространение с помощью Pandas и Outlook.
import datetime import os import shutil from pathlib import Path import pandas as pd import win32com.client as win32 ## Установить формат даты today_string = datetime.datetime.today().strftime('%m%d%Y_%I%p') today_string2 = datetime.datetime.today().strftime('%b %d, %Y') ## Установка имен папок для вложений и архивирования attachment_path = Path.cwd() / 'data' / 'attachments' archive_dir = Path.cwd() / 'archive' src_file = Path.cwd() / 'data' / 'customers.xlsx' df = pd.read_excel(src_file) df.head() customer_group = df.groupby('CUSTOMER_ID') for ID, group_df in customer_group: print(ID) ## Запишите каждый идентификатор, группу в отдельные файлы Excel и используйте идентификатор, ## чтобы назвать каждый файл с сегодняшней датой 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))) df2 = pd.DataFrame(attachments, columns=['CUSTOMER_ID', 'FILE']) email_merge = pd.merge(df, df2, how='left') combined = email_merge[ ['CUSTOMER_ID', 'EMAIL', 'FILE'] ].drop_duplicates() # Отправка индивидуальных отчетов по электронной почте соответствующим получателям 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) # Показать электронную почту mail.Display(True) # Отправка mail.Send() email_sender = EmailsSender() for index, row in combined.iterrows(): email_sender.send_email(row['EMAIL'], row['FILE']) # Переместить файлы в архив for f in attachments: shutil.move(f[1], archive_dir)