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