批量提取word文件中文本框内容的三种方法
一、问题的提出
在日常的办公中,有时需要提取多个word文件中的文字框的内容。有时,文字框的数量比较多,而且处于文档的不同位置,手工提取比较耗时耗力,同时也可能会产生遗漏。
我们也可以通过VBA和Python来解决这个问题,虽然听起来有点儿小复杂,但是有了Chatgpt的加持,这个问题就不是那么麻烦了。
以下,我们采用三种不同的方法来提取文本框的内容,经过比较之后我们再做出判断。
二、手动提取文本框内容
手动选取的方法也比较简单,思路就是定位——选中——复制——粘贴,可以把一个文档中的文本框内容复制到一个新文档当中。
首先,我们选中文件中多个文本框中的一个,然后点击【开始】——【选择】——【选择相似的文本】,就可以全部选中所有文本框的内容,然后用快捷键ctrl+c复制,再打开一个新的文件粘贴就可以了。
经过测试,以上方法仅适用于word而不适用于wps。
三、Python批量提示文字框内容
我们也可以请出Python这款强大的武器,它最大的特点就是文件处理快捷、跨平台性强,可以批量地识别出多个文档中的全部文字框,并把其中的内容全部复制出来,写入一个新的文档。
1. 引入处理文档的包
要进行word文件的处理,我们就要安装并导入python-docx这个包,在确保安装python软件之后,在cmd里输入以下命令:
pip install python-docx
这样就可以安装必要的库,在使用时就可以通过这个库中的Document方法来读取和生成docx文件。
另外,还需要安装用于解析docx文件的lxml库,安装方法如上:
pip install lxml
另外还需要用到os, zipfile等标准库,这些都不用安装,使用时直接导入即可。
2. 算法分析
我们通过读取docx文件,解压该文件以获取内部XML结构,然后使用lxml库解析这个XML,查找所有文本框内容,并将这些内容添加到一个新的文档中。
我们还可以加入循环读取文件的方法,实现对当前目录下多个文件中文字框内容的提取。
为了避免提取的内容重复,我们还可以用set()对提取的内容进行去重。
3. 代码展示
明确了我们的目标之后,我们整理出指令,然后发送给ChatGPT,让它给出我们想要的代码,然后进行测试其可用性,并对代码进行必要的修改,最终形成以下代码。
from docx import Document
from lxml import etree
import zipfile
import os# 加载.docx文件
source_docx = 'example.docx'
document = Document(source_docx)# 解压.docx文件以访问其XML内容
with zipfile.ZipFile(source_docx, 'r') as docx_zip:xml_content = docx_zip.read('word/document.xml')# 解析XML内容
xml_tree = etree.XML(xml_content)# 定义命名空间
namespaces = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main','v': 'urn:schemas-microsoft-com:vml'
}# 创建新文档
output_docx = 'output_with_textboxes.docx'
new_document = Document()# 已提取段落的文本集合
extracted_texts = set()# 搜索文本框中的文本
textboxes = xml_tree.findall('.//w:txbxContent', namespaces)
for textbox in textboxes:paragraphs = textbox.findall('.//w:p', namespaces)for paragraph in paragraphs:texts = paragraph.findall('.//w:t', namespaces)paragraph_text = ''.join([text.text for text in texts if text.text])# 检查段落文本是否已经被提取if paragraph_text and paragraph_text not in extracted_texts:new_document.add_paragraph(paragraph_text)# 将提取的段落文本添加到集合中,以避免重复extracted_texts.add(paragraph_text)# 保存新文档
new_document.save(output_docx)print(f'文本框内容已被提取到 {output_docx}')
四、VBA批量提取文本框内容
相比python,VBA的方法更为简单,尤其是对于单个文件中的文本框,可以轻松提取。而且,我们还可以把VBA代码绑定成一个自定义的按钮,轻轻一点就可以提取所有文本框。
VBA代码的优势非常明显,不需要安装额外的软件,只用编写一个宏来遍历文档中所有的形状(Shapes),检查它们是否是文本框,然后将这些文本框中的文本提取出来并写入到一个新的Word文档中。
1. VBA代码实现
为确保VBA宏运行后生成的文件位于当前文档的目录下,可以使用ThisDocument.Path属性来获取当前文档所在的路径,然后基于这个路径构建目标文件的完整路径。
以下是修改后的VBA宏,它会将提取的文本保存到一个新的Word文档中,该文档位于当前活动文档的同一目录下:
Sub ExtractTextBoxContentAndSaveInCurrentDirectory()Dim srcDoc As DocumentDim destDoc As DocumentDim shape As shapeDim textBoxText As StringDim para As ParagraphDim destPath As String' 当前活动文档作为源文档Set srcDoc = ActiveDocument' 创建一个新文档来存储提取的文本Set destDoc = Documents.Add' 遍历源文档中的所有形状For Each shape In srcDoc.Shapes' 检查形状是否是文本框If shape.Type = msoTextBox Then' 获取文本框中的文本textBoxText = shape.TextFrame.TextRange.Text' 将文本写入到目标文档Set para = destDoc.Content.Paragraphs.Addpara.Range.Text = textBoxText & vbNewLineEnd IfNext shape' 构建目标文件的完整路径destPath = srcDoc.Path & "\ExtractedTextBoxContent.docx"' 保存目标文档到当前文档所在目录destDoc.SaveAs2 FileName:=destPath' 显示保存成功的消息MsgBox "文本框内容已提取到:" & destPath, vbInformation, "完成"' 清理Set srcDoc = NothingSet destDoc = Nothing
End Sub
2. 代码使用方法
使用VBA代码时,我们要打开Word文档,按下Alt + F11以打开VBA编辑器。在“项目”窗口中选择你的文档。通过右键点击你的文档名,选择【插入】——【模块】来创建一个新模块。在新模块中粘贴上述代码并保存,然后就可以运行当前的代码。或者关闭VBA编辑器,然后按下Alt + F8,选择ExtractTextBoxContentAndSaveInCurrentDirectory宏并运行。
在上述代码中,srcDoc.Path获取了当前活动文档的路径,然后用&连接\ExtractedTextBoxContent.docx构建了新文档的完整保存路径。这样,无论你的Word文档位于哪个目录,提取的文本都将被保存到与之相同的目录下。
五、学后反思
- 三种方法均可以实现对一个文件中所有文本框内容的提取。第一种是手动,步骤不算多,如果在粘贴时选择保存原格式,可以很好地保证文本框中文字的格式。它的唯一缺点时,不能对多个文件进行操作。
- Python和VBA都是编程的方法,实现过程有些复杂,但是均可以在以上代码的基础上经过修改后可以对多个文件进行批量的操作,省去了一个个打开文件、复制内容的过程。其缺点是很难保证提取出的内容格式不发生改变。
相关文章:
批量提取word文件中文本框内容的三种方法
一、问题的提出 在日常的办公中,有时需要提取多个word文件中的文字框的内容。有时,文字框的数量比较多,而且处于文档的不同位置,手工提取比较耗时耗力,同时也可能会产生遗漏。 我们也可以通过VBA和Python来解决这个问…...

Leecode之合并两个有序链表
一.题目及剖析 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 二.思路引入 用指针遍历两个链表并实时比较,较小的元素进行尾插,然后较小元素的指针接着向后遍历 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int va…...

陶建国教授谈中西方文化的差异与交融
龙年到来,这个春节里,“龙”字的英文翻译引发关注,冲上了热搜,网友发现,“龙”不再翻译为“dragon”,而是龙字的谐音“loong”。原来,在西方人的眼里,龙是凶猛的怪兽,具有…...

Ps:画笔选项
画笔选项 Brush Options提供了对画笔(圆形笔刷)基本属性的控制,比如大小、硬度、间距、角度和圆度等。 Photoshop 中的快速选择工具、污点修复画笔工具、修复画笔工具、颜色替换工具、背景橡皮擦工具等的工具选项栏上提供了这种圆形笔刷选项。…...

嵌入式——Flash(W25Q64)
目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令(06h) 2. 写禁…...

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)
我是实现了输出pwm波,频率固定,占空比可以不断调整的方法,将PA0接到示波器上,可以看到是一个标准的PWM波,如图下面示波器图。 1,首先是ioc的配置 我刚开始设置的分频的倍数是7199,使得分频的太大了,示波器显示不了,最后修改为71就可以,我之前设置读取pwm也是一样的…...

phpstrom创建thinkphp项目
安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行...

【Linux】线程同步
线程同步 一、条件变量1. 同步概念2. 条件变量概念3. 条件变量接口(1)pthread_cond_init()(2)pthread_cond_destroy()(3)pthread_cond_wait()(4)pthread_cond_signal()(5…...
如何在多头自注意力机制的交叉学习中引入对于物理、生理、心理世界客观规律的对照验证...
要在多头自注意力机制的交叉学习中引入对于物理世界客观规律的对照验证,可以考虑以下方法: 1、引入物理模型 首先,建立一个物理模型,该模型能够描述物理世界中的客观规律。这个模型可以是已知的科学理论,也可以是通过实…...

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”
智慧城市的建设已经进入了一个新的阶段,不仅仅是智慧交通、智慧环保,如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢,正在通过信息化、数字化和智慧化的方式,实现全方位的精细化管理。本文以智慧公厕源头专…...

vue导出word文档(图文示例)
第076个 查看专栏目录: VUE 本文章目录 示例说明示例效果图导出的文件效果截图示例源代码参数说明:重要提示:API 参考网址 示例说明 在Vue中导出Word文档,可以使用第三方库file-saver和html-docx-js。首先需要安装这两个库: npm …...

【C Primer Plus第六版 学习笔记】 第十七章 高级数据表示
有基础,进阶用,个人查漏补缺 链表:假设要编写一个程序,让用户输入一年内看过的所有电影,要储存每部影片的片名和评级。 #include <stdio.h> #include <stdlib.h> /* 提供malloc()的原型 */ #include <s…...

租用一个服务器需要多少钱?2024阿里云新版报价
2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…...

python-产品篇-游戏-成语填填乐
文章目录 准备代码效果 准备 无需其他文件,复制即用 代码 import random list["春暖花开","十字路口","千军万马","白手起家","张灯结彩","风和日丽","万里长城","人来人往",&…...

数据库数据加密的 4 种常见思路的对比
应用层加解密方案数据库前置处理方案磁盘存取环节:透明数据加密DB 后置处理 最近由于工作需要,我对欧洲的通用数据保护条例做了调研和学习,其中有非常重要的一点,也是常识性的一条,就是需要对用户的个人隐私数据做好加…...

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-PWM
目录 一、PWM 概述二、PWM 模块相关API三、接口调用实例四、PWM HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、PWM 概述 PWM(Pulse Width Modulation)又叫脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要…...

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习
1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…...

单片机学习笔记---直流电机驱动(PWM)
直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器…...
Scrum敏捷培训机构推荐
敏捷培训机构中,Scrum中文网(www.scrum.cn)是一个值得考虑的选择。 Scrum中文网(Scrum.CN)是全球第一个Scrum中文网站,是中国最早的Scrum和敏捷的布道者、教育及推广机构,也是国际Scrum联盟(Scrum Allianc…...

《Go 简易速速上手小册》第5章:并发编程(2024 最新版)
文章目录 5.1 Goroutines 的基础 - Go 语言中的轻盈舞者5.1.1 基础知识讲解5.1.2 重点案例:并发下载器功能描述实现代码扩展功能 5.1.3 拓展案例 1:网站健康检查功能描述实现代码扩展功能 5.1.4 拓展案例 2:并发日志处理器拓展案例 2…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...