作为程序员,你是否还在重复做这些事?—— 每天花 2 小时复制粘贴 Excel 数据、手动将 100 + 份报表转成 PDF、逐个给客户发带附件的邮件…… 这些机械操作不仅浪费时间,还容易出错。

        今天就带大家用 Python 开发一个自动化办公全能工具,一次性解决 Excel 处理、PDF 转换、自动发邮件三大痛点。全程实战,代码逐行注释,新手也能跟着做,最后还会教大家怎么把工具打包成 exe,发给同事直接用!

一、项目为什么值得学?(3 个核心优势)

  1. 实用性拉满:不做 “玩具项目”,解决职场真实需求,学会后当天就能用在工作里,帮你每天节省 2 小时 +
  2. 技术门槛低:只用 Python 基础语法 + 3 个常用库(openpyxl、PyPDF2、smtplib),无需复杂框架
  3. 成果可落地:最终产出可直接运行的 exe 工具,还能自定义修改需求,放在简历 / 作品集里超加分

二、准备工作:10 分钟搞定环境搭建

1. 安装必备库

打开 CMD,复制以下命令执行(建议用 Python 3.8 + 版本,兼容性更好):

# 处理Excel表格
pip install openpyxl
# 处理PDF文件
pip install PyPDF2
# 发送邮件(内置库,无需安装)
# 打包exe工具(最后一步用)
pip install pyinstaller

2. 明确项目功能模块

我们的工具包含 3 个核心功能,按 “简单→复杂” 顺序开发,逐步推进:

  • 模块 1:Excel 自动化(数据筛选、批量计算、生成报表)
  • 模块 2:PDF 批量处理(Excel 转 PDF、多 PDF 合并、添加水印)
  • 模块 3:自动发邮件(读取 Excel 中的收件人,批量发送带附件的邮件)

三、模块 1:Excel 自动化(1 小时搞定)

需求场景

假设有一份 “员工销售数据.xlsx”,需要完成 3 件事:

  1. 筛选出 “销售额> 50000” 的员工
  2. 计算每位员工的 “提成”(销售额 * 0.05)
  3. 将结果保存到新的 Excel 文件中

完整代码(带注释)

from openpyxl import load_workbook, Workbook

def excel_auto_process(input_path, output_path):
    # 1. 加载待处理的Excel文件
    wb = load_workbook(input_path)
    # 选择第一个工作表(默认Sheet)
    ws = wb.active

    # 2. 创建新的Excel文件,用于保存结果
    new_wb = Workbook()
    new_ws = new_wb.active
    # 设置新表格的表头
    new_ws.append(["姓名", "部门", "销售额", "提成"])

    # 3. 遍历原表格数据(跳过表头,从第2行开始)
    for row in ws.iter_rows(min_row=2, values_only=True):
        name, dept, sales = row[0], row[1], row[2]  # 假设前3列是姓名、部门、销售额
        # 筛选销售额>50000的员工
        if sales > 50000:
            commission = sales * 0.05  # 计算提成
            # 将数据写入新表格
            new_ws.append([name, dept, sales, round(commission, 2)])  # 保留2位小数

    # 4. 保存新文件
    new_wb.save(output_path)
    print(f"Excel处理完成!结果已保存到:{output_path}")

# ------------------- 调用函数 -------------------
if __name__ == "__main__":
    # 替换成你的文件路径(建议用相对路径,避免报错)
    input_excel = "员工销售数据.xlsx"
    output_excel = "高销售额员工报表.xlsx"
    excel_auto_process(input_excel, output_excel)

效果演示

  1. 准备一份 “员工销售数据.xlsx”,格式如下:
    | 姓名 | 部门 | 销售额 |
    |------|------|--------|
    | 张三 | 销售 1 部 | 65000 |
    | 李四 | 销售 2 部 | 48000 |
    | 王五 | 销售 1 部 | 72000 |

  2. 运行代码后,会生成 “高销售额员工报表.xlsx”,自动筛选出张三、王五,并新增 “提成” 列。

四、模块 2:PDF 批量处理(核心功能,必学!)

场景 1:Excel 转 PDF(无需手动打开 Excel 导出)

很多时候需要将 Excel 报表转成 PDF 发给客户,用代码实现批量转换:

from openpyxl import load_workbook
from win32com.client import DispatchEx  # 需安装pywin32:pip install pywin32

def excel_to_pdf(excel_path, pdf_path):
    # 初始化Excel应用(后台运行,不显示界面)
    excel = DispatchEx("Excel.Application")
    excel.Visible = False  # 隐藏Excel窗口
    excel.DisplayAlerts = False  # 关闭弹窗提示

    try:
        # 打开Excel文件
        workbook = excel.Workbooks.Open(excel_path)
        # 导出为PDF(FileFormat=57对应PDF格式)
        workbook.ExportAsFixedFormat(Type=0, Filename=pdf_path, Quality=0)
        print(f"Excel转PDF成功!PDF路径:{pdf_path}")
    except Exception as e:
        print(f"转换失败:{str(e)}")
    finally:
        # 关闭文件和Excel应用,避免进程残留
        workbook.Close(SaveChanges=False)
        excel.Quit()

# ------------------- 调用函数 -------------------
excel_to_pdf("高销售额员工报表.xlsx", "高销售额员工报表.pdf")

场景 2:多 PDF 合并(比如把 10 份报表合成 1 份)

from PyPDF2 import PdfMerger

def merge_pdfs(pdf_list, output_pdf):
    merger = PdfMerger()
    # 遍历所有要合并的PDF文件
    for pdf in pdf_list:
        merger.append(pdf)  # 添加PDF
        print(f"已添加:{pdf}")
    # 保存合并后的PDF
    merger.write(output_pdf)
    merger.close()
    print(f"PDF合并完成!合并后文件:{output_pdf}")

# ------------------- 调用函数 -------------------
# 要合并的PDF列表(按顺序排列)
pdfs = ["报表1.pdf", "报表2.pdf", "报表3.pdf"]
merge_pdfs(pdfs, "合并后的总报表.pdf")

五、模块 3:自动发邮件(批量给客户发报表)

需求场景

从 Excel 中读取 “客户邮箱” 和 “对应的 PDF 报表名”,自动发送带附件的邮件,邮件内容可自定义。

完整代码

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from openpyxl import load_workbook

def send_auto_email(smtp_server, smtp_port, sender_email, sender_password, excel_path):
    # 1. 加载Excel中的客户信息(假设列:客户姓名、客户邮箱、PDF附件路径)
    wb = load_workbook(excel_path)
    ws = wb.active

    # 2. 连接邮件服务器(以QQ邮箱为例,其他邮箱需改服务器和端口)
    try:
        server = smtplib.SMTP_SSL(smtp_server, smtp_port)  # SSL加密连接
        server.login(sender_email, sender_password)  # 登录邮箱(密码用“授权码”,不是登录密码!)
        print("邮箱登录成功!")
    except Exception as e:
        print(f"邮箱登录失败:{str(e)}")
        return

    # 3. 遍历客户信息,逐个发送邮件
    for row in ws.iter_rows(min_row=2, values_only=True):
        client_name, client_email, pdf_path = row[0], row[1], row[2]
        if not (client_name and client_email and pdf_path):
            print("跳过空数据行")
            continue

        # 4. 构造邮件内容
        msg = MIMEMultipart()
        msg["From"] = sender_email  # 发件人
        msg["To"] = client_email    # 收件人
        msg["Subject"] = f"【{client_name}】您的月度销售报表已发送"  # 邮件主题

        # 邮件正文(支持HTML格式,可自定义内容)
        body = f"""
        <p>您好,{client_name}!</p>
        <p>这是您本月的销售报表,已附在邮件中,请查收。</p>
        <p>如有疑问,请随时联系我~</p>
        """
        msg.attach(MIMEText(body, "html", "utf-8"))

        # 5. 添加PDF附件
        try:
            with open(pdf_path, "rb") as f:
                pdf_attach = MIMEApplication(f.read(), _subtype="pdf")
                # 设置附件名(显示给收件人的名称)
                pdf_attach.add_header("Content-Disposition", "attachment", filename=pdf_path.split("\\")[-1])
                msg.attach(pdf_attach)
        except Exception as e:
            print(f"添加附件失败({client_name}):{str(e)}")
            continue

        # 6. 发送邮件
        try:
            server.sendmail(sender_email, client_email, msg.as_string())
            print(f"邮件发送成功!收件人:{client_email}")
        except Exception as e:
            print(f"邮件发送失败({client_email}):{str(e)}")

    # 7. 关闭邮件服务器
    server.quit()
    print("所有邮件处理完成!")

# ------------------- 调用函数(关键参数要改!) -------------------
if __name__ == "__main__":
    # 1. 邮件服务器配置(以QQ邮箱为例,其他邮箱参考下表)
    SMTP_SERVER = "smtp.qq.com"    # QQ邮箱SMTP服务器
    SMTP_PORT = 465                # QQ邮箱SSL端口
    SENDER_EMAIL = "你的QQ邮箱@qq.com"  # 你的发件邮箱
    # 注意:这里用“邮箱授权码”,不是QQ密码!获取方式:QQ邮箱→设置→账户→开启POP3/SMTP→生成授权码
    SENDER_PASSWORD = "你的QQ邮箱授权码"

    # 2. 客户信息Excel路径(格式:客户姓名、客户邮箱、PDF附件路径)
    CLIENT_EXCEL = "客户邮箱列表.xlsx"

    # 3. 发送邮件
    send_auto_email(SMTP_SERVER, SMTP_PORT, SENDER_EMAIL, SENDER_PASSWORD, CLIENT_EXCEL)

常见邮箱配置表(避免踩坑)

邮箱类型 SMTP 服务器 SMTP 端口(SSL) 授权码获取方式
QQ 邮箱 smtp.qq.com 465 邮箱设置→账户→开启 POP3/SMTP
163 邮箱 smtp.163.com 465 设置→POP3/SMTP→开启→生成授权码
企业微信邮箱 smtp.exmail.qq.com 465 管理后台→安全→开启 SMTP

六、最后一步:打包成 exe,发给同事直接用

写好的代码,非程序员同事不会装 Python 环境?没关系,用 pyinstaller 打包成 exe,双击就能运行!

打包步骤(1 分钟搞定)

  1. 把所有代码整合到一个文件中(比如命名为 “auto_office_tool.py”)
  2. 打开 CMD,进入代码所在文件夹,执行以下命令:
# -F:打包成单个exe文件;-i:给exe加图标(可选,图标文件需是.ico格式)
pyinstaller -F -i tool.ico auto_office_tool.py
  1. 打包完成后,在 “dist” 文件夹中找到 exe 文件,双击运行即可。

七、项目扩展建议(让你的工具更强大)

  1. 加 “图形界面”:用 tkinter 或 PyQt 做一个简单界面,不用改代码就能选文件、点按钮运行
  2. 加 “日志功能”:记录每一步操作结果,出错了能定位问题
  3. 支持 “多格式文件”:比如 Word 转 PDF、CSV 文件处理
  4. 定时任务:用 schedule 库设置每天自动运行,比如早上 8 点自动发报表

八、源码获取

本文所有代码已整理成压缩包,包含:

  • 完整源码(带注释)
  • 测试用 Excel/PDF 文件
  • 图标文件(用于打包 exe)
  • 详细操作手册

关注我的 CSDN 账号,私信回复 “自动化办公工具” 即可获取!

如果在实操中遇到问题,欢迎在评论区留言,我会逐一回复。觉得有用的话,别忘了点赞 + 收藏,后续还会更新更多 Python 实战项目~

更多推荐