在实际办公和开发场景中,我们经常会遇到这样的需求:Word 文档中包含大量结构化表格数据,而最终需要将这些数据统一整理到 Excel 中进行统计、分析或二次处理。手动复制粘贴不仅效率低,而且在遇到复杂表格(如单元格内多段文本、多表格文档)时,格式也很容易被破坏。

借助 Python 脚本我们可以自动化提取 Word 文档中的所有表格,并将每个表格完整写入 Excel 的独立工作表中,在保证数据结构清晰的同时,大幅提升处理效率。

本文将详细介绍一种完整、可复用的实现方案,并对关键代码逻辑进行说明,适用于批量表格转换与自动化办公场景。


本文所使用的方法需要用到 Free Spire.Doc for Python 和 Free Spire.XLS for Python,分别用于提取 Word 表格数据和写入 Excel 文件。可通过 pip 安装:pip install spire.doc.free spire.xls.free


一、实现思路概览

整个转换流程可以拆分为两个清晰的阶段:

  1. 从 Word 文档中提取表格数据

    • 遍历文档中的所有节(Section)
    • 遍历每个节中的所有表格(Table)
    • 逐行、逐单元格读取文本内容
    • 保留单元格内的原有段落结构
  2. 将提取的数据写入 Excel 文件

    • 为每个 Word 表格创建一个新的工作表
    • 按行列顺序写入单元格内容
    • 自动调整列宽,提升可读性

这种“先抽象为数据结构,再写入目标文件”的方式,逻辑清晰,也便于后续扩展(例如 CSV、数据库等)。


二、使用 Python 提取 Word 中的表格数据

下面的函数负责从 Word 文档中提取所有表格,并以嵌套列表的形式返回数据

from spire.doc import *

def extract_tables_from_word(word_file_path):
    """
    从 Word 文档中提取所有表格数据。
    返回一个列表,其中:
    - 每个元素代表一个表格
    - 表格内部是“行”的列表
    - 每一行是“单元格内容”的列表
    """
    document = Document()
    document.LoadFromFile(word_file_path)

    all_tables_data = []

    # 遍历文档中的所有节
    for sec_index in range(document.Sections.Count):
        section = document.Sections.get_Item(sec_index)

        # 遍历节中的所有表格
        for table_index in range(section.Tables.Count):
            table = section.Tables.get_Item(table_index)
            current_table_data = []

            # 遍历表格中的所有行
            for row_index in range(table.Rows.Count):
                table_row = table.Rows.get_Item(row_index)
                current_row_data = []

                # 遍历行中的所有单元格
                for cell_index in range(table_row.Cells.Count):
                    table_cell = table_row.Cells.get_Item(cell_index)

                    # 提取单元格中的所有段落文本,保留换行结构
                    paras = [
                        table_cell.Paragraphs.get_Item(i).Text.rstrip('\r\n')
                        for i in range(table_cell.Paragraphs.Count)
                        if table_cell.Paragraphs.get_Item(i).Text.strip()
                    ]
                    current_cell_data = "\n".join(paras)
                    current_row_data.append(current_cell_data)

                current_table_data.append(current_row_data)

            all_tables_data.append(current_table_data)

    document.Close()
    return all_tables_data

关键说明

  • Section → Table → Row → Cell 的层级结构,符合 Word 文档的真实组织方式
  • 使用 Paragraphs 而不是直接读取 Text,可以:

    • 避免丢失单元格内的多段内容
    • 保留原有换行结构,写入 Excel 后依然清晰
  • 最终返回的数据是一个三层嵌套列表,非常适合后续写入表格类文件

三、将提取的数据写入 Excel 文件

在拿到结构化表格数据后,接下来使用 Spire.XLS for Python 将其写入 Excel。

from spire.xls import *

def write_data_to_excel(extracted_data, excel_file_path):
    """
    将提取的 Word 表格数据写入 Excel 文件。
    每个 Word 表格对应 Excel 中的一个工作表。
    """
    workbook = Workbook()
    # 清除默认工作表
    workbook.Worksheets.Clear()

    if not extracted_data:
        print("没有从 Word 文档中提取到任何表格数据。")
        return

    # 遍历所有表格数据
    for i, table_data in enumerate(extracted_data):
        sheet = workbook.Worksheets.Add(f"Table_{i + 1}")

        # 写入行列数据
        for r_idx, row_data in enumerate(table_data):
            for c_idx, cell_value in enumerate(row_data):
                # Excel 行列索引从 1 开始
                sheet.Range[r_idx + 1, c_idx + 1].Value = cell_value

        # 自动调整列宽
        sheet.AllocatedRange.AutoFitColumns()

    workbook.SaveToFile(excel_file_path, ExcelVersion.Version2016)
    workbook.Dispose()
    print(f"数据已成功写入到 {excel_file_path}")

实现要点

  • 每个 Word 表格 → 一个 Excel 工作表

    • 结构直观,避免数据混杂
  • Excel 行列索引从 1 开始,需要注意与 Python 索引的差异
  • AutoFitColumns() 可显著提升导出后的可读性

四、完整调用示例

word_file = "input.docx"
excel_file = "output.xlsx"

extracted_data = extract_tables_from_word(word_file)
write_data_to_excel(extracted_data, excel_file)

运行后,Word 文档中的所有表格将被完整转换,并按顺序写入 Excel 文件。以下是运行结果示例:

Python提取Word表格到Excel


五、适用场景与扩展建议

适用场景

  • 将报告型 Word 文档中的数据统一汇总到 Excel
  • 自动化处理批量合同、清单、配置表
  • 作为数据清洗或分析流程的前置步骤

扩展方向

  1. 批量处理多个 Word 文件
  2. 根据表格内容自动命名工作表
  3. 对 Excel 输出添加边框、样式或冻结首行
  4. 将中间数据结构复用于 CSV 或数据库写入

总结

通过结合 Spire.Doc for PythonSpire.XLS for Python,我们可以用一套清晰、稳定的 Python 方案,实现 Word 表格到 Excel 表格的自动化转换。这种方式不仅避免了手动复制的低效和错误,也为后续的数据处理和分析提供了良好的基础。

对于需要频繁处理文档表格数据的开发者和办公场景来说,这是一种非常实用、可维护性也很高的解决方案。

标签: none

添加新评论