Hello Word —— 使用Python讀寫Office文檔之一

本系列文章將介紹如何使用Python讀寫主要Microsoft Office文檔(Word,Excel和PowerPoint)

======================================================================================================================================

1. 操作Office文檔的兩種方法

本系列文章所指『Office文檔』,特指Word文檔、Excel工作簿和PowerPoint幻燈片。其他Office軟體產生的文檔不在討論範圍。

對一個Office文檔進行讀寫,除了可以直接讀寫磁碟上的實質文件,還可以通過Office應用程序提供的COM介面進行。 COM介面相當於一個『官方中介』。而提供直接讀寫磁碟文件的庫,相當於『小中介』。在Office 2003/2004以及以前,Office文檔只採用微軟私有的二進位格式,而這些私有格式直到2006年才公開於眾。也就是說,小中介們以前都靠逆向工程以及各種猜測才實現了Office文檔的讀寫。

時至今日,『官方中介』以及『小中介』都各有優劣。利用COM介面,優點在於能夠使用到幾乎Office所有的功能,並且由於COM的跨語言特性,知識遷移非常容易;缺點在於僅限於Windows + Office平台,操作系統和軟體缺一不可。利用直接讀寫介面,優點在於跨平台,只要Python能夠支持的平台基本上都可以,不需要Windows也不需要Office軟體;缺點在於只能夠使用一些基本的功能。

本系列文章只介紹如何使用直接讀寫介面操作Office文檔。若想了解COM介面的使用,請參考pywin32的文檔以及微軟MSDN。

2. Hello Word!

下面的例子可以運行於任何平台(PC、Mac、樹莓派……)。但是,如果想看到產生的文檔,你還是需要一個能打開Office文檔的應用。沒有安裝微軟Office的話,其他替代軟體比如AbiWord、OpenOffice、WPS之類的都可以。

首先安裝python-docx這個Python庫

$ pip install python-docx -Un

(注意,在PyPi里還有一個叫docx的庫,已經停止更新,不建議使用)

這個庫依賴於lxml,在Windows下可能需要編譯器。如果在安裝python-docx過程中發現找不到編譯器或者編譯lxml錯誤的現象,可到 pypi.python.org/pypi/lx 下載和安裝預編譯的版本。

只需要4行代碼就可以創建一個Word文檔:

from docx import Documentndocument = Document()ndocument.add_paragraph(Hello,Word!)ndocument.save(demo.docx)n

第一行引入docx庫和Document類。Document類即代表了『文檔』,第二行創建了Document類的一個實例document,相當於『這篇文檔』。緊接著,我們在文檔中利用add_paragraph函數添加一個段落,段落的內容是Hello,Word!。最後,用save函數將文檔保存在磁碟上。

運行這個腳本,就得到了文件demo.docx。用Office軟體打開,看看裡面的內容。

3. 插入圖片

下面一個任務是在一個Word文檔里添加255個圓圈,顏色為紅色由淺入深。顯然,這個任務在Word里人工完成是非常麻煩的。但用代碼就非常簡單了。

from docx import Documentnfrom PIL import Image,ImageDrawnfrom io import BytesIOnndocument = Document() #新建文檔np = document.add_paragraph() #添加一個段落nr = p.add_run() #添加一個遊程nimg_size = 20nfor x in range(255):n im = Image.new("RGB", (img_size,img_size), "white")n draw_obj = ImageDraw.Draw(im)n draw_obj.ellipse((0,0,img_size-1,img_size-1), fill=255-x)#畫圓n fake_buf_file = BytesIO()#用BytesIO將圖片保存在內存里,減少磁碟操作n im.save(fake_buf_file,"png")n r.add_picture(fake_buf_file)#在當前遊程中插入圖片n fake_buf_file.close()n document.save("demo.docx")n

畫圖我們利用了常用的PIL庫。這段代碼還展示了所謂『遊程』的概念,在接下來的篇章中將加以介紹。

致謝:

感謝wanghz49指出用BytesIO


推薦閱讀:

TAG:Python | MicrosoftOffice |