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 任务计划程序
对于生产环境,建议使用系统自带的任务计划:
- 将脚本保存为 INLINE_CODE_0 文件
- 打开"任务计划程序"
- 创建基本任务,设置触发时间
- 操作选择"启动程序"
- 程序填 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 倍 + |
| 数据抓取 | 手动复制 | 自动采集 | 无限 |
开始行动的建议:
- 从小处着手:先自动化一个 5 分钟的小任务
- 积累代码片段:建立自己的自动化代码库
- 持续优化:每次运行后思考如何改进
- 分享经验:帮助同事也提升效率
记住:自动化的目的不是炫技,而是把时间花在更有价值的事情上。当你不再被重复性工作束缚,才能真正发挥创造力!
参考资料: