折腾侠
技术教程

Python 自动化办公实战 - 用代码解放你的双手

本文介绍如何使用 Python 自动化处理日常办公任务,包括 Excel 数据处理、PDF 文件操作、邮件自动发送等实用场景,帮助你提升工作效率。

折腾侠
2026/03/15 发布
19约 7 分钟1284 字 / 870 词00

Python 自动化办公实战 - 用代码解放你的双手

每天重复同样的 Excel 处理、文件整理、邮件发送?是时候让 Python 帮你自动化这些繁琐的工作了!


一、为什么选择 Python 做办公自动化

在职场中,我们每天都会面对大量重复性的工作:

  • 📊 每天从系统导出 Excel 报表,手动整理格式
  • 📁 把几百个文件按规则重命名、分类
  • 📧 给几十个客户发送格式相似的邮件
  • 📄 合并多个 PDF 文档或提取特定页面
  • 🔄 定时从网站抓取数据并更新表格

这些工作单独看都不难,但日复一日地做,不仅浪费时间,还容易出错。而 Python 正是解决这类问题的利器:

Python 的优势:

  • 语法简单:接近自然语言,容易上手
  • 库生态丰富:几乎任何办公场景都有现成的库
  • 跨平台:Windows、Mac、Linux 都能用
  • 免费开源:无需购买昂贵的商业软件

二、环境准备

2.1 安装 Python

访问 python.org 下载最新版本(推荐 3.8+)。

安装时务必勾选 "Add Python to PATH",这样可以在命令行直接运行 Python。

2.2 安装必要的库

Bash
# Excel 处理
pip install openpyxl pandas

# PDF 处理
pip install pypdf2 reportlab

# 邮件发送
pip install yagmail

# 文件操作增强
pip install pathlib

# 网页抓取
pip install requests beautifulsoup4

三、实战场景一:Excel 数据自动化

3.1 读取和写入 Excel

Python
import pandas as pd
from openpyxl import Workbook

# 读取 Excel
df = pd.read_excel('销售数据.xlsx', sheet_name='Sheet1')

# 数据筛选:找出销售额大于 10000 的记录
high_value = df[df['销售额'] > 10000]

# 数据透视:按地区统计
region_summary = df.groupby('地区')['销售额'].sum()

# 写入新 Excel
high_value.to_excel('高价值客户.xlsx', index=False)

3.2 批量合并多个 Excel 文件

Python
import pandas as pd
import glob

# 获取所有 Excel 文件
files = glob.glob('月度报表/*.xlsx')

# 读取并合并
all_data = []
for file in files:
    df = pd.read_excel(file)
    df['来源文件'] = file  # 添加来源标记
    all_data.append(df)

# 合并所有数据
merged = pd.concat(all_data, ignore_index=True)
merged.to_excel('合并报表.xlsx', index=False)
print(f'已合并 {len(files)} 个文件,共 {len(merged)} 条记录')

3.3 自动格式化 Excel 报表

Python
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment

wb = load_workbook('报表.xlsx')
ws = wb.active

# 设置表头样式
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF')

for cell in ws[1]:  # 第一行
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = Alignment(horizontal='center')

# 自动调整列宽
for column in ws.columns:
    max_length = 0
    column_letter = column[0].column_letter
    for cell in column:
        if cell.value:
            max_length = max(max_length, len(str(cell.value)))
    ws.column_dimensions[column_letter].width = max_length + 2

wb.save('格式化报表.xlsx')

四、实战场景二:PDF 文件处理

4.1 合并多个 PDF

Python
from pypdf import PdfWriter

merger = PdfWriter()

pdf_files = ['报告1.pdf', '报告2.pdf', '报告3.pdf']
for pdf in pdf_files:
    merger.append(pdf)

merger.write('合并报告.pdf')
merger.close()
print('PDF 合并完成!')

4.2 提取 PDF 特定页面

Python
from pypdf import PdfReader, PdfWriter

reader = PdfReader('完整报告.pdf')
writer = PdfWriter()

# 只提取第 1、3、5 页
pages_to_keep = [0, 2, 4]  # 页码从 0 开始
for page_num in pages_to_keep:
    writer.add_page(reader.pages[page_num])

with open('摘要版.pdf', 'wb') as f:
    writer.write(f)

4.3 给 PDF 添加水印

Python
from pypdf import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

# 先创建水印 PDF
c = canvas.Canvas('watermark.pdf', pagesize=A4)
c.setFont('Helvetica-Bold', 50)
c.setFillColorRGB(0.5, 0.5, 0.5, 0.3)  # 灰色半透明
c.rotate(45)
c.drawString(200, 400, '机密文件')
c.save()

# 合并水印到原 PDF
reader = PdfReader('原文档.pdf')
watermark = PdfReader('watermark.pdf').pages[0]
writer = PdfWriter()

for page in reader.pages:
    page.merge_page(watermark)
    writer.add_page(page)

with open('加水印文档.pdf', 'wb') as f:
    writer.write(f)

五、实战场景三:自动发送邮件

5.1 使用 yagmail 发送邮件

Python
import yagmail

# 配置发件人
yag = yagmail.SMTP('your_email@gmail.com', 'your_app_password')

# 发送邮件
yag.send(
    to=['client1@example.com', 'client2@example.com'],
    subject='月度报告已生成',
    contents='您好,\n\n附件是本月的销售报告,请查收。\n\n祝好,\n自动化助手',
    attachments=['月度报告.xlsx']
)

print('邮件发送成功!')

5.2 批量发送个性化邮件

Python
import pandas as pd
import yagmail

# 读取客户列表
df = pd.read_excel('客户列表.xlsx')

yag = yagmail.SMTP('your_email@gmail.com', 'your_app_password')

for _, row in df.iterrows():
    content = f'''
    尊敬的{row['姓名']}:
    
    感谢您一直以来的支持!
    您的专属优惠码是:{row['优惠码']}
    有效期至:{row['有效期']}
    
    点击使用:https://example.com/use/{row['优惠码']}
    '''
    
    yag.send(
        to=row['邮箱'],
        subject='您的专属优惠已送达',
        contents=content
    )
    print(f'已发送给 {row["姓名"]}')

六、实战场景四:文件批量管理

6.1 批量重命名文件

Python
import os
from pathlib import Path

folder = Path('待整理文件')

for i, file in enumerate(folder.iterdir(), 1):
    if file.is_file():
        ext = file.suffix
        new_name = f'文档_{i:03d}{ext}'  # 文档_001.pdf
        file.rename(folder / new_name)
        print(f'{file.name} -> {new_name}')

6.2 按类型分类文件

Python
import shutil
from pathlib import Path

folder = Path('杂乱文件夹')

# 定义分类规则
extensions = {
    '图片': ['.jpg', '.jpeg', '.png', '.gif'],
    '文档': ['.pdf', '.doc', '.docx', '.xlsx'],
    '视频': ['.mp4', '.avi', '.mov'],
    '压缩': ['.zip', '.rar', '.7z']
}

for file in folder.iterdir():
    if file.is_file():
        for category, exts in extensions.items():
            if file.suffix.lower() in exts:
                target = folder / category
                target.mkdir(exist_ok=True)
                shutil.move(str(file), target / file.name)
                print(f'{file.name} -> {category}/')
                break

七、实战场景五:定时任务

7.1 使用 schedule 库

Python
import schedule
import time
import datetime

def daily_report():
    print(f'[{datetime.datetime.now()}] 正在生成日报...')
    # 这里放你的日报生成代码
    print('日报生成完成!')

# 每天上午 9 点执行
schedule.every().day.at('09:00').do(daily_report)

# 每周一执行
schedule.every().monday.do(daily_report)

# 每 30 分钟执行
schedule.every(30).minutes.do(daily_report)

print('定时任务已启动,按 Ctrl+C 停止...')
while True:
    schedule.run_pending()
    time.sleep(1)

7.2 Windows 任务计划程序

对于生产环境,建议使用系统自带的任务计划:

  1. 将脚本保存为 INLINE_CODE_0 文件
  2. 打开"任务计划程序"
  3. 创建基本任务,设置触发时间
  4. 操作选择"启动程序"
  5. 程序填 INLINE_CODE_1 路径,参数填脚本路径

八、完整案例:日报自动化系统

下面是一个完整的日报自动化案例,整合了以上多个技能:

Python
import pandas as pd
import yagmail
import schedule
import datetime
from pathlib import Path

def generate_daily_report():
    today = datetime.datetime.now().strftime('%Y-%m-%d')
    
    # 1. 读取销售数据
    df = pd.read_excel('sales_data.xlsx')
    today_data = df[df['日期'] == today]
    
    # 2. 计算关键指标
    total_sales = today_data['金额'].sum()
    order_count = len(today_data)
    avg_order = total_sales / order_count if order_count > 0 else 0
    
    # 3. 生成摘要 Excel
    summary = pd.DataFrame({
        '指标': ['总销售额', '订单数', '客单价'],
        '数值': [total_sales, order_count, avg_order]
    })
    summary.to_excel(f'reports/daily_{today}.xlsx', index=False)
    
    # 4. 发送邮件
    yag = yagmail.SMTP('your_email@gmail.com', 'your_password')
    yag.send(
        to=['boss@example.com'],
        subject=f'销售日报 - {today}',
        contents=f'今日销售额:¥{total_sales:,.2f}\n订单数:{order_count}\n客单价:¥{avg_order:,.2f}',
        attachments=[f'reports/daily_{today}.xlsx']
    )
    
    print(f'{today} 日报已发送')

# 每天下午 6 点执行
schedule.every().day.at('18:00').do(generate_daily_report)

while True:
    schedule.run_pending()
    time.sleep(60)

九、最佳实践与注意事项

9.1 代码安全

  • 不要硬编码密码:使用环境变量或配置文件
  • 敏感信息加密:使用 INLINE_CODE_2 管理密钥
  • 备份原文件:自动化操作前先备份

9.2 错误处理

Python
try:
    df = pd.read_excel('data.xlsx')
except FileNotFoundError:
    print('文件不存在,检查路径是否正确')
except Exception as e:
    print(f'发生错误:{e}')
    # 发送错误通知邮件

9.3 日志记录

Python
import logging

logging.basicConfig(
    filename='automation.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

logging.info('任务开始')
# ... 你的代码 ...
logging.info('任务完成')

十、总结

Python 办公自动化的核心价值:

场景传统方式Python 自动化效率提升
Excel 处理手动复制粘贴一键处理10 倍 +
文件整理逐个操作批量处理50 倍 +
邮件发送逐个编写模板批量100 倍 +
数据抓取手动复制自动采集无限

开始行动的建议:

  1. 从小处着手:先自动化一个 5 分钟的小任务
  2. 积累代码片段:建立自己的自动化代码库
  3. 持续优化:每次运行后思考如何改进
  4. 分享经验:帮助同事也提升效率

记住:自动化的目的不是炫技,而是把时间花在更有价值的事情上。当你不再被重复性工作束缚,才能真正发挥创造力!


参考资料:

分享到:

如果这篇文章对你有帮助,欢迎请作者喝杯咖啡 ☕

加载评论中...