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 办公自动化实战案例!

相关推荐
谢景行^顾15 分钟前
numpy
开发语言·python·numpy
上天夭22 分钟前
PyTorch的Dataloader模块解析
人工智能·pytorch·python
是一个Bug23 分钟前
Spring Boot 的全局异常处理器
spring boot·后端·python
dTTb25 分钟前
python元组和字典
python
沐雪轻挽萤1 小时前
pytorch模型部署基础知识
人工智能·pytorch·python
xxxxxmy1 小时前
相向双指针—接雨水
python·相向双指针
nix.gnehc1 小时前
PyTorch数据加载与预处理
人工智能·pytorch·python
Sindy_he1 小时前
2025最新版微软GraphRAG 2.0.0本地部署教程:基于Ollama快速构建知识图谱
python·microsoft·大模型·知识图谱·rag
鲸落✗1 小时前
深入解析单HTML实现的网页版《我的世界》(附代码下载链接)
前端·python·html
Aerelin1 小时前
豆瓣数据采集案例
前端·爬虫·python·js·playwright