用Python讀寫(xiě)Word文檔入門(mén)

最近有同事需要批量出500個(gè)Word文檔,按照1個(gè)Word文檔耗時(shí)1分鐘來(lái)算也需要8.33小時(shí)足足有1天工時(shí)。于是,這位同事找到了才哥幫忙,才哥接過(guò)需求花了不到30分鐘寫(xiě)好腳本,運(yùn)行腳本不到1分鐘就生成了500份Word文檔并且進(jìn)行了分類(lèi)歸檔!
這就是Python的魅力,讓工作更輕松!
今天,我們就來(lái)了解一下用Python讀寫(xiě)Word文檔。未來(lái),我將再出兩期進(jìn)行補(bǔ)充介紹,一篇是批量生成Word文檔的方法(也就是我搞定同事需求的案例),另外一篇是詳解Python寫(xiě)Word(包含可能你都不知道的各種Word格式),敬請(qǐng)期待哈~
目錄:
1. 安裝模塊
2. 讀取Word文檔
3. 寫(xiě)入Word文檔

1. 安裝模塊
這里我們用到的是python-docx模塊,讀寫(xiě)Word文檔的操作均有它完成!
# 安裝該模塊,在命令行鍵入以下命令
pip install python-docx
在進(jìn)行后續(xù)介紹前,我們先簡(jiǎn)單了解一下Word文檔。和純文本(比如txt)相比, .docx文件有很多種結(jié)構(gòu),這些結(jié)構(gòu)在python-docx中用3種不同的類(lèi)型來(lái)表示:最高一層是Document對(duì)象表示文檔,每個(gè)Document對(duì)象包含一個(gè)Paragraph 對(duì)象也就是段落組成的列表,而每個(gè)Paragraph對(duì)象則包含一個(gè)Run對(duì)象的列表,至于Run對(duì)象大家可以通過(guò)下面的段落Paragraph來(lái)了解。

我們知道Word里的文本包含有很多格式,比如字體、字號(hào)、粗體/斜體、顏色等等。一個(gè)Run對(duì)象是具有相同格式的文本,當(dāng)發(fā)生變化的時(shí)候就需要一個(gè)新的Run對(duì)象,這也就是上圖中1個(gè)Paragraph對(duì)象有4個(gè)Run對(duì)象的原因。
理解以上知識(shí)后,我們?cè)賮?lái)了解讀與寫(xiě)吧。

2. 讀取Word文檔
我們本地創(chuàng)建一個(gè)案例文檔,用于演示讀取Word,案例文檔內(nèi)容如下:

可以看到文檔一共有四行,兩行標(biāo)題以及兩行正文。
import docx
# 讀取Word文檔
doc = docx.Document(r'案例.docx')

我們知道了讀取Word每個(gè)paragraph段落和Run,那么如何讀取完整的Word文本內(nèi)容呢?這里,自定義一個(gè)函數(shù)將全部的paragraph段落內(nèi)容存起來(lái),每個(gè)paragraph段落之間用換行符\n隔開(kāi)即可。
import docx
def getText(fileName):
doc = docx.Document(fileName)
TextList = []
for paragraph in doc.paragraphs:
TextList.append(paragraph.text)
return '\n'.join(TextList)
我們調(diào)用該函數(shù),可以得到:
fileName = r'案例.docx'
print(getText(fileName))
標(biāo)題1
這是一個(gè)段落,有粗體和斜體
大家好,我是才哥。
標(biāo)題2
當(dāng)然了,這里讀取后輸出顯示的文本不帶有格式屬性哈。

3. 寫(xiě)入Word文檔
在寫(xiě)入Word之前,我們先簡(jiǎn)單了解下Word的一些格式規(guī)則。
毫不夸張的講,把全局樣式玩的明白的人蠻少的。這方面主要是正文樣式與標(biāo)題樣式,如果玩得明白的話,其實(shí)設(shè)置好了之后幾乎不需要再進(jìn)行啥調(diào)整,全局格式都能自動(dòng)設(shè)置與更新。就我所見(jiàn)的大多數(shù)朋友的文檔,這方面基本達(dá)不到。(感覺(jué)會(huì)被爆錘~~)

比如,我們可以設(shè)置正文樣式為 微軟雅黑字體,字號(hào)12,縮進(jìn),間距等等;設(shè)置標(biāo)題樣式為 微軟雅黑字體,字號(hào)14,刪除段落后間距等等。
在我們Python處理Word的時(shí)候,段落樣式可以應(yīng)用于
Paragraph對(duì)象,字符樣式可以應(yīng)用于Run對(duì)象,鏈接的樣式可以應(yīng)用于這兩種對(duì)象??梢詫?Paragraph和Run對(duì)象的style屬性設(shè)置為一個(gè)字符串,從而設(shè)置樣式。這個(gè)字符串應(yīng)該是一種樣式的名稱(chēng)。如果style被設(shè)置為None,就沒(méi)有樣式與Paragraph或Run對(duì)象關(guān)聯(lián)。
當(dāng)然,這里我們不展開(kāi)介紹,就簡(jiǎn)單介紹Run對(duì)象上的字符屬性。關(guān)于更多的介紹,我們放在第三期的 詳解Python寫(xiě)Word里。
對(duì)于Run對(duì)象的字符text屬性,都有3個(gè)狀態(tài):True(啟用)、False(禁用)和None(默認(rèn))。
text屬性有哪些?看下表:
| 屬性 | 描述 |
|---|---|
| bold | 文本以粗體出現(xiàn) |
| italic | 文本以斜體出現(xiàn) |
| underline | 文本帶下劃線 |
| strike | 文本帶刪除線 |
| double_strike | 文本帶雙刪除線 |
| all_caps | 文本以大寫(xiě)首字母出現(xiàn) |
| small_caps | 文本以大寫(xiě)首字母出現(xiàn),小寫(xiě)字母小兩個(gè)點(diǎn) |
| shadow | 文本帶陰影 |
| outline | 文本以輪廓線出現(xiàn),而不是實(shí)心 |
| rtl | 文本從右至左書(shū)寫(xiě) |
| imprint | 文本以刻入頁(yè)面的方式出現(xiàn) |
| emboss | 文本以凸出頁(yè)面的方式出現(xiàn) |
我們演示一下:


以上就是對(duì)段落的一些簡(jiǎn)單介紹及演示,接下來(lái),我們來(lái)看看怎么創(chuàng)建并寫(xiě)入Word。
要?jiǎng)?chuàng)建自己的.docx 文件,就調(diào)用 docx.Document(),返回一個(gè)新的、空白的 Word Document 對(duì)象 。Document 對(duì)象的 add_paragraph()方法將一段新文本添加到文檔中,并返回添加的 Paragraph 對(duì)象的引用。在添加完文本之后,向 Document 對(duì)象的 save()方法傳入一個(gè)文件名字符串,將 Document 對(duì)象保存到文件。
import docx
doc = docx.Document()
doc.add_paragraph('這是一個(gè)段落')
doc.save('寫(xiě)入word.docx')

我們可以添加段落、設(shè)置段落文本樣式等等,比如:
import docx
doc = docx.Document()
p1 = doc.add_paragraph('這是一個(gè)段落')
p1.add_run('加粗的一句話').bold = True
doc.add_paragraph('這是第二個(gè)段落')
doc.save('多段落.docx')

我們還可以添加一個(gè)段位,這個(gè)段落為標(biāo)題樣式,這里需要用到add_heading()。它有兩個(gè)參數(shù),字符串表示文本內(nèi)容,后面數(shù)字是標(biāo)題層級(jí)。
import docx
doc = docx.Document()
doc.add_heading('標(biāo)題',0)
doc.add_heading('標(biāo)題1',1)
doc.add_heading('標(biāo)題2',2)
doc.add_heading('標(biāo)題3',3)
doc.add_heading('標(biāo)題4',4)
doc.save('標(biāo)題.docx')

同樣,我們還可換行與換頁(yè)操作。
要添加換行符(而不是開(kāi)始一個(gè)新的段落),可以在 Run 對(duì)象上調(diào)用 add_break()方法,換行符將出現(xiàn)在它后面。如果希望添加換頁(yè)符,可以將 docx.text.WD_BREAK.PAGE作為唯一的參數(shù),傳遞給 add_break() 。
import docx
doc = docx.Document()
p1 = doc.add_paragraph('這是一個(gè)段落')
p1.add_run('加粗的一句話').bold = True
# 換行
doc.paragraphs[0].runs[0].add_break()
doc.save('換行.docx')

有人會(huì)說(shuō),一般word里還有圖片嘛,當(dāng)然咱們也能搞定添加圖片。
有一個(gè) add_picture()方法,可以在段落末尾添加圖像 。
import docx
doc = docx.Document()
doc.add_paragraph('這是一個(gè)段落,后面帶圖片')
doc.add_picture('圖片.png',
width=docx.shared.Inches(3),
height=docx.shared.Cm(4))
doc.add_paragraph('這是第二個(gè)段落')
doc.save('圖片.docx')

以上就是本次的簡(jiǎn)單入門(mén)介紹。
其實(shí)Word文檔各種樣式設(shè)置,數(shù)據(jù)類(lèi)型展示等等非常豐富,而Python-docx這個(gè)模塊其實(shí)也能進(jìn)行大多數(shù)的處理。不過(guò),日常中我們用到的功能也沒(méi)那么多,此部分留作后續(xù)詳情講解哈。
往期推薦 1、這幾個(gè)Python裝逼神器一定要收藏好! 2、一行代碼制作數(shù)據(jù)分析交叉表,太便捷了 3、通透理解Python函數(shù)傳參機(jī)制! 4、這個(gè)Python神器,能讓你摸半天魚(yú)! 5、Python自動(dòng)化監(jiān)控文件夾完成服務(wù)部署! 點(diǎn)擊關(guān)注公眾號(hào),閱讀更多精彩內(nèi)容


