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.pswp.cn/diannao/96904.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96904.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96904.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高教杯数学建模2021-C 生产企业原材料的订购与运输

某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料, 总体可分为 A,B,C 三种类型。该企业每年按 48 周安排生产,需要提前制定 24 周的原 材料订购和转运计划,即根据产能要求确定需要订购的原材料供应商&…

【Python系列】Flask 和 FastAPI对比

博客目录1. 类型和设计目标2. 性能3. 异步支持4. 数据验证和文档5. 学习曲线和生态6. 使用场景示例对比Flask(同步)FastAPI(异步)总结Flask 和 FastAPI 都是 Python 中流行的 Web 框架,但它们的设计目标、特性和适用场…

把 AI 塞进「空调遥控器」——基于 MEMS 温湿阵列的 1 分钟极速房间热场扫描

标签:MEMS 阵列、热场扫描、极速空调、TinyML、RISC-V、零样本、离线推理、节能 ---- 背景:为什么空调遥控器要「画图」? 传统空调只有一个温湿度探头,经常“东边冷、西边热”。 • 大客厅 30 ㎡,温差 5 ℃&#xff1…

【机器学习】8 Logistic regression

本章目录 8 Logistic regression 245 8.1 Introduction 245 8.2 Model specification 245 8.3 Model fitting 245 8.3.1 MLE 246 8.3.2 Steepest descent 247 8.3.3 Newton’s method 249 8.3.4 Iteratively reweighted least squares (IRLS) 250 8.3.5 Quasi-Newton (variabl…

C++中如何使用互斥(1)------std::lock_guard

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 算法描述 std::lock_guard 是 C11 引入的一个 RAII(Resource Acquisition Is Initialization)风格的锁管理类,用于自动管理互斥锁(mutex&#x…

AI算力提升7.5倍!英伟达发布新一代机器人超级计算机Jetson Thor,驱动物理AI革命

今天,NVIDIA 宣布其专为物理 AI 和机器人打造的新一代机器人计算机 Jetson Thor 正式发售。其中,Jetson AGX Thor 开发者套件售价为 3499 美元(约合人民币 2.5 万元)。NVIDIA 创始人兼首席执行官黄仁勋表示:“Jetson T…

【数学建模】如何总结数学建模中的层次分析法最好

模型简介模型名称:层次分析法核心问题类型:评价类核心思想和适用场景 核心思想:将大决策问题拆解成小比较问题,通过数学计算综合最终结论:本质是人的主观判断转换为客观数据的工具[[适用场景]] 个人决策企业 / 项目决策…

`mmap` 系统调用详解

mmap 是 Unix/Linux 系统中一个强大且多用途的系统调用,用于将文件或设备映射到进程的地址空间,实现内存映射I/O。 1. 函数的概念与用途 mmap(内存映射)函数允许程序将文件或其他对象直接映射到其地址空间,这样文件内容…

深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”

深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”上一章我们鸟瞰了Spring AI的宏伟蓝图,今天,我们要深入这座大厦的基石——Model抽象层。如果说Spring AI是连接Java与AI世界的桥梁,那…

永磁同步电机无速度算法--高频脉振正弦波注入到两相静止坐标系

一、原理介绍采用一种改进的永磁同步电机低速无位置传感器控制策略。与传统的旋转高频信号注入法和脉振高频信号注入法不同,该策略选择向静止坐标轴系注入高频脉振信号,转子位置估计信息可以通过载波电流响应提取。并使用一种类似于简化型扩展卡尔曼滤波…

嵌入式学习日志————ADC模数转换器之实验

1.配置ADC的步骤①开启RCC时钟,包括ADC和GPIO的时钟②配置GPIO,把相应端口配置成模拟输入模式③配置多路开关,把左边的通道接入右边的规则组列表里④配置ADC转换器⑤调用ADC_Cmd函数,开启ADC2.库函数配置ADCCLK分频器void RCC_ADC…

Java设计模式之《状态模式》

目录 1、状态模式 1.1、介绍 1.2、设计背景 1.3、适用场景 2、实现 2.1、if-else实现 2.2、状态模式实现 2.3、最终版 1、关于if-else的优化 2、状态模式下的优化 3、ArrayList 配置“状态流” 3、总结 前言 关于Java的设计模式分类如下: 对于状态模式…

three.js+WebGL踩坑经验合集(9.2):polygonOffsetFactor工作原理大揭秘

本篇延续上篇内容: three.jsWebGL踩坑经验合集(9.1):polygonOffsetUnits工作原理大揭秘-CSDN博客 跟polygonOffsetUnits相比,polygonOffsetFactor的系数m要复杂得多,因为它跟平面的视角相关,而不像r那样,在一个固定的…

C++高级特性与设计模式答案

目录 C++高级特性与设计模式:从资源管理到架构设计 一、C++高级特性:超越基础语法的利器 1. 什么是RAII(资源获取即初始化)?它有什么作用? 实现原理 核心作用 2. 什么是Pimpl惯用法?它有什么优势? 实现方式 核心优势 3. 什么是CRTP(奇异递归模板模式)?它的应用场景是…

论文阅读:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Can You Trick the Grader? Adversarial Persuasion of LLM Judges https://arxiv.org/pdf/2508.07805 https://www.doubao.com/chat/17534937260220418 文章目录论文翻译…

6pen Art

本文转载自:6pen Art - Hello123工具导航 ** 一、🎨 6pen 是什么? 6pen 是一款由国内团队开发的 AI 绘画工具,让你只需用文字描述想法,就能瞬间生成惊艳的视觉画作。不管是写实风景还是抽象概念,它都能理…

Let‘s Encrypt证书在 Android5.x 的设备上报错

报错信息: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.at com.android.volley.toolbox.NetworkUtility.shouldRetryException(N…

C语言数组名与sizeof的深层关联

要理解 “数组名本质代表整个数组的类型和内存块” 与 “sizeof(arr) 输出总字节数” 的关联,核心是抓住 sizeof 运算符的设计逻辑 和 数组类型的本质属性—— 这两者是直接挂钩的,我们一步步拆解:第一步:先明确 sizeof 的核心作用…

最近对javashop做了压力测试:百万级并发下完全不是问题

最近对 javashop 做了压力测试:百万级并发下完全不是问题 在电商行业竞争白热化的今天,系统性能直接决定了用户体验和企业商业成功。本文基于《Javashop 压测报告》,从技术架构、核心指标、业务价值三大维度深度解析其性能优势,并…

Java大厂面试实战:从Spring Boot到微服务架构的全链路技术解析

Java大厂面试实战:从Spring Boot到微服务架构的全链路技术解析 面试场景:某互联网大厂Java后端开发岗 面试官(严肃):谢飞机,我们今天来聊点硬核的。先说说你对Java生态的理解。 谢飞机(挠头&…