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