Python 办公自动化实战:Excel 批量处理 + 自动发邮件

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安装了以下库:

bash 复制代码
pip install pandas openpyxl schedule

步骤 2:准备环境 & 配置文件

创建一个项目文件夹,例如 auto_excel_email。

在该文件夹内,再创建一个 reports 文件夹,用于存放所有待处理的部门Excel文件。

创建一个 config.py 文件,用于存放敏感的邮箱配置信息(重要:避免将密码上传至Git等平台)。

config.py 内容如下:

python 复制代码
# 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 的文件。

python 复制代码
# 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
        
    # 合并所有DataFrame
    merged_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_path
    except 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 中继续添加以下函数:

python 复制代码
# main.py (续)
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

def 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_EMAIL
    msg['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 True
    except Exception as e:
        print(f"邮件发送失败: {str(e)}")
        return False

步骤 5:整合主流程并添加定时任务

main.py 的最后,添加主函数和定时任务逻辑:

python 复制代码
# main.py (续)
import schedule
import time

def main_job():
    """主任务函数:合并Excel并发送邮件"""
    print(f"\n--- 开始执行月度报表自动化任务 {datetime.now()} ---")
    
    # 1. 合并Excel
    report_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 办公自动化实战案例!

相关推荐
明月_清风38 分钟前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
bellus-44 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦1 小时前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来1 小时前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
liuyunshengsir1 小时前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
电子云与长程纠缠1 小时前
UE5制作六边形包裹球体效果
开发语言·python·ue5
DFT计算杂谈1 小时前
KPROJ编译教程
java·前端·python·算法·conda
念恒123062 小时前
Python(循环中断)
开发语言·python
tsfy20032 小时前
Python 处理中文文件名的3个坑(附 Flask 上传解决函数)
开发语言·python·flask·文件上传·中文编码
AI技术控2 小时前
KV Cache 缓存机制的原理和应用:从 Transformer 推理到大模型服务优化
人工智能·python·深度学习·缓存·自然语言处理·transformer