No22 Python自动化办公实战:Excel/Word/PDF文件处理全攻略
摘要
本文将带你掌握Python在办公自动化领域的三大核心场景:Excel数据处理、Word文档生成与PDF文件操作。通过实战案例,你将学会如何用openpyxl
、pandas
、python-docx
、PyPDF2
等工具高效完成批量报表生成、动态文档创建和PDF合并水印添加,显著提升工作效率。
环境准备
运行环境
- Python版本:3.8+
- 依赖库版本:
pandas==2.0.3 openpyxl==3.1.2 python-docx==1.1.0 PyPDF2==3.0.1 reportlab==4.0.4
安装命令
pip install pandas openpyxl python-docx PyPDF2 reportlab
核心知识点与实战案例
1. Excel文件处理:批量生成销售报表
场景需求
将多个部门的销售数据(CSV格式)合并到Excel报表,并添加数据透视表和图表。
代码实现
import pandas as pd
import random
# === 生成随机销售数据 ===
departments = ["销售部", "市场部", "技术部", "客服部"]
quarters = ["Q1", "Q2", "Q3", "Q4"]
data = {
"部门": [random.choice(departments) for _ in range(100)],
"季度": [random.choice(quarters) for _ in range(100)],
"销售额": [random.randint(5000, 50000) for _ in range(100)]
}
df = pd.DataFrame(data)
df.to_csv("sales_data.csv", index=False, encoding='utf-8-sig')
print("测试数据已生成:sales_data.csv")
# 读取CSV数据
sales_data = pd.read_csv("sales_data.csv")
# 创建Excel文件并保存
with pd.ExcelWriter("sales_report.xlsx", engine='openpyxl') as writer:
sales_data.to_excel(writer, sheet_name='原始数据', index=False)
# 生成数据透视表
pivot_table = pd.pivot_table(
sales_data,
values='销售额',
index='部门',
columns='季度',
aggfunc='sum'
)
pivot_table.to_excel(writer, sheet_name='数据透视表')
print("Excel报表生成成功!路径:sales_report.xlsx")
输入输出示例
- 输入文件:
sales_data.csv
(包含部门、季度、销售额字段) - 输出文件:生成包含原始数据和透视表的Excel文件
测试数据已生成:sales_data.csv
Excel报表生成成功!路径:sales_report.xlsx
2. Word文档处理:自动生成带图表的合同
场景需求
根据模板自动生成包含客户名称、金额和柱状图的销售合同。
代码实现
from docx import Document
from docx.shared import Pt, Inches
import matplotlib.pyplot as plt
import os
# === 生成合同模板 ===
def create_contract_template():
doc = Document()
doc.add_heading("销售合同", 0)
doc.add_paragraph("合同编号:_________", style='List Bullet')
doc.add_paragraph("签订日期:_________", style='List Bullet')
# 添加表格条款
table = doc.add_table(rows=3, cols=2)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '条款'
hdr_cells[1].text = '内容'
table.style = 'Table Grid'
doc.save("contract_template.docx")
print("合同模板已生成:contract_template.docx")
# 检查模板是否存在,不存在则创建
if not os.path.exists("contract_template.docx"):
create_contract_template()
# === 原有代码扩展 ===
# 创建图表
plt.bar(['Q1', 'Q2', 'Q3'], [150, 230, 180])
plt.title("季度销售额(万元)")
plt.savefig("sales_chart.png")
# 填充Word文档
doc = Document("contract_template.docx")
doc.add_paragraph(f"客户名称:ABC科技有限公司", style='List Bullet')
doc.add_paragraph(f"合同金额:¥500,000", style='List Bullet')
doc.add_picture("sales_chart.png", width=Inches(5))
doc.save("generated_contract.docx")
print("合同生成成功!路径:generated_contract.docx")
输入输出示例
- 输入模板:
contract_template.docx
(含固定条款) - 输出文件:动态插入文本和图表的完整合同
合同模板已生成:contract_template.docx
3. PDF处理:合并文件并添加水印
场景需求
合并多个部门报告PDF,并统一添加"机密"水印。
代码实现
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import os
# 生成测试PDF ===
def create_sample_pdf(filename, content):
c = canvas.Canvas(filename, pagesize=letter)
text = c.beginText(40, 750)
text.setFont("Courier", 12)
for line in content.split('\n'):
text.textLine(line)
c.drawText(text)
c.save()
# 生成测试PDF文件
if not os.path.exists("report1.pdf"):
create_sample_pdf("report1.pdf", "第一季度报告\n\n销售额:¥200,000\n完成率:120%")
if not os.path.exists("report2.pdf"):
create_sample_pdf("report2.pdf", "第二季度报告\n\n销售额:¥250,000\n完成率:135%")
print("测试PDF已生成:report1.pdf & report2.pdf")
# === 原有代码扩展 ===
# 生成水印PDF
c = canvas.Canvas("watermark.pdf", pagesize=letter)
c.setFont("Courier-Bold", 60)
c.setFillGray(0.3, 0.3)
c.rotate(45)
c.drawString(300, 100, "CONFIDENTIAL")
c.save()
# 合并并添加水印
writer = PdfWriter()
files = ["report1.pdf", "report2.pdf"]
for file in files:
reader = PdfReader(file)
for page in reader.pages:
# 合并水印
watermark = PdfReader("watermark.pdf").pages[0]
page.merge_page(watermark)
writer.add_page(page)
with open("merged_report.pdf", "wb") as out:
writer.write(out)
print("PDF合并及水印添加完成!路径:merged_report.pdf")
输入输出示例
- 输入文件:多个部门PDF报告
- 输出文件:带水印的合并PDF
测试PDF已生成:report1.pdf & report2.pdf
PDF合并及水印添加完成!路径:merged_report.pdf
扩展思考
企业级自动化流水线
将上述脚本整合为定时任务(如Windows任务计划程序或Linux Cron),结合邮件发送模块(smtplib
),实现日报/周报自动推送。跨格式数据互操作
- 使用
pandas
将Excel数据导出为JSON:df.to_json('data.json')
- 通过
python-docx
读取Word表格到DataFrame:from docx.api import Document doc = Document("report.docx") table = doc.tables[0] data = [[cell.text for cell in row.cells] for row in table.rows]
- 使用
总结
通过本文的实战案例,你已掌握:
- 使用
pandas
和openpyxl
处理Excel数据 - 通过
python-docx
动态生成Word文档 - 利用
PyPDF2
和reportlab
操作PDF文件
下一步可尝试将这些技术组合应用到实际工作中,例如:
- 自动化财务对账流程
- 批量生成员工考核报告
- 构建文档版本控制系统
立即动手改造你的工作流,让Python成为你的"数字员工"!