怎么用Python库实现Excel和PDF批量处理自动化
日常办公中大量繁琐的重复性工作集中在表格汇总和文档整理上。利用 Python 的开源库生态,可以把几十甚至上千个 Excel 文件的格式提取、数据清洗与多表合并,以及 PDF 文档的批量拆分、页面提取与表格解析,完全封装为自动执行的脚本流水线。本文通过明确的库选型、可直接运行的代码示例和工程级容错策略,带你系统掌握办公文档批量自动化的实现路径。
一、核心Python库选型与任务边界划分
实现自动化前,第一步是根据文件格式特点与处理深度选择匹配度最高的库。Excel 与 PDF 的底层存储机制完全不同:Excel 是结构化的电子表格数据,而 PDF 本质上是基于排版指令的固定布局文档。因此,需要针对任务场景进行工具分工。
对于 Excel 处理:
- pandas:专注于结构化表格的大规模批量操作、统计汇总、清洗过滤和多表拼接。当每个表格包含大量行且只关注数据本身时,pandas 的处理速度和代码精简度具有明显优势。
- openpyxl:专注于
.xlsx文件的深度操作。如果需要保留原工作表的单元格背景色、边框样式、多级表头、复杂公式或操作多个特定命名的 Sheet,openpyxl 是首选。
对于 PDF 处理:
- pypdf:适合宏观页面层级的操作,例如将几十个 PDF 文件的特定页面截取并合并为一个总文件,或者进行批量页面旋转、加密和水印添加。
- pdfplumber:建立在 pdfminer 之上,具有强大的几何坐标识别能力。它能够高精度解析文本排版,并自动识别表格网格线,将 PDF 中的发票、对账单表格逐行提取为结构化数据。
二、Excel批量处理实战:多表格扫描、清洗与自动合并
最常见的 Excel 自动化需求是将各部门或各分支机构提交的大量周报、考勤表、清单合并为一个完整的汇总表。手动打开文件、复制、粘贴不仅耗时,还极易遗漏或因表头不一致出错。
编写批量脚本时,推荐采用标准三步法:
- 目录扫描与安全过滤:使用 Python 内置的
pathlib.Path遍历目标目录,必须过滤掉文件名以~$开头的临时锁文件。 - 逐表读取与标准化标记:使用
pandas.read_excel载入数据,同时为每行数据新增一列记录源文件名或部门,便于后续追溯;清理多余空行与两端空格。 - 内存拼接与统一写出:将每个子表的 DataFrame 添加到列表中,最后调用
pd.concat一次性拼接并输出到新的汇总文件。
下面是一个完整的生产级 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}")
四、批量自动化任务的健壮执行框架
处理单个文件时代码写得再优雅,一旦进入上百个文件的批量循环,往往会遇到隐藏坑点:有的文件被其他程序占用加锁、个别文件格式损坏、表头被人工修改、或者内存被海量中间变量撑爆。生产级的自动化脚本必须具备健全的容错与恢复机制。
- 隔离单文件异常:循环内部必须通过
try-except捕获单次解析错误,记录错误日志后跳过,坚决不能让一个损坏的文件中断整个耗时任务。 - 过滤临时锁定文件:Windows 与 Mac 下 Office 开启时都会生成如
~$filename.xlsx的临时隐藏锁,遍历时必须显式跳过。 - 批次写入(Chunking):当合并上千个大表时,不要把全量原始数据全部堆叠在单列表里,可按每 50 或 100 个文件分批向文件写出,及时释放内存。
五、总结
利用 Python 实现 Excel 和 PDF 批量处理自动化的本质,是把原本人工点击鼠标的重复动作,拆解为标准的数据流处理环节。在实际工程落地中:
- 对于 Excel,根据是否需要保留格式,选择
openpyxl(保样式)或pandas(做统计与合并); - 对于 PDF,页面层面的批量拼装拆分选择
pypdf,深入到文档内部提取表格与文本字段则选用pdfplumber; - 建立以
pathlib为基础的文件遍历架构,辅以异常沙箱与日志审计机制,就能构建出稳定、高效且具备自我容错能力的自动化办公利器。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









