Python实现快速提取Word表格并转Markdown

 更新时间:2025年04月10日 09:17:26   作者:Python测试之道  
这篇文章主要为大家详细介绍了一套Python零基础可操作的代码方案,帮助测试工程师3分钟内完成表格提取与转换,直接对接自动化测试或大模型,需要的小伙伴可以参考下

一、为什么需要这个工具

在测试工作中,我们常遇到这样的场景:

  • 需求文档是Word格式,但需要将表格数据提取出来生成测试用例
  • 手动复制粘贴效率低且易出错
  • 大模型需要结构化数据输入,但Word表格格式复杂

本文提供一套零基础可操作的代码方案,帮助测试工程师3分钟内完成表格提取与转换,直接对接自动化测试或大模型。

二、代码实战:三步搞定表格提取

第一步:安装依赖

pip install python-docx

注意:

  • 如果提示权限问题,可在命令前加 sudo(Linux/macOS)或以管理员身份运行命令行(Windows)。
  • 如果文档包含复杂格式(如合并单元格),需确保 python-docx 版本 ≥ 0.8.11。

第二步:核心代码解析

1. 标题检测:精准定位目标段落

def is_heading_enhanced(paragraph):
    # 标题特征:样式名称含关键词 + 字体加粗 + 字体足够大
    style_name = (paragraph.style.name or "").lower()
    if "标题" in style_name or "heading" in style_name:
        return True
    
    try:
        font = paragraph.style.font
        return (font.size.pt >= 14 and font.bold) if font.size else False
    except:
        return False

关键点详解:

样式名称匹配:

  • 优先检查标题样式名称是否包含 标题(中文)或 heading(英文),如 Heading 1、标题1。
  • 这一设计能快速定位到文档中明确标记的标题段落。

格式兜底判断:

  • 字体大小:标题通常比正文大,这里设置阈值为14pt(可调整)。
  • 加粗要求:标题一般需要加粗,确保格式一致性。
  • 如果段落样式名称未包含关键词,但满足格式条件,也会被识别为标题。

异常处理:

使用 try-except 捕获字体信息缺失的异常,避免程序崩溃。

2. 表格抓取:按文档顺序提取

def get_tables_under_heading(doc_path, target_title):
    from docx import Document
    doc = Document(doc_path)
    target_tables = []
    found = False

    for element in doc.element.body.iter():
        if element.tag.endswith('p'):  # 段落
            par = Paragraph(element, doc)
            if target_title in par.text and is_heading_enhanced(par):
                found = True
            elif found and is_heading_enhanced(par):  # 遇到新标题停止
                break
        elif element.tag.endswith('tbl') and found:  # 表格
            table = Table(element, doc)
            data = [[cell.text.strip() for cell in row.cells] for row in table.rows]
            target_tables.append(data)
    
    return target_tables

实战技巧详解:

文档元素遍历:

  • 通过 doc.element.body.iter() 直接遍历Word文档底层元素,确保段落和表格的顺序与实际文档一致。
  • element.tag.endswith('p') 和 element.tag.endswith('tbl') 分别识别段落和表格的XML标签。

双重标记机制:

  • found 标记:当找到目标标题后,标记为 True,开始收集后续的表格。
  • 新标题终止:一旦遇到新标题(同样满足标题检测条件),立即停止收集,避免误取其他章节的表格。

数据提取:

使用列表推导式逐行提取表格内容,cell.text.strip() 去除单元格中的多余空格。

3. 转换Markdown:结构化输出

def to_markdown(table_data):
    if not table_data:
        return ""
    headers = table_data[0]
    md = f"| {' | '.join(headers)} |\n"
    md += f"| {' | '.join(['---']*len(headers))} |\n"
    for row in table_data[1:]:
        md += f"| {' | '.join(row)} |\n"
    return md

效果示例:

| 用户角色 | 创建权限 | 删除权限 | 修改权限 |
|----------|----------|----------|----------|
| 管理员   | 是       | 是       | 是       |
| 普通用户 | 否       | 否       | 是       |

细节说明:

表头与分隔符:第一行数据作为表头,用 --- 分隔表头与数据行。

空表格处理:如果输入表格为空,直接返回空字符串,避免错误。

兼容性:适用于大多数表格,但若表格包含合并单元格,需额外处理(见后续优化建议)。

第三步:调用代码(5分钟上手)

def main():
    doc_path = "需求文档_v2.0.docx"        # 替换为你的文档路径
    target_title = "功能权限矩阵"           # 替换为目标标题
    
    # 提取表格
    tables = get_tables_under_heading(doc_path, target_title)
    
    # 输出Markdown
    for idx, table in enumerate(tables, 1):
        print(f"--- 表格{idx} ---\n")
        print(to_markdown(table))
        print("\n-------------------\n")

if __name__ == "__main__":
    main()

执行步骤:

  • 将代码保存为 extract_tables.py。
  • 修改 doc_path 和 target_title 为实际文档路径和标题。
  • 运行 python extract_tables.py,即可在控制台看到Markdown格式的表格。

三、常见问题与解决方案

Q1:检测不到标题

可能原因:

  • 标题样式名称不符合 标题 或 heading 关键词。
  • 标题字体大小或加粗格式未达标。

解决方案:

1.检查标题样式:

  • 在Word中右键标题段落 → 选择「段落样式」,确认样式名称是否包含关键词。
  • 例如:将样式改为「标题 1」或「Heading 2」。

2.手动调整格式判断:

# 在 is_heading_enhanced 中,降低字体大小要求
return (font.size.pt >= 12 and font.bold) if font.size else False

Q2:表格提取不完整

可能原因:

  • 表格与标题不在同一章节,中间有其他标题阻隔。
  • 文档中存在多个同名标题,代码只提取第一个。

解决方案:

强制遍历所有表格:

# 移除遇到新标题停止的逻辑
# 删除以下代码:
elif found and is_heading_enhanced(par): break

精确匹配标题:

如果标题文本唯一,可直接使用 par.text.strip() == target_title 完全匹配。

Q3:Markdown格式混乱

可能原因:

单元格内容包含换行符或特殊符号。

解决方案:

清理数据:

# 在提取单元格时去除换行符
cell.text.strip().replace('\n', ' ')

手动调整:

将输出结果复制到Markdown编辑器(如Typora),通过可视化界面调整格式。

四、真实场景应用案例

场景1:生成接口测试用例

# 提取"接口参数表"后,直接生成测试用例模板
table_data = get_tables_under_heading("接口文档.docx", "接口参数表")[0]
for row in table_data[1:]:
    param, type_, example = row
    print(f"测试点:{param}参数为{example}时,接口应返回{type_}类型")

输出示例:

测试点:user_id参数为123时,接口应返回int类型
测试点:username参数为"admin"时,接口应返回str类型

场景2:自动化测试数据生成

# 将表格数据写入CSV文件供测试框架读取
import csv

tables = get_tables_under_heading("测试数据.docx", "登录用例数据")
with open("test_data.csv", "w", newline="") as f:
    writer = csv.writer(f)
    for table in tables:
        writer.writerows(table)

五、代码扩展与优化建议

1. 支持多级标题

def get_tables_under_heading(doc_path, target_title, level=1):
    # 新增参数:level表示标题层级(如1级标题)
    # 在is_heading_enhanced中增加层级判断
    if f"heading{level}" in style_name:
        return True

2. 处理合并单元格

def extract_cell(cell):
    # 处理合并单元格时的空值
    if cell.text.strip():
        return cell.text.strip()
    else:
        return "[合并单元格]"

3. 日志记录与错误提示

import logging
logging.basicConfig(level=logging.INFO)

def main():
    try:
        tables = get_tables_under_heading(...)
    except FileNotFoundError:
        logging.error("文档路径错误,请检查文件是否存在!")

六、总结

通过这套方案,你可以:

  • 快速定位文档中指定标题的表格
  • 自动化输出结构化Markdown数据
  • 无缝对接测试用例生成、自动化测试脚本等下游流程

立即尝试:

  • 将代码保存为extract_tables.py。
  • 替换文档路径和标题。
  • 运行代码,查看输出结果。

以上就是Python实现快速提取Word表格并转Markdown的详细内容,更多关于Python提取Word转Markdown的资料请关注脚本之家其它相关文章!

相关文章

  • python中map()函数的使用方法示例

    python中map()函数的使用方法示例

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。下面这篇文章主要给大家介绍了关于python中map()函数的使用方法,需要的朋友可以参考下
    2017-09-09
  • python将邻接矩阵输出成图的实现

    python将邻接矩阵输出成图的实现

    今天小编就为大家分享一篇python将邻接矩阵输出成图的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python+imbox库实现邮件读取与删除和附件下载

    Python+imbox库实现邮件读取与删除和附件下载

    这篇文章主要为大家详细介绍了Python如何使用imbox库实现邮件读取与删除以及附件下载,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2025-02-02
  • Python中对字典的几个处理方法分享

    Python中对字典的几个处理方法分享

    这篇文章主要介绍了Python中对字典的几个处理方法分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Django中ModelForm组件的简单配置与使用教程

    Django中ModelForm组件的简单配置与使用教程

    modelform是django中基于已有的model,快速生成的具有form功能的一个模块,下面这篇文章主要给大家介绍了关于Django中ModelForm组件的简单配置与使用教程,需要的朋友可以参考下
    2022-10-10
  • Apache,wsgi,django 程序部署配置方法详解

    Apache,wsgi,django 程序部署配置方法详解

    这篇文章主要介绍了Apache,wsgi,django 程序部署配置方法,结合实例形式详细分析了Linux环境下Apache,wsgi,django程序部署配置的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-07-07
  • Python使用Appium实现自动化操作手机入门教学

    Python使用Appium实现自动化操作手机入门教学

    Appium作为一个开源的移动应用自动化测试框架,支持多种编程语言,包括Python、Java、Ruby等,本文将详细介绍如何使用Python和Appium来操作手机,需要的可以了解下
    2025-10-10
  • 在Qt中正确的设置窗体的背景图片的几种方法总结

    在Qt中正确的设置窗体的背景图片的几种方法总结

    今天小编就为大家分享一篇在Qt中正确的设置窗体的背景图片的几种方法总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • selenium2.0中常用的python函数汇总

    selenium2.0中常用的python函数汇总

    这篇文章主要介绍了selenium2.0中常用的python函数,总结分析了selenium2.0中常用的python函数的功能、原理与基本用法,需要的朋友可以参考下
    2019-08-08
  • pytorch 运行一段时间后出现GPU OOM的问题

    pytorch 运行一段时间后出现GPU OOM的问题

    这篇文章主要介绍了pytorch 运行一段时间后出现GPU OOM的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论