怎么用Python库实现Excel和PDF批量处理自动化

沿途有光
沿途有光
发布时间:2026-10-22| 4人浏览过
原创

日常办公中大量繁琐的重复性工作集中在表格汇总和文档整理上。利用 Python 的开源库生态,可以把几十甚至上千个 Excel 文件的格式提取、数据清洗与多表合并,以及 PDF 文档的批量拆分、页面提取与表格解析,完全封装为自动执行的脚本流水线。本文通过明确的库选型、可直接运行的代码示例和工程级容错策略,带你系统掌握办公文档批量自动化的实现路径。

一、核心Python库选型与任务边界划分

实现自动化前,第一步是根据文件格式特点与处理深度选择匹配度最高的库。Excel 与 PDF 的底层存储机制完全不同:Excel 是结构化的电子表格数据,而 PDF 本质上是基于排版指令的固定布局文档。因此,需要针对任务场景进行工具分工。

对于 Excel 处理:

  • pandas:专注于结构化表格的大规模批量操作、统计汇总、清洗过滤和多表拼接。当每个表格包含大量行且只关注数据本身时,pandas 的处理速度和代码精简度具有明显优势。
  • openpyxl:专注于 .xlsx 文件的深度操作。如果需要保留原工作表的单元格背景色、边框样式、多级表头、复杂公式或操作多个特定命名的 Sheet,openpyxl 是首选。

对于 PDF 处理:

  • pypdf:适合宏观页面层级的操作,例如将几十个 PDF 文件的特定页面截取并合并为一个总文件,或者进行批量页面旋转、加密和水印添加。
  • pdfplumber:建立在 pdfminer 之上,具有强大的几何坐标识别能力。它能够高精度解析文本排版,并自动识别表格网格线,将 PDF 中的发票、对账单表格逐行提取为结构化数据。
怎么用Python库实现Excel和PDF批量处理自动化
图1:Excel 与 PDF 自动化处理工具矩阵与核心应用场景

二、Excel批量处理实战:多表格扫描、清洗与自动合并

最常见的 Excel 自动化需求是将各部门或各分支机构提交的大量周报、考勤表、清单合并为一个完整的汇总表。手动打开文件、复制、粘贴不仅耗时,还极易遗漏或因表头不一致出错。

编写批量脚本时,推荐采用标准三步法:

  1. 目录扫描与安全过滤:使用 Python 内置的 pathlib.Path 遍历目标目录,必须过滤掉文件名以 ~$ 开头的临时锁文件。
  2. 逐表读取与标准化标记:使用 pandas.read_excel 载入数据,同时为每行数据新增一列记录源文件名或部门,便于后续追溯;清理多余空行与两端空格。
  3. 内存拼接与统一写出:将每个子表的 DataFrame 添加到列表中,最后调用 pd.concat 一次性拼接并输出到新的汇总文件。
怎么用Python库实现Excel和PDF批量处理自动化
图2:Excel 批量扫描、字段对齐与汇总导出全流程

下面是一个完整的生产级 Excel 批量合并脚本:

from pathlib import Path
import pandas as pd

def batch_merge_excel(source_dir: str, output_path: str):
    """
    遍历 source_dir 目录下所有 .xlsx 表格并合并为一个总表
    """
    folder = Path(source_dir)
    excel_files = [f for f in folder.glob("*.xlsx") if not f.name.startswith("~$")]
    
    if not excel_files:
        print(f"提示:在 {source_dir} 未找到可用的 .xlsx 文件")
        return

    frames = []
    total_files = len(excel_files)
    print(f"找到 {total_files} 个有效表格,开始读取...")

    for idx, file_path in enumerate(excel_files, start=1):
        try:
            # 读取第一个工作表
            df = pd.read_excel(file_path, engine="openpyxl")
            # 丢弃完全为空的行
            df.dropna(how="all", inplace=True)
            if df.empty:
                continue
            
            # 增加数据溯源字段
            df["源文件名"] = file_path.name
            frames.append(df)
            print(f"[{idx}/{total_files}] 成功解析: {file_path.name},行数: {len(df)}")
        except Exception as e:
            print(f"[{idx}/{total_files}] 解析失败 {file_path.name}: {e}")

    if not frames:
        print("未提取到任何有效数据,操作终止。")
        return

    # 一次性快速拼接
    merged_df = pd.concat(frames, ignore_index=True)
    
    # 输出合并后的文件
    output_file = Path(output_path)
    output_file.parent.mkdir(parents=True, exist_ok=True)
    merged_df.to_excel(output_file, index=False, engine="openpyxl")
    print(f"合并完成!总计汇入 {len(merged_df)} 行数据,已保存至: {output_path}")

if __name__ == "__main__":
    batch_merge_excel("./monthly_reports", "./output/汇总报表.xlsx")

三、PDF批量处理实战:页面操作与结构化表格抽取

处理 PDF 时,通常分为两种不同业务场景:一种是文档级页面归档(如将每位员工的劳动合同前两页抽出并按工号顺序合并为单文件);另一种是数据级内容抽取(如读取财务发票中的发票代码、金额与开票明细,写入系统数据库)。

1. 场景一:批量提取特定页并合并归档(pypdf)

pypdf 提供了轻量级的 PdfWriter 和 PdfReader,不需要安装额外的系统级 PDF 渲染依赖,速度快且资源开销小:

from pathlib import Path
from pypdf import PdfReader, PdfWriter

def batch_extract_and_merge_pdf(input_dir: str, output_merged_pdf: str, page_index: int = 0):
    """
    提取 input_dir 目录下所有 PDF 的指定页面(默认第1页)并合并为单一 PDF
    """
    folder = Path(input_dir)
    pdf_files = sorted(folder.glob("*.pdf"))
    
    writer = PdfWriter()
    count = 0

    for pdf_path in pdf_files:
        try:
            reader = PdfReader(pdf_path)
            if len(reader.pages) > page_index:
                # 抽取指定页面
                page = reader.pages[page_index]
                writer.add_page(page)
                count += 1
        except Exception as e:
            print(f"读取 PDF 出错 {pdf_path.name}: {e}")

    with open(output_merged_pdf, "wb") as f_out:
        writer.write(f_out)
    
    print(f"成功将 {count} 个 PDF 的第 {page_index + 1} 页合并至 {output_merged_pdf}")

2. 场景二:批量从PDF中抽取结构化表格(pdfplumber)

针对内含表格的 PDF 文件,使用 pdfplumber 可以定位表格线并将其转为标准的 Python 二维列表,随后能够直接封装为 DataFrame 写入 Excel:

from pathlib import Path
import pdfplumber
import pandas as pd

def extract_tables_from_pdfs(pdf_dir: str, output_excel: str):
    """
    批量遍历目录下的 PDF 文件,提取所有表格并整合导出为 Excel
    """
    folder = Path(pdf_dir)
    all_rows = []
    headers = None

    for pdf_file in folder.glob("*.pdf"):
        with pdfplumber.open(pdf_file) as pdf:
            for page_num, page in enumerate(pdf.pages, start=1):
                # 提取页面中的所有表格
                tables = page.extract_tables()
                for table in tables:
                    if not table or len(table) < 2:
                        continue
                    # 确定表头
                    if headers is None:
                        headers = [str(col).strip() if col else f"列_{i}" for i, col in enumerate(table[0])]
                    
                    # 提取数据行
                    for row in table[1:]:
                        clean_row = [str(cell).strip() if cell is not None else "" for cell in row]
                        clean_row.append(pdf_file.name)
                        all_rows.append(clean_row)

    if headers and all_rows:
        export_headers = headers + ["来源文件"]
        result_df = pd.DataFrame(all_rows, columns=export_headers)
        result_df.to_excel(output_excel, index=False)
        print(f"已成功从 PDF 批量抽取 {len(result_df)} 条表格数据,保存至 {output_excel}")
怎么用Python库实现Excel和PDF批量处理自动化
图3:PDF 批量解析与跨格式流转架构示意图

四、批量自动化任务的健壮执行框架

处理单个文件时代码写得再优雅,一旦进入上百个文件的批量循环,往往会遇到隐藏坑点:有的文件被其他程序占用加锁、个别文件格式损坏、表头被人工修改、或者内存被海量中间变量撑爆。生产级的自动化脚本必须具备健全的容错与恢复机制。

核心工程实践原则:
  • 隔离单文件异常:循环内部必须通过 try-except 捕获单次解析错误,记录错误日志后跳过,坚决不能让一个损坏的文件中断整个耗时任务。
  • 过滤临时锁定文件:Windows 与 Mac 下 Office 开启时都会生成如 ~$filename.xlsx 的临时隐藏锁,遍历时必须显式跳过。
  • 批次写入(Chunking):当合并上千个大表时,不要把全量原始数据全部堆叠在单列表里,可按每 50 或 100 个文件分批向文件写出,及时释放内存。
怎么用Python库实现Excel和PDF批量处理自动化
图4:企业级批量自动化任务的稳定性保障体系

五、总结

利用 Python 实现 Excel 和 PDF 批量处理自动化的本质,是把原本人工点击鼠标的重复动作,拆解为标准的数据流处理环节。在实际工程落地中:

  • 对于 Excel,根据是否需要保留格式,选择 openpyxl(保样式)或 pandas(做统计与合并);
  • 对于 PDF,页面层面的批量拼装拆分选择 pypdf,深入到文档内部提取表格与文本字段则选用 pdfplumber;
  • 建立以 pathlib 为基础的文件遍历架构,辅以异常沙箱与日志审计机制,就能构建出稳定、高效且具备自我容错能力的自动化办公利器。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。