python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Word表格数据导入Excel

Python如何实现将Word表格数据导入Excel

作者:LSTM97

Word 文档中的表格往往承载着结构化数据,但进行统计、筛选或图表制作时,Excel 才是更合适的工具,下面我们就来看看如何使用Python将Word表格数据导入Excel吧

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

安装所需库

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

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 *。

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

知识扩展

Python 将 Word 表格导入 Excel

核心思路很简单:python-docx 读 Word 表格 → openpyxl 写 Excel。难点不在“能不能读”,而在合并单元格、多表格、表头识别这几个坑上。

1.装库

pip install python-docx openpyxl

2.最简可运行版本(单个表格)

from docx import Document
from openpyxl import Workbook

doc = Document("input.docx")
wb = Workbook()
ws = wb.active

table = doc.tables[0]                    # 第一个表格
for r, row in enumerate(table.rows, start=1):
    for c, cell in enumerate(row.cells, start=1):
        ws.cell(row=r, column=c, value=cell.text.strip())

wb.save("output.xlsx")

这段代码对规整表格(无合并单元格)完全够用。cell.text 拿到的是单元格内所有段落的纯文本,换行会保留。

3.多表格 / 多文件版本(更实用)

一个 Word 里通常有多个表格,建议每个表格写一个 sheet:

from docx import Document
from openpyxl import Workbook
from openpyxl.utils import get_column_letter

def docx_tables_to_excel(docx_path, xlsx_path):
    doc = Document(docx_path)
    wb = Workbook()
    wb.remove(wb.active)                 # 删掉默认空 sheet

    for idx, table in enumerate(doc.tables, start=1):
        ws = wb.create_sheet(title=f"Table{idx}")

        for r, row in enumerate(table.rows, start=1):
            for c, cell in enumerate(row.cells, start=1):
                ws.cell(row=r, column=c, value=cell.text.strip())

        # 自适应列宽(可选)
        for col in ws.columns:
            max_len = max((len(str(cell.value)) if cell.value else 0) for cell in col)
            ws.column_dimensions[get_column_letter(col[0].column)].width = min(max_len + 2, 50)

    wb.save(xlsx_path)

docx_tables_to_excel("input.docx", "output.xlsx")

多个 Word 文件追加到同一个 sheet,把内层循环换成 ws.append([...]) 即可:

for row in table.rows:
    ws.append([cell.text.strip() for cell in row.cells])

4.合并单元格:这是最大的坑

table.rows[i].cells 在水平合并时会返回重复的 cell 对象(同一个 _tc),直接写会导致列错位。更稳的方式是用 table._cells——它按网格顺序展开,长度恒等于 行数 × 列数:

n_rows = len(table.rows)
n_cols = len(table.columns)
cells = table._cells                     # 按网格展开,合并处会重复填值
for r in range(n_rows):
    for c in range(n_cols):
        cell = cells[r * n_cols + c]
        ws.cell(row=r + 1, column=c + 1, value=cell.text.strip())

这样合并单元格的值会在 Excel 里重复填充到每个网格位置。对“数据导入”来说这通常是想要的效果(后续可筛选、可透 视);如果你要在 Excel 里还原合并样式,需要额外读 gridSpan / vMerge 再调 ws.merge_cells(),代码量会明显上升,一般没必要。

5.pandas 一行流(适合只要数据)

import pandas as pd
from docx import Document

doc = Document("input.docx")
with pd.ExcelWriter("output.xlsx") as writer:
    for i, table in enumerate(doc.tables, start=1):
        data = [[cell.text.strip() for cell in row.cells] for row in table.rows]
        pd.DataFrame(data).to_excel(writer, sheet_name=f"Table{i}", index=False, header=False)

pandas 方案代码短,但合并单元格同样会错位,且不保留列宽、样式。数据量大、要后续做分析时用它更顺手。

到此这篇关于Python如何实现将Word表格数据导入Excel的文章就介绍到这了,更多相关Python Word表格数据导入Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文