当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/344821.html

相关文章:

  • 博士招生 | 英国谢菲尔德大学 招收计算机博士
  • 数据结构 -- 栈
  • 鹰角网络基于阿里云 EMR Serverless StarRocks 的实时分析工程实践
  • CDN行业中的SA板卡限速是什么
  • 品牌出海狂潮里,独立站支付的「隐形基建」正在改写规则
  • java18学习笔记-JavaDoc的@snippet注释标签
  • 数据结构 -- 队列
  • 【运维自动化-标准运维】变量的高级用法
  • 去中心化的私有货币与中心化的法定货币的对比分析
  • 数据结构与算法-算法-283移动零
  • 深度分析AI边缘盒子在电力行业的应用与发展
  • 【LeetCode】22. 括号生成
  • 欲打造未来感十足的规划馆,应优先引入哪些沉浸式多媒体技术?
  • Spring Start Here 读书笔记:第9章 Using the Spring web scopes
  • 人脸识别驱动的工厂人体属性检测与预警机制
  • C#开源库ACadSharp读取dwg图元的示例
  • 为何她在“传递情报”时会被干扰?—— 探究 TCP 协议在无线环境中的信号干扰问题
  • 算法题复盘+代码解读(2)—— 两数之和
  • 【功能测试面试题】
  • 【数据结构】B+ 树——高度近似于菌丝网络——详细解说与其 C 代码实现
  • CVPR焦点 | 神经网络新范式:轻量化与精度并行,重塑视觉任务性能天花板
  • 解释一下,Linux,shell,Vmware,Ubuntu,以及Linux命令和shell命令的区别
  • 1337俚语的由来
  • Seaborn数据可视化实战:Seaborn时间序列可视化入门
  • Linux学习-网络编程2
  • .java->.class->java 虚拟机中运行
  • 51.Seata-TCC模式
  • 前端函数防抖
  • Nginx + Keepalived 实现高可用负载均衡集群
  • 前端桌面端解决方案技术选型:全面指南