《Python实战进阶》No22 Python自动化办公实战:Excel/Word/PDF文件处理全攻略

发布于:2025-03-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

No22 Python自动化办公实战:Excel/Word/PDF文件处理全攻略


摘要

本文将带你掌握Python在办公自动化领域的三大核心场景:Excel数据处理、Word文档生成与PDF文件操作。通过实战案例,你将学会如何用openpyxlpandaspython-docxPyPDF2等工具高效完成批量报表生成、动态文档创建和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

在这里插入图片描述


扩展思考

  1. 企业级自动化流水线
    将上述脚本整合为定时任务(如Windows任务计划程序或Linux Cron),结合邮件发送模块(smtplib),实现日报/周报自动推送。

  2. 跨格式数据互操作

    • 使用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]
      

总结

通过本文的实战案例,你已掌握:

  1. 使用pandasopenpyxl处理Excel数据
  2. 通过python-docx动态生成Word文档
  3. 利用PyPDF2reportlab操作PDF文件

下一步可尝试将这些技术组合应用到实际工作中,例如:

  • 自动化财务对账流程
  • 批量生成员工考核报告
  • 构建文档版本控制系统

立即动手改造你的工作流,让Python成为你的"数字员工"!