編程學習筆記 2023-09-04 #00003 | 主題 : Python PPTX 初接觸
引言
雖然標題為初接觸,但其實已經用了一段時間。
由於最近公司需要用到一些工具來自動更新PowerPoint中的表格數據,而認識到Pypptx。雖然公司希望我用UIPath來進行自動化。但畢竟是練習Python的機會,所以我最終還是自作主張地用Python寫。(畢竟UIPath學習曲線太短,學習Coding對未來更有幫助,只少我是這麼認為的)
Python-PPTX的安裝如下 :
需特別留意的是在import時需加上import collections及import collections.abc才能正常運作,
有些版本的Python則不需要,可以視當下情況作調整。
另外要注意部分版本的Python需要在python-pptx的.py檔修改import部分的代碼。
這次使用的是Python 3.11.1 64bit,先前在我的Ubuntu機安裝時有出現相關問題,
但我已經大致忘記要修改部分,便不太多着墨,
遇上的話可以慢慢對照Error來修改python-pptx的.py檔就可以,不會太複雜的。
但我已經大致忘記要修改部分,便不太多着墨,
遇上的話可以慢慢對照Error來修改python-pptx的.py檔就可以,不會太複雜的。
介紹
首先,我們在嘗試python-pptx前,最好了解下Powerpoint所使用的.pptx檔。
如果在網上搜尋關於.pptx的介紹,大概會找.pptx檔是現時主流的演示文稿檔,
常用Office的Powerpoint或LibreOffice的Impress來進行編輯,blablabla........
但其實這些全部都不重要,
我們要了解的是.pptx檔的真正身份其實是壓縮檔(,zip/7z)。
這裡說一些題外話,
對新入門的Window玩家而言,或許有些驚訝,
但對於Linux玩家而言大概已經有一個清楚的認知,那便是所謂的副檔名比你二大伯的吹噓還不可信,畢竟在Linux上,一大堆檔案都沒有副檔名,即便加了也沒什麼用途,漸漸也不太在意副檔名。
而在Window上,只要修改副檔案名就會出提示,彷彿改了副檔案名,檔案就會損毀一樣,
而這種現象給了使用者錯覺,好像副檔案名有多高的重要性一般,對於學CS的人而言的確不太健康。
但其實副檔名僅僅是用來提示電腦在開啟檔案時需要什麼程式,
.mp3就開Window Video Player ;
.pdf就開Adobe Pdf Viewer 等等。
實際上,檔案內的數據完全不被副檔名影響。
即便.mp4被成了.avi,影片仍然會是MPEG-4的Codec,
.mov改成了.mp4,影片也不會被壓縮。
影音檔案所使用的Codec其實是由數據Header所確立的,當然這是題外話的題外話就是了。
了解了這概念之後,應該比較能理解「.pptx = .zip」的邏輯。
而這個壓縮檔解壓縮後會有什麼呢?
答案是 : XML,也就是數據
如果也沒用過Json的話,可以理解成格式不一樣的Csv,
如果也沒用過Csv的話,可以考慮買一檯電腦再說。
XML檔
Xml的格式比起Json和CSV來說有些複雜,以下是AWS官網上找到的範例 :
以上的XML可以理解成,在邀請的清單中有一部分人是家屬,
而家屬中有兩名阿姨,名字分別是Christine以及Stephanie。
當然,認識XML格式對寫Python-PPTX並沒有直接的影響,
Python-PPTX的Module中並沒有直接編寫XML的部分,
但了解了.pptx的數據邏輯,對於在編寫Python-PPTX時的程式碼邏輯梳理還是頗有幫助的。
而且,
就如剛才所提及,無論你是.xml、.json、.csv還是.config,其本質都只是文字檔,
只是在用不同的格式來儲存數據而已。
而在Python-pptx這個Module其實也有一些功能並沒有完善,例如圖表的第二個縱軸的格式修改,在Github上的開發者社群也暫時沒有相關的開發計劃,想用Python-pptx來修改的話就有點麻煩了。
只不過如果直接修改xml檔的話,雖然比較麻煩,但依然可以實現在Python-ppt之外的功能。
當然,如果有心的話也可以為社群Contribute一下。
使用
如果要靈活使用python-pptx,就必須先一層一層了解一個.pptx檔的結構。
首先,進行PowerPoint修改的第一步當然是開一個PowerPoint,做法有二。
i) 如果是開新檔案的話,定義一個新的Presentation
Object便可
ii) 如果修改現有檔案的話,定義時加上.pptx檔的路徑便可。
而剛定的prs會是整個pptx的根,接下來的所有修改都會基於這個Object
在prs下,會有一個Slides的List,由0開始,用以下方式讀取需要的Slide,
在這裡是Slide 2。
在這裡是Slide 2。
在slide之下會有shapes,而讀取方式同上。
(至於,要用哪一個Index,下文會再解釋)
而shape可以理解為各個在Powerpoint中可以移動的Widgets,
文字、圖表、表格、圖片都是。
(至於,要用哪一個Index,下文會再解釋)
而shape可以理解為各個在Powerpoint中可以移動的Widgets,
文字、圖表、表格、圖片都是。
shpae底下會視情況分成兩個大方向,分別為GraphicFrame及TextFrame。
**還有更多類型的Shape,但早期不太會用到
故名思義,GraphicFrame與圖表有關,TextFrame則與文字有關。
先講TextFrame,在我們先千辛萬苦的努力下得到了文字方塊,終於可以修改文字了嗎?
先不要太急,還有幾層的子元素要Access。
先不要太急,還有幾層的子元素要Access。
首先是 paragraphs 也就是文字的段落。
接着是run也就是行。
最後在run裡有一個text
最後在run裡有一個text
最終得到的這個text才能用於修改文字,
而修改文字內容的方法如下 :
組成
從slides到text的結構如下,
slides[2] >> shapes[0] >> text_frame >> paragraphs[0]
>> run[0] >> text
slides : 選擇需要修改的投影片
shapes : 選擇要修改的物件,如物件為文字方塊的話,會有一個text_frame
paragraphs : 選擇在文字方塊中的要修改的段
runs : 選擇需要修改的行
**需要留意,paragraphs中亦有text可以用作修改文字,但在paragraphs層級修改文字的話格式會恢復回預設格式。
**在大多情況下shape不會只有一個,要找出需要的shape可以用for loop把所有的文字都Print一次。
結論
其實還很多內容要寫,但花太多時間可能要慢慢更新了。
更加麻煩的是找到自己想要的shape Index、paragraph Index、run
Index通通都要自己慢慢測試,但成品比UIPath混合Excel的做法完成度更高。
我為此寫了個小工具來找需要的Index方在Github上,當作Pyqt的練習,完成度非常低,而且還是在公司偷寫的,寫着寫着還要怕被問我在寫什麼,Code可以說亂七八糟,但比一個一個找方便不少。有時間我再更新一下,看看把Chart的部分也加進去、GUI也修修之類的吧。
我為此寫了個小工具來找需要的Index方在Github上,當作Pyqt的練習,完成度非常低,而且還是在公司偷寫的,寫着寫着還要怕被問我在寫什麼,Code可以說亂七八糟,但比一個一個找方便不少。有時間我再更新一下,看看把Chart的部分也加進去、GUI也修修之類的吧。
Github - Python-pptxScanner
https://github.com/Oxoi5583/Python-pptxScanner
##後話 :
2023-10-10
覺得原本的開頭有點爛,
所以修改了文章開頭部分,但發現和原本的內文沒有很配,
或許內文也要改一下。
總覺得一篇文章就要花幾個月,救命。