如何提取 Word 文档中的表格并导出为 Excel(Python 教程)

在日常办公或数据处理任务中,我们经常需要将 Word 文档里分散的表格汇总到 Excel 中进行计算或分析。面对几十页甚至上百页的文档,手动复制+粘贴不仅效率低下,且极易出现单元格错位、格式丢失等问题。本文将带你探索如何利用 Python 实现数据从 Word 到 Excel 的自动化迁移。

为什么选择自动化方案?常见技术方案对比

在处理 Word 表格导出任务时,开发者有多种选择,比如手动复制、使用 VBA 等等。我们需要根据业务场景、开发成本以及处理效果来找到最适合的:

  • 手动复制粘贴:适用于处理极少量的单一表格。缺点在于无法保持长文本的段落格式,且在处理含有合并单元格的复杂表格时,数据容易发生偏移。
  • VBA (Visual Basic for Applications):Office 自带的脚本语言,可以快速将 Word 中的表格导出。虽然无需安装第三方库,但其语法陈旧、调试困难,且高度依赖 Microsoft Office 环境,无法在没有安装 Office 的服务器或 Linux 环境上运行,具有一定的设备局限性。
  • 开源 Python 库(如 python-docx):这类工具灵活性高,但在处理复杂格式(如嵌套表格、复杂的行列跨度映射)时,往往需要编写大量底层逻辑代码,开发成本较高,需要具备一定的编程知识。
  • 专业类库(Spire 系列组件) :功能强大、API 简单易懂。它最大的优势在于独立性 (无需安装 Office)和高集成度。它将复杂的 Word DOM 结构映射与 Excel 坐标系转换进行了底层封装,开发者只需通过简单的 API 调用,就可以精准保留原文档的逻辑结构和文本格式。

方案对比表:

维度 手动操作 VBA 宏 开源 Python 库 Spire 系列专业组件
执行效率 极低 极高
环境依赖 需人工参与 需安装 Office 需配置多种依赖 独立运行(零依赖)
合并单元格支持 差(易乱序) 较好 一般(需自行实现逻辑) 完美支持
复杂场景适配 较难 易(API 高级封装)

综合来看,对于追求高效率和系统稳定性的企业级开发,使用 Spire.Doc for Python 配合 Spire.XLS for Python 是当前最优的实战选型。

环境准备

在开始编写脚本之前,请确保你的 Python 环境中已安装相关组件。这两个库分别负责解析 Word 的流式文档结构和构建 Excel 的行列坐标体系:

bash 复制代码
pip install Spire.Doc
pip install Spire.XLS

你可以分别安装 Word 和 Excel 组件,也可以直接安装 Spire.Office for Python,它包含了 Spire.Doc for Python,Spire.XLS for Python,Spire.Presentation for Python 和 Spire.PDF for Python。此外所有组件都提供免费版用于小项目或测试。

如何构建 Python 导出表格的代码

为了让你更清晰地理解 Spire.Doc 和 Spire.XLS 导出 Word 表格的逻辑,我们将整个实现过程拆解为以下核心步骤:

1. 引入必要的类库

首先,我们需要在脚本开头引入 Spire 的核心模块。通过引入 spire.docspire.xls 及其通用常量模块,我们才能在 Python 中调用其封装好的文档处理引擎,从而实现对 Word DOM 树的解析和 Excel 工作簿的构建。

python 复制代码
from spire.doc import *
from spire.doc.common import *
from spire.xls import *
from spire.xls.common import *
import os

2. 初始化对象与加载源文件

分别创建 DocumentWorkbook 对象。随后,使用 LoadFromFile 方法加载待处理的源 Word 文档,并调用 Worksheets.Clear() 移除工作簿中默认生成的空白表,以确保输出结果不受默认工作表的干扰。

python 复制代码
# 创建 Word 文档对象并加载文件
document = Document()
document.LoadFromFile("E:/input/项目进度.docx")

# 创建 Excel 工作簿并清空默认工作表
workbook = Workbook()
workbook.Worksheets.Clear()

3. 遍历 Word 文档多层级结构

Word 的数据存储具有明显的层级性(Section > Table > Row > Cell)。我们需要使用嵌套循环依次遍历文档中的 Section (节)Table (表格) 。对于每一个发现的表格,我们通过 workbook.Worksheets.Add() 动态创建一个工作表,并通过 sheet_index 实现自动命名,确保一表一页。

python 复制代码
sheet_index = 0
for s in range(document.Sections.Count):
    section = document.Sections.get_Item(s)
    tables = section.Tables

    for t in range(tables.Count):
        table = tables.get_Item(t)
        # 动态创建工作表并递增索引
        sheet = workbook.Worksheets.Add(f"Table_{sheet_index + 1}")
        # ... (后续数据提取)
        sheet_index += 1

4. 提取单元格文本与格式映射

由于 Word 单元格内可能包含多个段落,所以我们需要遍历 Paragraphs 集合并手动拼接换行符 \n,以保留文本的原始换行结构。最后,通过 Style.WrapText = True 开启 Excel 的自动换行功能。

python 复制代码
# 遍历行与列
for r in range(table.Rows.Count):
    row = table.Rows.get_Item(r)
    for c in range(row.Cells.Count):
        cell = row.Cells.get_Item(c)
        
        cell_text = ""
        for p in range(cell.Paragraphs.Count):
            paragraph = cell.Paragraphs.get_Item(p)
            cell_text += paragraph.Text.strip() + "\n"

        # 写入 Excel 坐标并设置换行
        sheet.Range[r + 1, c + 1].Text = cell_text.strip()
        sheet.Range[r + 1, c + 1].Style.WrapText = True

5. 自动化布局优化与资源释放

数据填充完成后,利用 AutoFitColumns()AutoFitRows() 方法让程序自动根据内容调整列宽和行高。最后释放内存,确保系统资源回收。

完整代码示例

将上述的步骤整合,即可得到这个高效的 Word 表格导出脚本:

python 复制代码
from spire.doc import *
from spire.doc.common import *
from spire.xls import *
from spire.xls.common import *
import os

# 创建 Word 文档对象并加载文件
document = Document()
document.LoadFromFile("/input/项目进度.docx")

# 创建 Excel 工作簿并删除默认工作表
workbook = Workbook()
workbook.Worksheets.Clear()

# 遍历 Word 文档中的所有节
sheet_index = 0

for s in range(document.Sections.Count):
    section = document.Sections.get_Item(s)

    # 获取当前节中的所有表格
    tables = section.Tables

    for t in range(tables.Count):

        # 获取当前表格
        table = tables.get_Item(t)
        # 新建工作表
        sheet = workbook.Worksheets.Add(f"Table_{sheet_index + 1}")

        # 遍历表格行
        for r in range(table.Rows.Count):
            row = table.Rows.get_Item(r)

            # 遍历单元格
            for c in range(row.Cells.Count):
                cell = row.Cells.get_Item(c)

                # 提取单元格中的文本
                cell_text = ""
                for p in range(cell.Paragraphs.Count):
                    paragraph = cell.Paragraphs.get_Item(p)
                    cell_text += paragraph.Text.strip() + "\n"

                # 去除末尾换行
                cell_text = cell_text.strip()

                # 写入 Excel 单元格
                sheet.Range[r + 1, c + 1].Text = cell_text
                # 设置自动换行
                sheet.Range[r + 1, c + 1].Style.WrapText = True

        # 自动调整列宽行高
        sheet.AllocatedRange.AutoFitColumns()
        sheet.AllocatedRange.AutoFitRows()
        sheet_index += 1

# 保存为 Excel 文件
workbook.SaveToFile("/output/word表格.xlsx", ExcelVersion.Version2016)
document.Close()
workbook.Dispose()

下面是原始 Word 文档与提取到的表格的对比示意图:

结语

通过 Python 结合 Spire.Doc 与 Spire.XLS 库,我们仅需几十行代码就能解决复杂的文档数据提取难题。这种方案不仅保留了原始数据的段落结构,还通过自动化布局极大提升了结果文件的可用性。如果你正在处理大批量的文档自动化工作,不妨尝试这种更专业、更稳健的开发路径。

相关推荐
极光代码工作室1 小时前
基于NLP的智能问答系统设计
python·深度学习·自然语言处理·nlp
lbb 小魔仙1 小时前
Python 多模态 AI 应用开发实战:用 GPT-4o + LangChain 构建智能视觉助手
人工智能·python·langchain
江南十四行1 小时前
Python元类编程——从type到metaclass的深度探索
开发语言·python
Hello eveybody2 小时前
介绍一下动态树LCT(Python)
开发语言·python·算法
lbb 小魔仙2 小时前
DolphinDB:以“存算一体“重新定义工业时序数据的边界
开发语言·人工智能·python·langchain·jenkins
IT策士2 小时前
Python Word操作:从入门到精通
python·c#·word
捉鸭子2 小时前
QQ音乐sign vmp逆向
爬虫·python·网络安全·网络爬虫
冷小鱼2 小时前
多线程编程深度解析:Java与Python框架实战指南
java·开发语言·python·多线程
2501_930707782 小时前
使用C#代码在 Excel 中创建雷达图
信息可视化·excel