最近有同事需要批量出500個Word文檔,按照1個Word文檔耗時1分鐘來算也需要8.33小時足足有1天工時。於是,這位同事找到了才哥幫忙,才哥接過需求花了不到30分鐘寫好腳本,運行腳本不到1分鐘就生成了500份Word文檔並且進行了分類歸檔!
這就是Python的魅力,讓工作更輕鬆!
今天,我們就來了解一下用Python讀寫Word文檔。未來,我將再出兩期進行補充介紹,一篇是批量生成Word文檔的方法(也就是我搞定同事需求的案例),另外一篇是詳解Python寫Word(包含可能你都不知道的各種Word格式),敬請期待哈~
目錄:
1. 安裝模塊
2. 讀取Word文檔
3. 寫入Word文檔
這裡我們用到的是python-docx模塊,讀寫Word文檔的操作均有它完成!
# 安裝該模塊,在命令行鍵入以下命令
pip install python-docx在進行後續介紹前,我們先簡單了解一下Word文檔。和純文本(比如txt)相比, .docx文件有很多種結構,這些結構在python-docx中用3種不同的類型來表示:最高一層是Document對象表示文檔,每個Document對象包含一個Paragraph 對象也就是段落組成的列表,而每個Paragraph對象則包含一個Run對象的列表,至於Run對象大家可以通過下面的段落Paragraph來了解。
多個Run對象組成的Paragraph我們知道Word裡的文本包含有很多格式,比如字體、字號、粗體/斜體、顏色等等。一個Run對象是具有相同格式的文本,當發生變化的時候就需要一個新的Run對象,這也就是上圖中1個Paragraph對象有4個Run對象的原因。
理解以上知識後,我們再來了解讀與寫吧。
我們本地創建一個案例文檔,用於演示讀取Word,案例文檔內容如下:
案例.docx可以看到文檔一共有四行,兩行標題以及兩行正文。
import docx
# 讀取Word文檔
doc = docx.Document(r'案例.docx')我們知道了讀取Word每個paragraph段落和Run,那麼如何讀取完整的Word文本內容呢?這裡,自定義一個函數將全部的paragraph段落內容存起來,每個paragraph段落之間用換行符\n隔開即可。
import docx
def getText(fileName):
doc = docx.Document(fileName)
TextList = []
for paragraph in doc.paragraphs:
TextList.append(paragraph.text)
return '\n'.join(TextList)我們調用該函數,可以得到:
fileName = r'案例.docx'
print(getText(fileName))標題1
這是一個段落,有粗體和斜體
大家好,我是才哥。
標題2當然了,這裡讀取後輸出顯示的文本不帶有格式屬性哈。
在寫入Word之前,我們先簡單了解下Word的一些格式規則。
毫不誇張的講,把全局樣式玩的明白的人蠻少的。這方面主要是正文樣式與標題樣式,如果玩得明白的話,其實設置好了之後幾乎不需要再進行啥調整,全局格式都能自動設置與更新。就我所見的大多數朋友的文檔,這方面基本達不到。(感覺會被爆錘~~)
全局樣式比如,我們可以設置正文樣式為 微軟雅黑字體,字號12,縮進,間距等等;設置標題樣式為 微軟雅黑字體,字號14,刪除段落後間距等等。
在我們Python處理Word的時候,段落樣式可以應用於 Paragraph 對象,字符樣式可以應用於 Run 對象,連結的樣式可以應用於這兩種對象。可以將 Paragraph 和Run 對象的 style 屬性設置為一個字符串,從而設置樣式。這個字符串應該是一種樣式的名稱。如果 style 被設置為 None,就沒有樣式與 Paragraph 或 Run 對象關聯。
當然,這裡我們不展開介紹,就簡單介紹Run對象上的字符屬性。關於更多的介紹,我們放在第三期的 詳解Python寫Word裡。
對於Run對象的字符text屬性,都有3個狀態:True(啟用)、False(禁用)和None(默認)。
text屬性有哪些?看下表:
屬性描述bold文本以粗體出現italic文本以斜體出現underline文本帶下劃線strike文本帶刪除線double_strike文本帶雙刪除線all_caps文本以大寫首字母出現small_caps文本以大寫首字母出現,小寫字母小兩個點shadow文本帶陰影outline文本以輪廓線出現,而不是實心rtl文本從右至左書寫imprint文本以刻入頁面的方式出現emboss文本以凸出頁面的方式出現我們演示一下:
調整樣式以上就是對段落的一些簡單介紹及演示,接下來,我們來看看怎麼創建並寫入Word。
要創建自己的.docx 文件,就調用 docx.Document(),返回一個新的、空白的 Word Document 對象 。Document 對象的 add_paragraph()方法將一段新文本添加到文檔中,並返回添加的 Paragraph 對象的引用。在添加完文本之後,向 Document 對象的 save()方法傳入一個文件名字符串,將 Document 對象保存到文件。
import docx
doc = docx.Document()
doc.add_paragraph('這是一個段落')
doc.save('寫入word.docx')
寫入word我們可以添加段落、設置段落文本樣式等等,比如:
import docx
doc = docx.Document()
p1 = doc.add_paragraph('這是一個段落')
p1.add_run('加粗的一句話').bold = True
doc.add_paragraph('這是第二個段落')
doc.save('多段落.docx')
多段落我們還可以添加一個段位,這個段落為標題樣式,這裡需要用到add_heading()。它有兩個參數,字符串表示文本內容,後面數字是標題層級。
import docx
doc = docx.Document()
doc.add_heading('標題',0)
doc.add_heading('標題1',1)
doc.add_heading('標題2',2)
doc.add_heading('標題3',3)
doc.add_heading('標題4',4)
doc.save('標題.docx')
標題同樣,我們還可換行與換頁操作。
要添加換行符(而不是開始一個新的段落),可以在 Run 對象上調用 add_break()方法,換行符將出現在它後面。如果希望添加換頁符,可以將 docx.text.WD_BREAK.PAGE作為唯一的參數,傳遞給 add_break() 。
import docx
doc = docx.Document()
p1 = doc.add_paragraph('這是一個段落')
p1.add_run('加粗的一句話').bold = True
# 換行
doc.paragraphs[0].runs[0].add_break()
doc.save('換行.docx')
換行有人會說,一般word裡還有圖片嘛,當然咱們也能搞定添加圖片。
有一個 add_picture()方法,可以在段落末尾添加圖像 。
import docx
doc = docx.Document()
doc.add_paragraph('這是一個段落,後面帶圖片')
doc.add_picture('圖片.png',
width=docx.shared.Inches(3),
height=docx.shared.Cm(4))
doc.add_paragraph('這是第二個段落')
doc.save('圖片.docx')
添加圖片以上就是本次的簡單入門介紹。
其實Word文檔各種樣式設置,數據類型展示等等非常豐富,而Python-docx這個模塊其實也能進行大多數的處理。不過,日常中我們用到的功能也沒那麼多,此部分留作後續詳情講解哈。
如果你喜歡本系列,還請點讚+在看支持啦~~