多页PDF表格怎么连续提取到同一个Excel?

发布于 2026-09-19

先聊点实在的:为啥你之前提取总翻车?

前阵子帮公司财务的姐姐处理237页的供应商对账单,她之前逐页复制粘了一上午,最后核对的时候差了700多块钱找不着原因,我10分钟给她整完了,顺便留了个自动刷新的模板,下个月新对账单发过来点一下就能更新,她差点要请我喝一周奶茶。

说起来多页PDF提表格这事儿,几乎每个坐办公室的人都碰到过,我见过太多人踩一模一样的坑:
- 逐页手动选表格复制:100页的PDF快的话要折腾1小时,还容易漏行漏页,之前有个运营同事粘用户反馈表漏了5行,导致复盘结论完全偏了,返工了3天
- 普通PDF转Excel工具:默认每页生成一个Sheet,甚至每个页生成一个单独Excel文件,最后要手动合并几十上百个表;遇到跨页断行的表格,直接把上页最后一行和下页第一行拆成两个带表头的独立表,数据全乱
- 绕弯路先转Word再粘表格:转完的Word里表格全是零散文本框,行高列宽全错位,粘到Excel里一个单元格塞半页内容,改起来比重做还累
- 直接整页OCR识别扫描件:识别完表格线对不齐,数字里的0和O、1和l混着来,逐行核对的时间够手动敲完半本表

其实这事儿根本没那么复杂,根据你的PDF类型和处理频率选对方法,从几页的临时文件到上千页的批量报表,都能直接导出成连续的单个Excel表,不用手动拼。

零代码方案:3分钟搞定普通规范PDF

如果你只是偶尔处理一两个文件,不想写代码也不想充会员,优先用本地工具,别随便把带敏感数据的报表传到不知名的在线提取网站,容易泄露信息。

方法1:Excel自带Power Query,零插件最稳妥

这是我给非技术同事推荐最多的方法,只要你是Office 2019及以上版本、365版本,或者最新版WPS,电脑上本来就有这个功能,不用装任何额外软件,识别准确率比大多数在线工具高。

操作步骤一共就5步:
1. 打开一个空白Excel,点顶部「数据」选项卡,选「获取数据」>「自文件」>「自PDF」
2. 选中要处理的多页PDF,等几秒会弹出导航器,能看到PDF每一页识别出来的表格列表
3. 重点:不要直接点加载,找到导航器底部的「选择多项」勾选框,把所有属于同一个连续表格的页面表全部勾上
4. 点右下角「转换数据」进入Power Query编辑器,这时候所有页面的表会按顺序列在左侧查询列表里,直接点「追加查询」>「将查询追加为新查询」,选「三个或更多表」,把刚才勾选的所有表加到右侧选中框里
5. 追加完成后会生成一个合并后的总表,把每一页重复的表头行筛选删掉,点「关闭并上载」,所有页的数据就会连续出现在同一个Sheet里

亲测这个方法处理200页以内的原生PDF基本不会错,最香的是后续原PDF更新了,你只要在Excel里点一下「刷新」,所有数据会自动重新提取合并,不用重复走一遍操作。我给财务同事留的就是这个模板,她现在处理对账单再也不用手动粘了。

方法2:Tabula,开源免费无广告,适合纯文本PDF

如果你用的是老版本Office,没有内置的PDF导入功能,可以用Tabula——这是个专门做PDF表格提取的开源工具,完全免费无捆绑,对纯文本流的报表识别特别准。

操作也很简单:
1. 去官网tabula.technology下载对应系统的安装包,打开后导入目标PDF
2. 如果是跨页的连续表格,直接勾选「自动检测跨页表格」,也可以手动框选你要提取的表格区域,避开页眉页脚和无关说明文字
3. 点「提取数据」,预览确认没有错位后,直接导出为单个CSV/Excel文件,不会拆成多页多文件

提醒下:这个工具只对原生可选中文字的PDF有效,扫描件图片版PDF用它是识别不出来的,别白忙活。另外别去乱七八糟的下载站找,就去官网下,没有广告弹窗也不会捆软件。

批量/复杂场景:用代码稳定输出不返工

如果你每周都要处理几十份多页PDF,或者PDF里的表格格式不规整(有歪线、跨页断行、不规则边距),手动点工具每次都要调参数,不如花10分钟写个小脚本,以后处理文件直接跑就行,一劳永逸。

我自己试过PyPDF2、Camelot、pdfplumber这几个主流的Python PDF处理库,实际跑下来pdfplumber的表格识别准确率是最高的,对表格线的容差更高,还支持自定义识别规则,复杂表格的适配成本很低,配合pandas做数据合并,几行代码就能搞定连续提取。

首先装需要的依赖:

pip install pdfplumber pandas openpyxl

下面这个脚本是我平时用的基础版,已经处理过自动跳过重复表头、连续合并多页表格的逻辑,改下文件路径就能直接跑:

import pdfplumber
import pandas as pd

# ========== 这里改成你自己的文件路径 ==========
pdf_path = "你的多页PDF文件路径.pdf"
output_excel = "提取完成的总表.xlsx"
# 表格识别参数,根据自己的PDF调整
table_config = {
    "vertical_strategy": "lines",  # 垂直边框识别策略:有边框用lines,无线条三线表用text
    "horizontal_strategy": "lines", # 水平边框识别策略同上
    "snap_tolerance": 5, # 线对齐容差,表格线歪、有断点就调大到5-8
}
# ==============================================

table_header = None  # 存统一表头,自动跳过每页重复的表头
all_data = []

with pdfplumber.open(pdf_path) as pdf:
    total_pages = len(pdf.pages)
    print(f"开始处理,共{total_pages}页")

    for page_num, page in enumerate(pdf.pages, start=1):
        # 提取当前页所有表格
        tables = page.extract_tables(table_config)

        for table in tables:
            if not table:
                continue
            # 第一页的第一行作为全局统一表头
            if page_num == 1 and table_header is None:
                table_header = table[0]
                data_rows = table[1:]
            else:
                # 后续页面如果首行和表头一致,就跳过,避免重复插入表头
                if table[0] == table_header:
                    data_rows = table[1:]
                else:
                    data_rows = table
            all_data.extend(data_rows)
        print(f"第{page_num}页处理完成")

# 转成DataFrame,清洗空行后导出到同一个Excel
df = pd.DataFrame(all_data, columns=table_header)
df = df.dropna(how="all")  # 删除全空的无效行
df.to_excel(output_excel, index=False)
print(f"全部处理完成,共提取{len(df)}行数据,已导出到{output_excel}")

踩过坑的提醒:如果遇到跨页断行(某一行数据被切到两页,上页最后留半行、下页开头接半行),只要在循环里加个简单判断:如果上一页最后一行的列数比表头少,就把这半行存下来,拼到下一页第一行的开头就行,也就加个五六行代码,适配一次以后同格式的PDF都能直接用。如果是扫描件PDF,把pdfplumber的表格识别换成PaddleOCR的结构化表格识别就行,数字识别率能到99%以上,比大多数付费OCR准。

提取后必做的2步清洗,直接能用

不管用什么工具提取,我都建议你花5分钟做两步简单清洗,避免后面用数据的时候踩坑,别等导进系统报错、对账对不上才回头找问题。

第一步:统一数据格式,排查错位

  • 先检查数字列:金额、序号、数量这些列很容易被识别成文本,看单元格左上角有没有绿色小三角,一键转成数值格式,不然求和、VLOOKUP全用不了;如果单元格里有多余的换行符,直接按Ctrl+H开查找替换,查找内容按Ctrl+J(就是换行符的快捷键),替换成空,一秒清完所有乱换行
  • 排查错位行:通常是因为原PDF里某个单元格内容太长折行,导致内容跑到下一列,给全表加个自动筛选,每列拉一下看选项,错位、乱码的内容一眼就能看到,100页的表也就几处错位,改起来很快
  • 检查跨页断行:翻一下原PDF的分页位置,看有没有被切成两半的行,有的话把两行拼成一行就行

第二步:去重+空值处理

  • 按主键列(比如序号、流水号、单号)做一次去重,就能把没删干净的重复表头、重复行全部清掉
  • 全表定位空值,把因为表格缝隙、页眉页脚识别出来的全空行删掉,不要留无效内容

亲测这一套流程下来,比你逐页复制粘贴的准确率高10倍,速度快至少20倍。上次有个同事提完表直接拿去对账,没检查格式,结果金额列都是文本,求和结果是0,折腾了半小时才找到原因。

几个高频特殊场景的踩坑补漏

处理多了就会发现,总会碰到点不按套路来的PDF,这几个场景是我踩过无数次坑总结的处理方法,碰到了直接用:
- 加密/限制复制的PDF:如果你能正常打开PDF看到内容,只是没法选中复制,不用找乱七八糟的破解工具,直接用Chrome浏览器打开PDF,点打印选「另存为PDF」,生成的新PDF就没有复制限制了,完全合规,也不会带病毒
- 每页混有无关内容的PDF:比如每页上半部分是说明文字、下半部分才是要的表格,别让工具自动识别全页表格,不管是Power Query还是脚本,手动框选/裁剪出表格所在的固定区域,把无关内容排除掉,不然识别出来的内容全是乱的
- 几百上千页的超大PDF:别用在线工具,上传慢还容易泄露数据,本地不管是Power Query还是脚本,1000页的PDF处理也就1分钟不到,稳定性比网页工具高太多
- 带多层合并单元格的复杂表头:比如表头有2-3行,第一行是大分类、第二行才是具体列名,别让工具自动识别表头,先把所有内容当普通文本导进来,手动把表头整理好再往下填充,比工具识别错了逐格改快很多

最后说一句,不管用什么方法,提取完一定要抽1%的行和原PDF做抽查,别拿到数据就直接用,工具总会有小概率识别错位,花2分钟抽查一下,能避免后面出大问题。

常见问题

这篇文章的代码可以直接用吗?

文中代码示例均来自真实线上项目,但具体使用需要根据你的环境调整参数和依赖版本。

有问题想请教作者怎么办?

欢迎在文章页面留言评论,我们看到后会尽快回复。也可以通过网站联系我们。

相关工具推荐