Python实现批量提取Word中的表格

 更新时间:2024年02月15日 07:44:41   作者:PythonFun  
表格在word文档中常见的文档元素之一,操作word文件时有时需要提取文件中多个表格的内容到一个新的文件,本文给大家分享两种批量提取文档中表格的两种方法,希望对大家有所帮助

表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件,甚至有时还会要提取题注信息。

今天,给大家分享两种批量提取文档中表格的两种方法,分别是VBA法和Python法两种。

一、VBA法提取word中的表格

1. 代码实现

VBA(Visual Basic for Applications)操作Word文件时,可以执行包括创建、打开、保存、修改文本和格式等多种任务。今天,我们使用VBA来批量提取当前文件中的表格,在每个表格中间添加一个空行。实现代码如下:

 Sub ExtractTablesAndPreviousRowToNewFile()
 Dim docSource As Document
 Dim docTarget As Document
 Dim tbl As Table
 Dim rng As Range
 Dim outputPath As String
 Dim fileName As String
 
 ' 设置输出文件名和路径
 fileName = "output.docx"
 outputPath = ActiveDocument.Path & "\" & fileName
 
 ' 当前文档设置为源文档
 Set docSource = ActiveDocument
 ' 创建一个新文档作为目标文档
 Set docTarget = Documents.Add
 
 For Each tbl In docSource.Tables
 
 ' 复制表格
 tbl.Range.Copy
 docTarget.Content.InsertParagraphAfter
 docTarget.Content.Paragraphs.Last.Range.Paste
 
 ' 在表格后添加一个空行
 docTarget.Content.InsertParagraphAfter
 docTarget.Content.Paragraphs.Last.Range.InsertParagraphAfter
 Next tbl
 
 ' 删除目标文档中的第一个空段落
 If docTarget.Paragraphs.Count > 0 Then
 docTarget.Paragraphs(1).Range.Delete
 End If
 
 ' 保存新文档到指定路径
 docTarget.SaveAs2 fileName:=outputPath, FileFormat:=wdFormatXMLDocument
 docTarget.Close
 
 MsgBox "表格及其上方一行内容已经成功提取到 " & outputPath, vbInformation
End Sub

2. 代码分析

以上代码首先激活当前文档作为源文档,然后创建一个新文档output.docx用来放置提取的表格和题注。它会遍历源文档中的所有表格,对于每个表格,尝试复制表格本身到目标文档中。

每个表格后面,还会插入一个空行以保持文件中多个表格间清晰的视觉分隔。

3. 使用方法

首先,在Word中打开你想提取表格的文档,然后按下 Alt + F11 打开VBA编辑器。在【项目】窗格中,选择你的文档,然后插入一个新的模块(右键点击你的文档名称,选择【插入】 > 【模块】)。将以上VBA代码复制并粘贴到新模块中。关闭VBA编辑器,然后运行宏(在Word中,可以通过【视图】 > 【宏】> 【查看宏】,选择这个宏,然后点击【运行】即可。

二、Python法

Python在office办公自动化方面有非常广泛的用途,它有专门的库来处理office中的各个组件,而且这些都是开源免费使用的。操作word文件就要用到python-docx这个库,在编写程序之前要安装新版的Python程序,然后在cmd下面用pip install python-docx来安装这个库,也可以在thonny这个轻量版的集成开发环境中安装python-docx用于操作word文件。

1.代码实现

我们首先从docx中导入Document模块,然后读取指定的word文件,提取表格及其内容到一个新的文件当中并保存。实现代码如下:

from docx import Document
import os
 
def extract_tables(doc_path, output_path):
    # 加载原始文档
    doc = Document(doc_path)
    new_doc = Document()
 
    # 提取表格并添加到新文档
    for i, table in enumerate(doc.tables):
        t = new_doc.add_table(rows=1, cols=len(table.columns))
        t.style = 'Table Grid'  # 使用内置的表格样式,这样会自动添加框线
        # 复制表头
        for j, cell in enumerate(table.rows[0].cells):
            t.cell(0, j).text = cell.text
        # 复制其他行
        for row in table.rows[1:]:
            new_row = t.add_row()
            for j, cell in enumerate(row.cells):
                new_row.cells[j].text = cell.text
 
        # 除了最后一个表格外,在每个表格后添加一个空行(空段落)
        if i < len(doc.tables) - 1:
            new_doc.add_paragraph()
 
    # 保存新文档
    new_doc.save(output_path)
 
# 使用示例
extract_tables('example.docx', 'output.docx')

2. 代码分析

以上代码把example.docx文件中的所有表格提取到了output.docx文件中,同时使用了表格的内置样式,给新生成的表格自动添加框线,基本实现表格文本内容的提取,但是表格中的字体颜色、大小和边框样式均无法提取。同时这里也没有提取题注,这时我们需要对代码进一步修改,以使其可以提取表格上方的题注。

3. 提取题注和表格内容

本代码把表格上方居中的文字默认识别为表格的题注,提取表格内容时会一并提取出来。

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
import os
 
def extract_tables_with_titles(doc_path, output_path):
    # 加载原始文档
    doc = Document(doc_path)
    new_doc = Document()
 
    # 提取表格并添加到新文档
    for i, table in enumerate(doc.tables):
        # 尝试定位并复制表格上方的居中文字
        # 查找表格前的段落
        para = table._element.getprevious()
        if para is not None and para.tag.endswith('p'):
            # 检查该段落的格式是否为居中
            p = para.getparent()
            para_obj = [p for p in doc.paragraphs if p._element == para][0]
            if para_obj.alignment == WD_ALIGN_PARAGRAPH.CENTER:
                # 添加居中的段落到新文档
                new_para = new_doc.add_paragraph(para_obj.text)
                new_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
 
        # 添加表格
        t = new_doc.add_table(rows=1, cols=len(table.columns))
        t.style = 'Table Grid'  # 使用内置的表格样式,这样会自动添加框线
 
        # 复制表头
        for j, cell in enumerate(table.rows[0].cells):
            t.cell(0, j).text = cell.text
        # 复制其他行
        for row in table.rows[1:]:
            new_row = t.add_row()
            for j, cell in enumerate(row.cells):
                new_row.cells[j].text = cell.text
 
        # 除了最后一个表格外,在每个表格后添加一个空行(空段落)
        if i < len(doc.tables) - 1:
            new_doc.add_paragraph()
 
    # 保存新文档
    new_doc.save(output_path)
 
# 使用示例
extract_tables_with_titles('example.docx', 'output.docx')

以上代码在原有代码基础上增加了题注内容的提取,通过调用extract_tables_with_titles这个函数,批量把example.docx文件中的表格和题录提取出来,并放到了output.docx当中,并且每个表格之间会有一个空行。

三、学后反思

利用VBA和Python均可以实现表格内容提取的功能,但是对于文字和表格的样式无法完整提取。后期会进一步探索如何把表格内容和样式完整拷贝出来,但是由于涉及字体等特殊格式,提取样式会有一定的难度。

上面两种方法的优势在于可以批量、高效地提取表格内容,但是无法提取样式,因此在提取复杂表格时可能会报错。

以上代码默认是把表格批量提取到当前目录,VBA代码应用的是当前的word文件,而python则要求提取的文件名为example.docx,如果想批量提取多个文件中的表格则还需要添加for循环来遍历所有的word文件。

到此这篇关于Python实现批量提取Word中的表格的文章就介绍到这了,更多相关Python提取Word表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python的logging.config模块操作步骤

    Python的logging.config模块操作步骤

    这篇文章主要介绍了Python的logging.config模块操作步骤,本文通过示例代码给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Django 多对多字段的更新和插入数据实例

    Django 多对多字段的更新和插入数据实例

    这篇文章主要介绍了Django 多对多字段的更新和插入数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python实现差分隐私Laplace机制详解

    python实现差分隐私Laplace机制详解

    今天小编就为大家分享一篇python实现差分隐私Laplace机制详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python pyecharts Map地图数据不显示的原因及完美解决

    Python pyecharts Map地图数据不显示的原因及完美解决

    这篇文章主要给大家介绍了关于Python pyecharts Map地图数据不显示的原因及解决办法,pyecharts是一款将python与echarts结合的强大的数据可视化工具,文中通过图文以及代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Python破解极验滑动验证码详细步骤

    Python破解极验滑动验证码详细步骤

    学习python知识越来越多,大家都知道极验验证码应用非常广泛,今天小编就给大家分享Python破解极验滑动验证码的详细步骤,对Python极验滑动验证码相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • python结合opencv实现人脸检测与跟踪

    python结合opencv实现人脸检测与跟踪

    在Python下用起来OpenCV很爽,代码很简洁,很清晰易懂。使用的是Haar特征的分类器,训练之后得到的数据存在一个xml中。下面我们就来详细谈谈。
    2015-06-06
  • Python 余弦相似度与皮尔逊相关系数 计算实例

    Python 余弦相似度与皮尔逊相关系数 计算实例

    今天小编就为大家分享一篇Python 余弦相似度与皮尔逊相关系数 计算实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 探索Python内置数据类型的精髓与应用

    探索Python内置数据类型的精髓与应用

    本文探索Python内置数据类型的精髓与应用,包括字符串、列表、元组、字典和集合。通过深入了解它们的特性、操作和常见用法,读者将能够更好地利用这些数据类型解决实际问题。
    2023-09-09
  • 基于Python手写拼音识别

    基于Python手写拼音识别

    这篇文章主要介绍了基于Python手写拼音识别,因项目组需要使用到拼写识别,考虑到每个字母的复杂度不高,所以使用KNN算法来尝试实现,下面来看看具体实现详情吧,需要的小伙伴也可以参考一下
    2022-01-01
  • Python实现上下班抢个顺风单脚本

    Python实现上下班抢个顺风单脚本

    这篇文章主要为大家详细介绍了Python实现上下班抢个顺风单脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论