当前位置: 代码网 > it编程>前端脚本>Python > Python把PDF表格完整转换成Excel的小白教程

Python把PDF表格完整转换成Excel的小白教程

2026年04月26日 Python 我要评论
很多同学第一次接触 pdf 数据处理时,都会遇到一个问题:pdf 里的表格能看,不能算,不能统计。比如:招聘成绩公示学校成绩单名单汇总表本文将通过一个完整可运行的 python 示例,一步一步教你:如

很多同学第一次接触 pdf 数据处理时,都会遇到一个问题:

pdf 里的表格能看,不能算,不能统计。

比如:

  • 招聘成绩公示
  • 学校成绩单
  • 名单汇总表

本文将通过一个完整可运行的 python 示例,一步一步教你:

如何把一个多页 pdf 表格,稳定地转换成 excel 文件

一、整体思路先说明(很重要)

在正式写代码前,你一定要明白一件事:

pdf ≠ excel

  • excel:天然是“行 + 列”
  • pdf:只是“排好版的页面”

所以我们要做的是:

1. 从 pdf 中提取“表格结构”
2. 把每一行数据收集起来
3. 修复列数不一致的问题
4. 再导出为 excel

二、完整代码(先给结论)

下面是完整、可直接运行的代码,后面我会逐步拆解讲解。

import pdfplumber
import pandas as pd
import os
def pdf_to_excel(pdf_path, excel_path):
    all_rows = []
    # 打开 pdf
    with pdfplumber.open(pdf_path) as pdf:
        print(f"pdf共有 {len(pdf.pages)} 页")
        # 遍历每一页
        for page_num, page in enumerate(pdf.pages, start=1):
            print(f"正在处理第 {page_num} 页...")
            tables = page.extract_tables()
            if not tables:
                continue
            for table in tables:
                for row in table:
                    # 跳过全空行
                    if row and any(cell and cell.strip() for cell in row if isinstance(cell, str)):
                        all_rows.append(row)
    if not all_rows:
        print(" 未提取到任何表格数据")
        return
    # 计算最大列数
    max_cols = max(len(row) for row in all_rows)
    print(f"检测到最大列数:{max_cols}")
    # 统一所有行的列数
    normalized_rows = []
    for row in all_rows:
        if len(row) < max_cols:
            row = row + [none] * (max_cols - len(row))
        elif len(row) > max_cols:
            row = row[:max_cols]
        normalized_rows.append(row)
    # 第一行作为表头
    header = normalized_rows[0]
    data = normalized_rows[1:]
    # 去除重复表头行
    clean_data = []
    for row in data:
        if row != header:
            clean_data.append(row)
    # 构建 dataframe
    df = pd.dataframe(clean_data, columns=header)
    # 清理空行、空列
    df = df.dropna(how='all').dropna(axis=1, how='all')
    # 导出 excel
    df.to_excel(excel_path, index=false, engine='openpyxl')
    print("\n 转换完成")
    print(f"excel 文件路径:{excel_path}")
    print(f"数据行数:{len(df)}")
    print(f"列数:{len(df.columns)}")
    print("列名:", list(df.columns))
    print("\n前 5 行数据预览:")
    print(df.head())
if __name__ == "__main__":
    pdf_file = "example.pdf"
    excel_file = "result.xlsx"
    if not os.path.exists(pdf_file):
        print(f"找不到 pdf 文件:{pdf_file}")
    else:
        pdf_to_excel(pdf_file, excel_file)

三、逐步解析代码(小白重点)

1、导入库

import pdfplumber
import pandas as pd
import os

作用说明:

作用
pdfplumber读取 pdf、提取表格
pandas处理表格数据
os判断文件是否存在

2、定义核心函数

def pdf_to_excel(pdf_path, excel_path):

这个函数只做一件事:

把一个 pdf 表格文件,转换成 excel

3、收集所有表格行

all_rows = []

为什么要这样做?

因为 pdf 是一页一页的
但 excel 是一个整体表格

4、打开 pdf 并逐页处理

with pdfplumber.open(pdf_path) as pdf:
  • pdf.pages:pdf 的每一页
  • extract_tables():提取当前页中的表格

5、跳过空行(非常关键)

if row and any(cell and cell.strip() for cell in row if isinstance(cell, str)):

作用:

  • 防止空行进入 excel
  • 防止生成一堆没用的数据

6、为什么要“统一列数”(核心思想)

max_cols = max(len(row) for row in all_rows)

现实中的 pdf 表格:

  • 有的页 8 列
  • 有的页 9 列
  • 有的页 10 列

如果不统一,pandas 会直接报错

所以我们要:

不足的补 none,多的截断

7、第一行作为表头

header = normalized_rows[0]

pdf 表格通常每一页都有表头,
我们只保留第一行作为最终列名。

8、去掉重复表头行

if row != header:
    clean_data.append(row)

否则 excel 会变成:

职位代码 | 职位名称 | ...
职位代码 | 职位名称 | ...
职位代码 | 职位名称 | ...

9、导出 excel

df.to_excel(excel_path, index=false, engine='openpyxl')

这一步就是真正生成 excel 文件。

四、示例 pdf 模板(示意)

假设你的 pdf 表格内容长这样(每一页类似):

职位代码职位名称准考证号考场号座位号成绩
00001a001a000102012178.25
00001a001a000101011182.50

五、预期 excel 处理结果

最终生成的 excel 表格应为:

职位代码职位名称准考证号考场号座位号成绩
00001a001a000102012178.25
00001a001a000101011182.50

一人一行,可直接统计、排序、筛选

六、这个程序能做什么 / 不能做什么

能处理

  • 多页 pdf 表格
  • 列数不一致
  • 招聘、公示、成绩类 pdf

不能处理

  • 扫描版 pdf(图片)
  • 完全靠空格排版的“假表格”

七、总结一句话

pdf → excel 的难点不在“读取”,而在“结构修复”。

这份代码已经解决了:

  • 多页
  • 表头重复
  • 列数不一致

以上就是python把pdf表格完整转换成excel的小白教程的详细内容,更多关于python pdf表格转成excel的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com