Python實現(xiàn)批量提取Word中的表格
表格在word文檔中常見的文檔元素之一。操作word文件時有時需要提取文件中多個表格的內(nèi)容到一個新的文件,甚至有時還會要提取題注信息。
今天,給大家分享兩種批量提取文檔中表格的兩種方法,分別是VBA法和Python法兩種。
一、VBA法提取word中的表格
1. 代碼實現(xiàn)
VBA(Visual Basic for Applications)操作Word文件時,可以執(zhí)行包括創(chuàng)建、打開、保存、修改文本和格式等多種任務。今天,我們使用VBA來批量提取當前文件中的表格,在每個表格中間添加一個空行。實現(xiàn)代碼如下:
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 ' 創(chuàng)建一個新文檔作為目標文檔 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 "表格及其上方一行內(nèi)容已經(jīng)成功提取到 " & outputPath, vbInformation End Sub
2. 代碼分析
以上代碼首先激活當前文檔作為源文檔,然后創(chuàng)建一個新文檔output.docx用來放置提取的表格和題注。它會遍歷源文檔中的所有表格,對于每個表格,嘗試復制表格本身到目標文檔中。
每個表格后面,還會插入一個空行以保持文件中多個表格間清晰的視覺分隔。
3. 使用方法
首先,在Word中打開你想提取表格的文檔,然后按下 Alt + F11 打開VBA編輯器。在【項目】窗格中,選擇你的文檔,然后插入一個新的模塊(右鍵點擊你的文檔名稱,選擇【插入】 > 【模塊】)。將以上VBA代碼復制并粘貼到新模塊中。關(guān)閉VBA編輯器,然后運行宏(在Word中,可以通過【視圖】 > 【宏】> 【查看宏】,選擇這個宏,然后點擊【運行】即可。
二、Python法
Python在office辦公自動化方面有非常廣泛的用途,它有專門的庫來處理office中的各個組件,而且這些都是開源免費使用的。操作word文件就要用到python-docx這個庫,在編寫程序之前要安裝新版的Python程序,然后在cmd下面用pip install python-docx來安裝這個庫,也可以在thonny這個輕量版的集成開發(fā)環(huán)境中安裝python-docx用于操作word文件。
1.代碼實現(xiàn)
我們首先從docx中導入Document模塊,然后讀取指定的word文件,提取表格及其內(nèi)容到一個新的文件當中并保存。實現(xiàn)代碼如下:
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' # 使用內(nèi)置的表格樣式,這樣會自動添加框線 # 復制表頭 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文件中,同時使用了表格的內(nèi)置樣式,給新生成的表格自動添加框線,基本實現(xiàn)表格文本內(nèi)容的提取,但是表格中的字體顏色、大小和邊框樣式均無法提取。同時這里也沒有提取題注,這時我們需要對代碼進一步修改,以使其可以提取表格上方的題注。
3. 提取題注和表格內(nèi)容
本代碼把表格上方居中的文字默認識別為表格的題注,提取表格內(nèi)容時會一并提取出來。
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' # 使用內(nèi)置的表格樣式,這樣會自動添加框線 # 復制表頭 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')
以上代碼在原有代碼基礎上增加了題注內(nèi)容的提取,通過調(diào)用extract_tables_with_titles這個函數(shù),批量把example.docx文件中的表格和題錄提取出來,并放到了output.docx當中,并且每個表格之間會有一個空行。
三、學后反思
利用VBA和Python均可以實現(xiàn)表格內(nèi)容提取的功能,但是對于文字和表格的樣式無法完整提取。后期會進一步探索如何把表格內(nèi)容和樣式完整拷貝出來,但是由于涉及字體等特殊格式,提取樣式會有一定的難度。
上面兩種方法的優(yōu)勢在于可以批量、高效地提取表格內(nèi)容,但是無法提取樣式,因此在提取復雜表格時可能會報錯。
以上代碼默認是把表格批量提取到當前目錄,VBA代碼應用的是當前的word文件,而python則要求提取的文件名為example.docx,如果想批量提取多個文件中的表格則還需要添加for循環(huán)來遍歷所有的word文件。
到此這篇關(guān)于Python實現(xiàn)批量提取Word中的表格的文章就介紹到這了,更多相關(guān)Python提取Word表格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用jpype模塊調(diào)用jar包過程解析
這篇文章主要介紹了Python使用jpype模塊調(diào)用jar包過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07如何使用Flask-Migrate拓展數(shù)據(jù)庫表結(jié)構(gòu)
這篇文章主要介紹了如何使用Flask-Migrate拓展數(shù)據(jù)庫表結(jié)構(gòu),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07Python實現(xiàn)將一段話txt生成字幕srt文件
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)將一段話txt生成字幕srt文件,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02