自動化辦公 — Python 批量提取 Word 中表格內容,一鍵寫入 Excel

Hello,我是小張,大家好久不見~

今天文章介紹一個實戰案例,與自動化辦公相關;案例思想是源于前兩天幫讀者做了一個 demo ,需求大致將一上百個 word 中表格內容提取出來(所有word 中表格樣式一樣),把提取到的內容自動存入 Excel 中

word 中表格形式如下

image-20210326232115393

目前含有數個上面形式的 word 文檔需要整理,目標是利用 python 自動生成下面形式 excel 表格

image-20210326232712833

正式案例講解之前,先看一下轉換效果,腳本先把指定文件夾下的 doc 文件轉化為 docx ,隨后自動生成一個 excel 表格,表格內中即為所有 word 中的內容

Word_excel

涉及的庫

本案例中用到的 Python 庫有以下幾個

python-docx
pandas
os
pywin32

doc 轉化為 docx

本案例中 word 中表格內容的提取用到的是 python-docx 庫,關于 python-docx 一些基礎用法可以參考

word 文檔有時是以 doc 類型保存的, python-docx 只能處理 docx 文件類型,在提取表格內容之前,需進行一次文件類型格式轉換:把 doc 批量轉化為 docx

doc 轉 docx 最簡單的方式 通過Office 中 word 組件打開 doc 文件,然后手動保存為 docx 文件,對于單個文檔這個方法還行,文檔數量達到上百個的話還用這種方法就有點煩了,

這里介紹一個 python 庫 pywin32 來幫助我們解決這個問題,pywin32 作為擴展模塊, 里面封裝了大量 Windows API 函數,例如調用 Office 等應用組件、刪除指定文件、獲取鼠標坐標等等

利用 pywin32 控制Office 中 Word 組件自動完成 打開、保存 操作,把所有 doc 文件類型轉化為 docx 文件類型,步驟分為以下三步:

1,建立一個 word 組件

from win32com import client as wc
word = wc.Dispatch('Word.Application')</pre>

2,打開 word 文件

doc = word.Documents.Open(path)</pre>

3,保存關閉

doc.SaveAs(save_path,12, False, "", True, "", False, False, False, False)
doc.Close()

完整代碼

path_list = os.listdir(path)
 doc_list = [os.path.join(path,str(i)) for i in path_list if str(i).endswith('doc')]
 word = wc.Dispatch('Word.Application')
 print(doc_list)
 for path in doc_list:
 print(path)
 save_path = str(path).replace('doc','docx')
 doc = word.Documents.Open(path)
 doc.SaveAs(save_path,12, False, "", True, "", False, False, False, False)
 doc.Close()
 print('{} Save sucessfully '.format(save_path))
 word.Quit()

docx 庫提取單個表格內容

在批量操作之前,首先需要搞定單個表格中的內容,只要我們搞定了單個 word,剩下的加一個遞歸即可

用 docx 庫對 word 中表格內容提取,主要用到 Table、rows、cells 等對象

image-20210327095933680

Table 表示表格,rows 表示表格中行列表,以迭代器形式存在;cells 表示單元格列表,也是以迭代器形式

image-20210327003517662

操作之前,需了解下面幾個基礎函數

  • 通過 Document 函數讀取文件路徑,返回一個 Document 對象

  • Document.tables 可返回 word 中的表格列表;

  • table.rows 返回表格中的行列表;

  • row.cells 返回該行中含有的單元格列表;

  • cell.text 返回該單元格中文本信息

了解了上面內容之后,接下來的操作思路就比較清晰了;word 表格中文本信息可以通過兩個 for 循環來完成:第一個 for 循環獲取表格中所有行對象,第二個 for 循環定位每一行的單元格,借助 cell.text 獲取單元格文本內容;

用代碼試一下這個思路是否可行

document = docx.Document(doc_path)
 for table in document.tables:
 for row_index,row in enumerate(table.rows):
 for col_index,cell in enumerate(row.cells):
 print(' pos index is ({},{})'.format(row_index,col_index))
 print('cell text is {}'.format(cell.text))

會發現,最終提取到的內容是有重復的,,,

image-20210327101337122

出現上面原因,是由于單元格合并問題,例如下面表格的單元格 合并了 (1,1)->(1,5),docx 庫在處理這類合并單元格 時并沒有當成一個,而是以單個形式進行處理,因此 for 迭代時 (1,1)->(1,5) 單元格返回了五個,每一個單元格文本信息都返回

image-20210327101720736

面對以上文本重復問題,需要添加一個去重機制, 姓名、性別、年齡...學歷學位 等字段作為列名 col_keys,后面王五、女、37、... 學士 等作為col_values,提取時設定一個索引,偶數為 col_keys, 奇數為 col_vaues ;

代碼重構后如下:

 document = docx.Document(doc_path)
 col_keys = [] # 獲取列名
 col_values = [] # 獲取列值
 index_num = 0
 # 添加一個去重機制
 fore_str = ''
 for table in document.tables:
 for row_index,row in enumerate(table.rows):
 for col_index,cell in enumerate(row.cells):
 if fore_str != cell.text:
 if index_num % 2==0:
 col_keys.append(cell.text)
 else:
 col_values.append(cell.text)
 fore_str = cell.text
 index_num +=1

 print(f'col keys is {col_keys}')
 print(f'col values is {col_values}')</pre>

最終提取后的效果如下

image-20210327121716805

批量 word 提取,保存至 csv 文件中

能夠處理單個 word 文件之后,一個遞歸即可提取到所有 word 文本表格內容,最后利用 pandas 把獲取到的數據寫入到 csv 文件即可!

def GetData_frompath(doc_path):
 document = docx.Document(doc_path)
 col_keys = [] # 獲取列名
 col_values = [] # 獲取列值
 index_num = 0
 # 添加一個去重機制
 fore_str = ''
 for table in document.tables:
 for row_index,row in enumerate(table.rows):
 for col_index,cell in enumerate(row.cells):
 if fore_str != cell.text:
 if index_num % 2==0:
 col_keys.append(cell.text)
 else:
 col_values.append(cell.text)
 fore_str = cell.text
 index_num +=1
 return col_keys,col_values

pd_data = []
for index,single_path in enumerate(wordlist_path):
 col_names,col_values = GetData_frompath(single_path)
 if index == 0:
 pd_data.append(col_names)
 pd_data.append(col_values)
 else:
 pd_data.append(col_values)

df = pd.DataFrame(pd_data)
df.to_csv(word_paths+'/result.csv', encoding='utf_8_sig',index=False)</pre>

證件號、身份證號格式

打開生成的 csv 文件會發現聯系方式、身份證號 兩欄的數字格式是以數值存儲,不是我們想要的類型,想要完整展示,需存儲之前把數值轉化為文本

image-20210327122744514

解決方法,找到所在的單元格,前面元素前面加一個 ’\t‘ 制表符即可

col_values[7] = '\t'+col_values[7]
col_values[8] = '\t'+col_values[8]</pre>
image-20210327123301512

源碼獲取

本案例中用到的 源碼數據獲取方式,關注微信公號:小張Python,在公號后臺回復關鍵字:210328 即可!

小結

本案例中只用到了 docx 庫中的一部分方法,主要涉及到了 word 中 Table 的基本操作,對于一些從事文職工作的同學來說日常工作中可能會遇到上面相似問題,因此特意分享在這里,希望能夠對大家有所幫助

好了,以上就是本篇文章的全部內容了,最后感謝大家的閱讀,我們下期見!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容