首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用 Python 将 Word 表格数据导入 Excel

使用 Python 将 Word 表格数据导入 Excel

原创
作者头像
用户12495000
发布于 2026-10-26 10:38:46
发布于 2026-10-26 10:38:46
1560
举报

Word 文档中的表格往往承载着结构化数据,但进行统计、筛选或图表制作时,Excel 才是更合适的工具。当文档包含多张表格时,手动复制粘贴不仅耗时,还容易在格式转换中出错。本文介绍如何使用 Spire.Doc for Python 和 Spire.XLS for Python,将 Word 文档中的每一张表格自动导入为 Excel 的独立工作表,并客观说明该方案能够解决和无法覆盖的问题。

安装所需库

在开始之前,需要安装两个库:Spire.Doc 负责读取和解析 Word 文档中的表格结构,Spire.XLS 负责创建和写入 Excel 文件。在命令行中执行:

代码语言:javascript
复制
pip install Spire.Doc
pip install Spire.XLS

需要留意的是,Spire 系列提供免费版(Free Edition),例如 spire.doc.free 和 spire.xls.free,可以通过 pip install spire.doc.free spire.xls.free 安装。免费版在功能上有一定限制,例如 Free Spire.Doc 限制每个文档最多 500 个段落和 25 张表格。如果待处理的文档规模较小,免费版可以满足需求;若文档较大或表格数量较多,则需要使用完整版本。

两个库都支持 Windows、Linux 和 macOS 平台,且不依赖 Microsoft Office 或 Word 的安装。

实现思路

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

提取阶段 :加载 Word 文档,遍历其中的每一个节(Section),再遍历节内的每一张表格。对于表格中的每一个单元格,读取其全部段落文本并拼接,以保留单元格内可能存在的多段内容。

写入阶段 :新建一个 Excel 工作簿,为每一张 Word 表格创建一个独立的工作表。按行列顺序将提取的文本写入对应单元格,最后自动调整列宽并保存文件。

完整代码示例

以下代码实现了上述流程。代码基于完整版 Spire 库编写;如果使用免费版,导入语句需相应调整为 from spire.doc import * 和 from spire.xls import *。

代码语言:javascript
复制
from spire.doc import *
from spire.xls import *

# 加载 Word 文档
doc = Document()
doc.LoadFromFile('input.docx')

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

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

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

        # 为每张表格创建独立工作表,命名包含节序号和表序号
        ws = wb.Worksheets.Add(f'Table_{i+1}_{j+1}')

        # 逐行逐单元格写入数据
        for row in range(table.Rows.Count):
            tableRow = table.Rows.get_Item(row)

            for cell in range(tableRow.Cells.Count):
                tableCell = tableRow.Cells.get_Item(cell)

                # 拼接单元格内所有段落的文本
                cellText = ''
                for paragraph in range(tableCell.Paragraphs.Count):
                    paragraph = tableCell.Paragraphs.get_Item(paragraph)
                    cellText = cellText + (paragraph.Text + ' ')

                # 以 "00" 开头的文本直接赋值,避免被 Excel 自动转为数字
                if cellText.startswith('00'):
                    ws.Range[row + 1, cell + 1].Text = cellText
                else:
                    ws.SetCellValue(row + 1, cell + 1, cellText)

        # 根据内容自动调整列宽
        ws.AllocatedRange.AutoFitColumns()

# 保存为 Excel 2016 格式
wb.SaveToFile('output/WordTableToExcel.xlsx', FileFormat.Version2016)

doc.Close()
wb.Dispose()

运行前请确保 input.docx 位于脚本同级目录,且 output 文件夹已存在(或根据实际需要修改保存路径)。

代码中的几个关键处理

单元格内多段落的拼接。 Word 单元格中可以包含多个段落,直接取第一个段落会丢失后续内容。代码通过遍历 tableCell.Paragraphs 将每段文本依次拼接,并在末尾追加空格作为分隔,确保单元格内的完整信息被保留。

以 "00" 开头的文本保护。 Excel 在通过 SetCellValue 写入字符串时,可能将形如 "001" 的内容自动识别为数字 1。代码对此做了判断:若文本以 "00" 开头,则改用 ws.Range[row + 1, cell + 1].Text = cellText 赋值,这种方式更倾向于保留字符串原貌。不过这一保护仅覆盖了 "00" 前缀的情况,其他可能被误判的格式(如长数字串、日期样式的文本)并未纳入处理范围。

工作表命名。 采用 Table_{节序号}_{表序号} 的格式,便于在 Excel 中追溯每张工作表对应的 Word 表格位置。

未覆盖的情形

当前代码只处理了结构最简单的二维文本表格。以下几种常见情况它无法正确处理:

单元格合并。 Word 表格中的合并单元格在遍历时,tableRow.Cells.Count 和单元格索引所对应的网格位置可能与视觉布局不一致。代码按 Cells 集合顺序逐一遍历,没有读取 GridSpan 或 VerticalMerge 等属性。如果源表格存在合并单元格,写入 Excel 后原本合并的区域会被拆散,文本可能出现重复或错位。若要处理,需要额外读取合并属性并在 Excel 侧执行对应的 Merge 操作。

单元格内的图片。 代码只提取了段落文本。如果某个单元格内嵌有图片或其他非文本对象,这些内容会被完全忽略,不会出现在 Excel 中。

文本格式的保留。 写入 Excel 的内容只有纯文本字符串。Word 单元格中的字体、字号、加粗、颜色、对齐方式等格式信息,以及段落之间的换行关系(代码用空格拼接段落),在写入时都没有被传递。Excel 单元格只承载了文本值,视觉样式全部丢弃。

表格外的上下文信息。 如果 Word 文档中的表格带有标题行、说明性段落或跨表引用,这些内容不会进入 Excel。每张表格被独立放入一张工作表,表与表之间的逻辑关系仅通过命名中的序号体现。

适用场景

这段代码适合处理来源规范、结构简单的 Word 表格:无合并单元格、单元格内只有纯文本、对格式还原没有要求。在这类前提下,它可以快速完成多张表格的批量导出,省去逐一手动复制的时间。如果源文档的表格存在上述复杂情况,则需要在当前代码基础上增加相应的检测与处理逻辑,否则导出结果会与原始表格存在偏差。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 安装所需库
  • 实现思路
  • 完整代码示例
  • 代码中的几个关键处理
  • 未覆盖的情形
  • 适用场景
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档