Python 辦公自動化實戰:Excel 批量處理 + 自動發郵件
關鍵詞: Python辦公自動化 ? Pandas ? OpenPyXL ? Email ? 定時任務
摘要: 每月底還在手動處理幾十份Excel報表并郵件發送?快來學習如何用Python全自動完成!本文將手把手教你如何用Python自動合并處理Excel數據,并一鍵發送給領導,徹底解放雙手,效率提升1000%!
一、 場景與需求:告別“表哥”“表姐”的噩夢
…
二、 技術棧與工具
- Python 3.6+
- Pandas: 數據處理的核心庫,用于讀取、合并Excel。
- OpenPyXL / XLsxWriter: 用于讀寫Excel文件。
- smtplib & email: Python內置庫,用于發送郵件。
- schedule (可選): 輕量級的定時任務庫。
三、 實現步驟
步驟 1:安裝必要的庫
在開始之前,請確保通過pip安裝了以下庫:
pip install pandas openpyxl schedule
步驟 2:準備環境 & 配置文件
創建一個項目文件夾,例如 auto_excel_email。
在該文件夾內,再創建一個 reports 文件夾,用于存放所有待處理的部門Excel文件。
創建一個 config.py 文件,用于存放敏感的郵箱配置信息(重要:避免將密碼上傳至Git等平臺)。
config.py 內容如下:
# config.py
# 郵箱服務器配置 - 以QQ郵箱為例,其他郵箱請自行查找SMTP服務器地址和端口
SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465 # QQ郵箱的SSL端口# 發件人郵箱地址和授權碼(注意:不是登錄密碼,是SMTP服務授權碼)
SENDER_EMAIL = "your_email@qq.com"
SENDER_PASSWORD = "your_authorization_code" # 這里填你的SMTP授權碼# 收件人郵箱地址,可以是多個
RECIPIENTS = ["leader1@company.com", "colleague@company.com"]
?? 如何獲取SMTP授權碼?
QQ郵箱:設置 -> 賬戶 -> 開啟POP3/SMTP服務 -> 生成授權碼。
163郵箱:設置 -> POP3/SMTP/IMAP -> 開啟服務 -> 生成授權碼。
公司郵箱:請聯系IT部門。
步驟 3:編寫核心代碼 - Excel批量處理
創建一個名為 main.py 的文件。
# main.py
import pandas as pd
import os
from datetime import datetime
from config import * # 導入配置文件中的變量def merge_excel_reports(folder_path):"""自動合并指定文件夾下的所有Excel文件:param folder_path: 存放Excel文件的文件夾路徑:return: 合并后的DataFrame,以及輸出文件的路徑"""print("開始合并Excel文件...")all_data = []# 遍歷文件夾中的所有文件for file_name in os.listdir(folder_path):if file_name.endswith(('.xlsx', '.xls')): # 支持.xlsx和.xls格式file_path = os.path.join(folder_path, file_name)try:# 讀取Excel文件df = pd.read_excel(file_path)# 添加一列“數據來源”,記錄原始文件名df['數據來源'] = file_name# 將DataFrame添加到列表all_data.append(df)print(f"成功讀取文件: {file_name}")except Exception as e:print(f"讀取文件 {file_name} 時出錯: {str(e)}")if not all_data:print("未找到任何Excel文件,請檢查路徑!")return None, None# 合并所有DataFramemerged_df = pd.concat(all_data, axis=0, ignore_index=True)# 生成輸出文件名,包含當前日期today_str = datetime.now().strftime("%Y%m%d")output_filename = f"銷售匯總報表_{today_str}.xlsx"output_path = os.path.join(os.getcwd(), output_filename)# 保存合并后的數據到新Excel文件try:merged_df.to_excel(output_path, index=False, engine='openpyxl')print(f"合并完成!文件已保存為: {output_filename}")return merged_df, output_pathexcept Exception as e:print(f"保存文件時出錯: {str(e)}")return None, None# 測試一下合并功能
if __name__ == "__main__":report_folder = "./reports" # 報表存放的文件夾merged_data, output_file_path = merge_excel_reports(report_folder)
步驟 4:編寫核心代碼 - 自動發送郵件
在 main.py 中繼續添加以下函數:
# main.py (續)
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplicationdef send_email_with_attachment(subject, body, to_email, attachment_path):"""發送帶附件的郵件:param subject: 郵件主題:param body: 郵件正文:param to_email: 收件人列表:param attachment_path: 附件路徑"""# 創建郵件對象msg = MIMEMultipart()msg['From'] = SENDER_EMAILmsg['To'] = ", ".join(to_email) # 多個收件人用逗號分隔msg['Subject'] = subject# 添加郵件正文msg.attach(MIMEText(body, 'plain', 'utf-8'))# 添加附件if attachment_path:try:with open(attachment_path, "rb") as f:part = MIMEApplication(f.read())part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachment_path))msg.attach(part)print(f"附件 {os.path.basename(attachment_path)} 添加成功。")except Exception as e:print(f"添加附件時出錯: {str(e)}")return False# 連接服務器并發送郵件try:# 使用SSL加密連接server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)server.login(SENDER_EMAIL, SENDER_PASSWORD)server.sendmail(SENDER_EMAIL, to_email, msg.as_string())server.quit()print("郵件發送成功!")return Trueexcept Exception as e:print(f"郵件發送失敗: {str(e)}")return False
步驟 5:整合主流程并添加定時任務
在 main.py 的最后,添加主函數和定時任務邏輯:
# main.py (續)
import schedule
import timedef main_job():"""主任務函數:合并Excel并發送郵件"""print(f"\n--- 開始執行月度報表自動化任務 {datetime.now()} ---")# 1. 合并Excelreport_folder = "./reports"merged_data, output_file_path = merge_excel_reports(report_folder)if output_file_path:# 2. 準備郵件內容today_chinese = datetime.now().strftime("%Y年%m月%d日")email_subject = f【月度銷售匯總報告】{today_chinese}email_body = f"""
尊敬的領導:您好!本郵件由Python機器人自動發送。附件是{today_chinese}的各部門銷售數據匯總報告,由系統自動合并生成,請查收。共計合并了 {len(merged_data['數據來源'].unique())} 個部門的數據,總數據量 {len(merged_data)} 條。祝好!"""# 3. 發送郵件send_email_with_attachment(email_subject, email_body, RECIPIENTS, output_file_path)print("--- 本次任務執行完畢 ---\n")# 如果是直接運行,立即執行一次
if __name__ == "__main__":main_job() # 手動執行一次# --- 可選:設置定時任務 ---# 例如,每月1號早上9點自動執行# schedule.every().month.at("09:00").do(main_job)# 或者每周一早上9點執行# schedule.every().monday.at("09:00").do(main_job)# print("定時任務已啟動,程序將持續運行...")# while True:# schedule.run_pending()# time.sleep(60) # 每分鐘檢查一次
四、 如何使用?
-
1、準備數據:將各部門的Excel報表放入項目下的 reports 文件夾。 **
-
2、配置郵箱:修改 config.py 文件,填入正確的發件人郵箱和授權碼、收件人郵箱。 **
-
**3、運行腳本:在終端執行 python main.py。 **
-
**4、查看結果:腳本會自動生成一個帶日期的總表文件,并發送郵件。查看你的收件箱吧! **
五、 總結與擴展
本項目實現了一個完整的辦公自動化流程。你可以在此基礎上進行擴展:
-
數據清洗:在 merge_excel_reports 函數中,對讀取的每個DataFrame進行數據清洗(如去重、填充空值等)。
-
生成圖表:使用 matplotlib 庫在合并后自動生成統計圖表,并插入Excel中。
-
Web可視化:使用 Flask 或 Streamlit 搭建一個簡單的內部網頁,用于上傳文件和查看報告。
-
異常告警:如果任務執行失敗,自動發送一封告警郵件給自己。
自動化不是為了取代工作,而是為了讓我們從重復勞動中解放出來,去進行更深入的思考和決策。希望這個腳本能成為你職場中的得力助手!
💡 如果文章對你有幫助,記得 點贊 + 收藏 + 評論,我會持續分享更多 Python 辦公自動化實戰案例!