本我 · 加载中...

文章背景图

Python 自动化办公实战:Excel 与 PDF 的批量处理

2026-08-06
0
-
- 分钟
|

Python 自动化办公实战:Excel 与 PDF 的批量处理

什么时候该写脚本

判断标准很简单:这个操作你三个月内会重复做两次以上,就值得写脚本。一次性的活,手动处理更快;重复的活,才是脚本的用武之地。

本文的场景设定:你手上有几十个 Excel 报表,需要批量汇总、清洗、生成 PDF 报告。全手工做要一下午,用 Python 十分钟。

一、环境准备

pip install openpyxl pandas xlsxwriter reportlab pypdf
  • openpyxl:读写 .xlsx 文件
  • pandas:数据处理与分析
  • xlsxwriter:生成带格式的 Excel
  • reportlab:生成 PDF
  • pypdf:合并/拆分/提取 PDF

二、批量读取并汇总 Excel

场景:合并 30 个销售报表

每个文件结构相同:A 列日期、B 列产品、C 列金额。

import pandas as pd
from pathlib import Path

files = list(Path("reports").glob("*.xlsx"))
frames = []
for f in files:
    df = pd.read_excel(f)
    df["来源文件"] = f.name          # 记录来源,方便溯源
    frames.append(df)

result = pd.concat(frames, ignore_index=True)
print(f"共汇总 {len(result)} 行,来自 {len(files)} 个文件")

按产品汇总

summary = result.groupby("产品").agg(
    总金额=("金额", "sum"),
    订单数=("金额", "count"),
).sort_values("总金额", ascending=False)

print(summary.head(10))

三、数据清洗的三个高频操作

1. 处理缺失值

# 看缺失情况
print(df.isnull().sum())

# 填充
df["金额"] = df["金额"].fillna(0)
df["备注"] = df["备注"].fillna("")

# 删除全空行
df = df.dropna(how="all")

2. 去除重复

# 完全重复
df = df.drop_duplicates()

# 按指定列去重,保留第一个
df = df.drop_duplicates(subset=["订单号"], keep="first")

3. 统一格式

# 日期统一
df["日期"] = pd.to_datetime(df["日期"], errors="coerce").dt.strftime("%Y-%m-%d")

# 金额去逗号和货币符号
df["金额"] = df["金额"].astype(str).str.replace(",", "").str.replace("¥", "")
df["金额"] = pd.to_numeric(df["金额"], errors="coerce")

四、生成带格式的 Excel

pandas 只负责算,xlsxwriter 负责好看:

import xlsxwriter
from io import BytesIO

output = BytesIO()
with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
    summary.to_excel(writer, sheet_name="汇总", index=True)

    workbook = writer.book
    worksheet = writer.sheets["汇总"]

    # 表头加粗
    header_fmt = workbook.add_format({"bold": True, "bg_color": "#4472C4", "font_color": "white"})
    for col in range(len(summary.columns) + 1):
        worksheet.write(0, col, summary.columns[col] if col > 0 else "产品", header_fmt)

    # 列宽自适应
    worksheet.set_column(0, len(summary.columns), 20)

with open("汇总报表.xlsx", "wb") as f:
    f.write(output.getvalue())

五、生成 PDF 报告

reportlab 的 Platypus 布局引擎:

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle, Spacer

doc = SimpleDocTemplate("月度报告.pdf", pagesize=A4)
styles = getSampleStyleSheet()

elements = []
elements.append(Paragraph("2026 年 8 月销售报告", styles["Title"]))
elements.append(Spacer(1, 20))

# 汇总表转表格
data = [["产品", "总金额", "订单数"]] + summary.reset_index().values.tolist()
table = Table(data)
table.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), "#4472C4"),
    ("TEXTCOLOR", (0, 0), (-1, 0), "white"),
    ("GRID", (0, 0), (-1, -1), 0.5, "grey"),
    ("ALIGN", (1, 0), (-1, -1), "RIGHT"),
]))
elements.append(table)

doc.build(elements)
print("PDF 已生成")

六、PDF 的批量操作

合并多个 PDF

from pypdf import PdfWriter

writer = PdfWriter()
for f in Path("pdfs").glob("*.pdf"):
    writer.append(f)
writer.write("合并结果.pdf")

提取指定页

from pypdf import PdfReader, PdfWriter

reader = PdfReader("大文件.pdf")
writer = PdfWriter()
for i in range(0, 5):        # 取前 5 页
    writer.add_page(reader.pages[i])
writer.write("前5页.pdf")

七、让脚本更健壮的三个习惯

  1. 异常处理:单个文件出错不中断整个任务
for f in files:
    try:
        df = pd.read_excel(f)
        frames.append(df)
    except Exception as e:
        print(f"跳过 {f.name}: {e}")
        continue
  1. 日志输出:打印每个文件的处理状态,方便排查
  2. 输入输出分离:源文件目录和输出目录分开,脚本可重复执行(覆盖输出即可)

结语

自动化办公的价值不是"会用 pandas",而是识别出哪些工作是重复性的。从最小的脚本开始——哪怕只是自动重命名一批文件——尝到甜头后,你会自然地越写越多,办公效率的提升是指数级的。

原创

Python 自动化办公实战:Excel 与 PDF 的批量处理

本文链接: Python 自动化办公实战:Excel 与 PDF 的批量处理

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本文为原创文章,转载请联系作者并注明出处。

评论交流

文章目录