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字符且不能有特殊符号。

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