在日常的办公中,有时需要提取多个word文件中的文字框的内容。有时,文字框的数量比较多,而且处于文档的不同位置,手工提取比较耗时耗力,同时也可能会产生遗漏。
我们也可以通过VBA和Python来解决这个问题,虽然听起来有点儿小复杂,但是有了Chatgpt的加持,这个问题就不是那么麻烦了。
以下,我们采用三种不同的方法来提取文本框的内容,经过比较之后我们再做出判断。
手动选取的方法也比较简单,思路就是定位——选中——复制——粘贴,可以把一个文档中的文本框内容复制到一个新文档当中。
首先,我们选中文件中多个文本框中的一个,然后点击【开始】——【选择】——【选择相似的文本】,就可以全部选中所有文本框的内容,然后用快捷键ctrl+c复制,再打开一个新的文件粘贴就可以了。
经过测试,以上方法仅适用于word而不适用于wps。
我们也可以请出Python这款强大的武器,它最大的特点就是文件处理快捷、跨平台性强,可以批量地识别出多个文档中的全部文字框,并把其中的内容全部复制出来,写入一个新的文档。
要进行word文件的处理,我们就要安装并导入python-docx这个包,在确保安装python软件之后,在cmd里输入以下命令:
pip install python-docx
这样就可以安装必要的库,在使用时就可以通过这个库中的Document方法来读取和生成docx文件。
另外,还需要安装用于解析docx文件的lxml库,安装方法如上:
pip install lxml
另外还需要用到os, zipfile等标准库,这些都不用安装,使用时直接导入即可。
我们通过读取docx文件,解压该文件以获取内部XML结构,然后使用lxml库解析这个XML,查找所有文本框内容,并将这些内容添加到一个新的文档中。
我们还可以加入循环读取文件的方法,实现对当前目录下多个文件中文字框内容的提取。
为了避免提取的内容重复,我们还可以用set()对提取的内容进行去重。
明确了我们的目标之后,我们整理出指令,然后发送给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}')
相比python,VBA的方法更为简单,尤其是对于单个文件中的文本框,可以轻松提取。而且,我们还可以把VBA代码绑定成一个自定义的按钮,轻轻一点就可以提取所有文本框。
VBA代码的优势非常明显,不需要安装额外的软件,只用编写一个宏来遍历文档中所有的形状(Shapes),检查它们是否是文本框,然后将这些文本框中的文本提取出来并写入到一个新的Word文档中。
为确保VBA宏运行后生成的文件位于当前文档的目录下,可以使用ThisDocument.Path属性来获取当前文档所在的路径,然后基于这个路径构建目标文件的完整路径。
以下是修改后的VBA宏,它会将提取的文本保存到一个新的Word文档中,该文档位于当前活动文档的同一目录下:
Sub ExtractTextBoxContentAndSaveInCurrentDirectory()
Dim srcDoc As Document
Dim destDoc As Document
Dim shape As shape
Dim textBoxText As String
Dim para As Paragraph
Dim 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.Add
para.Range.Text = textBoxText & vbNewLine
End If
Next shape
' 构建目标文件的完整路径
destPath = srcDoc.Path & "\ExtractedTextBoxContent.docx"
' 保存目标文档到当前文档所在目录
destDoc.SaveAs2 FileName:=destPath
' 显示保存成功的消息
MsgBox "文本框内容已提取到:" & destPath, vbInformation, "完成"
' 清理
Set srcDoc = Nothing
Set destDoc = Nothing
End Sub
使用VBA代码时,我们要打开Word文档,按下Alt + F11以打开VBA编辑器。在“项目”窗口中选择你的文档。通过右键点击你的文档名,选择【插入】——【模块】来创建一个新模块。在新模块中粘贴上述代码并保存,然后就可以运行当前的代码。或者关闭VBA编辑器,然后按下Alt + F8,选择ExtractTextBoxContentAndSaveInCurrentDirectory宏并运行。
在上述代码中,srcDoc.Path获取了当前活动文档的路径,然后用&连接\ExtractedTextBoxContent.docx构建了新文档的完整保存路径。这样,无论你的Word文档位于哪个目录,提取的文本都将被保存到与之相同的目录下。