我的知识记录

Python Word批量提取所有表格汇总到Excel

用python-docx遍历Word文档里所有表格,把每个表格按sheet或追加方式汇总到Excel,适合从大量合同、报告里抽数据做统计。

场景痛点

几十份Word报告里各有一张"预算表""人员表",要把它们合并到一张Excel里做汇总分析。手动打开每个文档复制表格,复制到Excel还得对齐列。用Python遍历所有文档所有表格,一行行写进Excel,文件名也记上,后续透视表直接做。

用到的库

pip install python-docx openpyxl pandas

完整代码

# -*- coding: utf-8 -*-
"""
批量提取 Word 文档里的所有表格,汇总到一个 Excel 文件
"""
from pathlib import Path
import pandas as pd
from docx import Document


def extract_tables_from_docx(docx_path: Path):
"""从一个 docx 里提取所有表格,返回 DataFrame 列表"""
doc = Document(str(docx_path))
frames = []

for idx, table in enumerate(doc.tables):
rows_data = []
for row in table.rows:
cells = [cell.text.strip().replace("\n", " ") for cell in row.cells]
rows_data.append(cells)

if not rows_data:
continue

# 第一行当表头,其余当数据
header = rows_data[0]
body = rows_data[1:] if len(rows_data) > 1 else []

# 列数不一致时补空
n_cols = len(header)
body = [r + [""] * (n_cols - len(r)) if len(r) < n_cols else r[:n_cols] for r in body]

df = pd.DataFrame(body, columns=header)
# 加来源列
df["来源文件"] = docx_path.name
df["表格序号"] = idx + 1
frames.append(df)

return frames


def batch_extract(input_dir, output_excel):
input_dir = Path(input_dir)
docx_files = [f for f in input_dir.glob("*.docx") if not f.name.startswith("~$")]
print(f"共 {len(docx_files)} 个文档")

all_frames = []
per_file_summary = []

for docx_file in docx_files:
try:
frames = extract_tables_from_docx(docx_file)
all_frames.extend(frames)
per_file_summary.append((docx_file.name, len(frames)))
print(f"✓ {docx_file.name}:提取 {len(frames)} 个表格")
except Exception as e:
print(f"✗ {docx_file.name} 失败:{e}")

# 汇总写入 Excel,分 sheet 也可以,这里用一个总表 + 一个总览
with pd.ExcelWriter(output_excel, engine="openpyxl") as writer:
if all_frames:
merged = pd.concat(all_frames, ignore_index=True)
merged.to_excel(writer, sheet_name="全部表格汇总", index=False)

summary_df = pd.DataFrame(per_file_summary, columns=["文件名", "表格数量"])
summary_df.to_excel(writer, sheet_name="提取总览", index=False)

print(f"\n已生成:{output_excel}")
print(f"共合并 {len(all_frames)} 个表格")


if __name__ == "__main__":
batch_extract(
input_dir="./word_docs",
output_excel="./tables_summary.xlsx",
)

代码讲解

extract_tables_from_docx() 遍历 doc.tables,每个表格把每行单元格的文本抽出来拼成二维列表。第一行当表头,剩下行当数据。遇到列数不齐的行用空字符串补齐,避免pandas报列数不一致。

每个DataFrame加两列:来源文件表格序号,这样汇总后能知道每行数据来自哪个文档的第几张表。

最后用 pd.ExcelWriter 写两个sheet:「全部表格汇总」把所有表格纵向拼到一张大表里,适合做透视;「提取总览」每个文件提取了几张表,方便核对漏没漏。

运行结果

当前目录生成 tables_summary.xlsx,打开后"全部表格汇总"sheet里是所有Word表格的合并数据,最后两列标注来源。"提取总览"sheet是每个文件的表格数清单。控制台打印每个文件提取了几个表,0个说明该文档没表格。

注意事项

  • 合并单元格在python-docx里会重复读取(合并的单元格每个都返回同样的文字),提取后要去重,或者接受这种情况。
  • 嵌套表格(表格里套表格)python-docx 默认读不到,需要递归遍历 cell.tables
  • 不同文档的表格列名不一样时,pd.concat 会自动并集列,空位置填NaN,这是正常的。
  • 表格里的图片、公式提取不出来,只有文字。
  • 如果要"每个Word一个sheet"而不是合并,可以改成把每个DataFrame用 df.to_excel(writer, sheet_name=文件名[:31]),注意sheet名最长31字符且不能有特殊符号。

Python Word批量提取所有表格汇总到Excel

标签:

更新时间:2026-09-15 08:53:19

上一篇:Python Word批量生成通知书邀请函教程

下一篇:Python Word提取文档中图片教程