Python實(shí)現(xiàn)批量提取word文件中文本框內(nèi)容
一、問題的提出
在日常的辦公中,有時(shí)需要提取多個(gè)word文件中的文字框的內(nèi)容。有時(shí),文字框的數(shù)量比較多,而且處于文檔的不同位置,手工提取比較耗時(shí)耗力,同時(shí)也可能會(huì)產(chǎn)生遺漏。
我們也可以通過VBA和Python來解決這個(gè)問題,雖然聽起來有點(diǎn)兒小復(fù)雜,但是有了Chatgpt的加持,這個(gè)問題就不是那么麻煩了。
以下,我們采用三種不同的方法來提取文本框的內(nèi)容,經(jīng)過比較之后我們再做出判斷。
二、手動(dòng)提取文本框內(nèi)容
手動(dòng)選取的方法也比較簡單,思路就是定位——選中——復(fù)制——粘貼,可以把一個(gè)文檔中的文本框內(nèi)容復(fù)制到一個(gè)新文檔當(dāng)中。
首先,我們選中文件中多個(gè)文本框中的一個(gè),然后點(diǎn)擊【開始】——【選擇】——【選擇相似的文本】,就可以全部選中所有文本框的內(nèi)容,然后用快捷鍵ctrl+c復(fù)制,再打開一個(gè)新的文件粘貼就可以了。
經(jīng)過測試,以上方法僅適用于word而不適用于wps。
三、Python批量提示文字框內(nèi)容
我們也可以請出Python這款強(qiáng)大的武器,它最大的特點(diǎn)就是文件處理快捷、跨平臺性強(qiáng),可以批量地識別出多個(gè)文檔中的全部文字框,并把其中的內(nèi)容全部復(fù)制出來,寫入一個(gè)新的文檔。
1. 引入處理文檔的包
要進(jìn)行word文件的處理,我們就要安裝并導(dǎo)入python-docx這個(gè)包,在確保安裝python軟件之后,在cmd里輸入以下命令:
pip install python-docx
這樣就可以安裝必要的庫,在使用時(shí)就可以通過這個(gè)庫中的Document方法來讀取和生成docx文件。
另外,還需要安裝用于解析docx文件的lxml庫,安裝方法如上:
pip install lxml
另外還需要用到os, zipfile等標(biāo)準(zhǔn)庫,這些都不用安裝,使用時(shí)直接導(dǎo)入即可。
2. 算法分析
我們通過讀取docx文件,解壓該文件以獲取內(nèi)部XML結(jié)構(gòu),然后使用lxml庫解析這個(gè)XML,查找所有文本框內(nèi)容,并將這些內(nèi)容添加到一個(gè)新的文檔中。
我們還可以加入循環(huán)讀取文件的方法,實(shí)現(xiàn)對當(dāng)前目錄下多個(gè)文件中文字框內(nèi)容的提取。
為了避免提取的內(nèi)容重復(fù),我們還可以用set()對提取的內(nèi)容進(jìn)行去重。
3. 代碼展示
明確了我們的目標(biāo)之后,我們整理出指令,然后發(fā)送給ChatGPT,讓它給出我們想要的代碼,然后進(jìn)行測試其可用性,并對代碼進(jìn)行必要的修改,最終形成以下代碼。
from docx import Document from lxml import etree import zipfile import os # 加載.docx文件 source_docx = 'example.docx' document = Document(source_docx) # 解壓.docx文件以訪問其XML內(nèi)容 with zipfile.ZipFile(source_docx, 'r') as docx_zip: xml_content = docx_zip.read('word/document.xml') # 解析XML內(nèi)容 xml_tree = etree.XML(xml_content) # 定義命名空間 namespaces = { 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'v': 'urn:schemas-microsoft-com:vml' } # 創(chuàng)建新文檔 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]) # 檢查段落文本是否已經(jīng)被提取 if paragraph_text and paragraph_text not in extracted_texts: new_document.add_paragraph(paragraph_text) # 將提取的段落文本添加到集合中,以避免重復(fù) extracted_texts.add(paragraph_text) # 保存新文檔 new_document.save(output_docx) print(f'文本框內(nèi)容已被提取到 {output_docx}')
四、VBA批量提取文本框內(nèi)容
相比python,VBA的方法更為簡單,尤其是對于單個(gè)文件中的文本框,可以輕松提取。而且,我們還可以把VBA代碼綁定成一個(gè)自定義的按鈕,輕輕一點(diǎn)就可以提取所有文本框。
VBA代碼的優(yōu)勢非常明顯,不需要安裝額外的軟件,只用編寫一個(gè)宏來遍歷文檔中所有的形狀(Shapes),檢查它們是否是文本框,然后將這些文本框中的文本提取出來并寫入到一個(gè)新的Word文檔中。
1. VBA代碼實(shí)現(xiàn)
為確保VBA宏運(yùn)行后生成的文件位于當(dāng)前文檔的目錄下,可以使用ThisDocument.Path屬性來獲取當(dāng)前文檔所在的路徑,然后基于這個(gè)路徑構(gòu)建目標(biāo)文件的完整路徑。
以下是修改后的VBA宏,它會(huì)將提取的文本保存到一個(gè)新的Word文檔中,該文檔位于當(dāng)前活動(dòng)文檔的同一目錄下:
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 ' 當(dāng)前活動(dòng)文檔作為源文檔 Set srcDoc = ActiveDocument ' 創(chuàng)建一個(gè)新文檔來存儲提取的文本 Set destDoc = Documents.Add ' 遍歷源文檔中的所有形狀 For Each shape In srcDoc.Shapes ' 檢查形狀是否是文本框 If shape.Type = msoTextBox Then ' 獲取文本框中的文本 textBoxText = shape.TextFrame.TextRange.Text ' 將文本寫入到目標(biāo)文檔 Set para = destDoc.Content.Paragraphs.Add para.Range.Text = textBoxText & vbNewLine End If Next shape ' 構(gòu)建目標(biāo)文件的完整路徑 destPath = srcDoc.Path & "\ExtractedTextBoxContent.docx" ' 保存目標(biāo)文檔到當(dāng)前文檔所在目錄 destDoc.SaveAs2 FileName:=destPath ' 顯示保存成功的消息 MsgBox "文本框內(nèi)容已提取到:" & destPath, vbInformation, "完成" ' 清理 Set srcDoc = Nothing Set destDoc = Nothing End Sub
2. 代碼使用方法
使用VBA代碼時(shí),我們要打開Word文檔,按下Alt + F11以打開VBA編輯器。在“項(xiàng)目”窗口中選擇你的文檔。通過右鍵點(diǎn)擊你的文檔名,選擇【插入】——【模塊】來創(chuàng)建一個(gè)新模塊。在新模塊中粘貼上述代碼并保存,然后就可以運(yùn)行當(dāng)前的代碼?;蛘哧P(guān)閉VBA編輯器,然后按下Alt + F8,選擇ExtractTextBoxContentAndSaveInCurrentDirectory宏并運(yùn)行。
在上述代碼中,srcDoc.Path獲取了當(dāng)前活動(dòng)文檔的路徑,然后用&連接\ExtractedTextBoxContent.docx構(gòu)建了新文檔的完整保存路徑。這樣,無論你的Word文檔位于哪個(gè)目錄,提取的文本都將被保存到與之相同的目錄下。
五、學(xué)后反思
三種方法均可以實(shí)現(xiàn)對一個(gè)文件中所有文本框內(nèi)容的提取。第一種是手動(dòng),步驟不算多,如果在粘貼時(shí)選擇保存原格式,可以很好地保證文本框中文字的格式。它的唯一缺點(diǎn)時(shí),不能對多個(gè)文件進(jìn)行操作。
Python和VBA都是編程的方法,實(shí)現(xiàn)過程有些復(fù)雜,但是均可以在以上代碼的基礎(chǔ)上經(jīng)過修改后可以對多個(gè)文件進(jìn)行批量的操作,省去了一個(gè)個(gè)打開文件、復(fù)制內(nèi)容的過程。其缺點(diǎn)是很難保證提取出的內(nèi)容格式不發(fā)生改變。
到此這篇關(guān)于Python實(shí)現(xiàn)批量提取word文件中文本框內(nèi)容的文章就介紹到這了,更多相關(guān)Python提取word文本框內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基礎(chǔ)教程之對象和類的實(shí)際運(yùn)用
這篇文章主要介紹了python基礎(chǔ)教程之對象和類的實(shí)際運(yùn)用,本文講解對象和類的一方法技巧,例如屬性、內(nèi)置方法、self關(guān)鍵字的運(yùn)用等,需要的朋友可以參考下2014-08-08python數(shù)據(jù)結(jié)構(gòu)輸入輸出及控制和異常
這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)輸入輸出及控制和異常,上一章節(jié)中我們介紹了python的基礎(chǔ)數(shù)據(jù)類型和集合數(shù)據(jù)類型,這章節(jié)給大家介紹一下python的輸入輸出、控制和異常,對數(shù)據(jù)類型感興趣的同學(xué)可以查看一下文章<BR>2021-12-12python采用requests庫模擬登錄和抓取數(shù)據(jù)的簡單示例
這篇文章主要介紹了python采用requests庫模擬登錄和抓取數(shù)據(jù)的簡單示例,代碼簡單卻功能強(qiáng)大!需要的朋友可以參考下2014-07-07使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤輸入監(jiān)聽功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤輸入監(jiān)聽功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08