原來做報告,也可以直接寫程式!Licensed by Adobe Stock
在忙碌一整天之後, Meiko 和 Jason 在附近的小吃店果腹,Meiko 眉頭深鎖似乎在想些什麼。
Jason:「誒,你臉色看起來不太好,發生了什麼事?」
Meiko:「也還好拉,只是最近老闆要我幫他整理資料,還要做成一個完整的簡報,實在讓我很傷腦筋。老實說可以用先前你教我的 Python 做資料分析是蠻開心的,可是處理資料後要把這些做好的資料複製貼上,或是打一堆說明文字,就真的讓我有點煩心。」
Jason:「是唷,你知道,Python 也可以用來製作 PPT 投影片嗎?尤其是它可以幫你把 Matplotlib 做好的圖檔,直接放到 ppt 上面,這樣是不是就省了很多事啊?」
Meiko:「這麼神奇,那你還不趕快教我?」
Jason:「別急,你要在本機端先安裝 python-pptx 的模組才行,要現在命令提示列裡面或是終端機(Terminal)先安裝起來!」
Meiko:「還好你先教我用 Anaconda,只要用 conda install 那行就可以正確安裝了!」
Jason:「好,那我們話不多說,先做出第一頁的 Python 簡報來看看!」
# -*- coding: UTF-8 -*-
from pptx import Presentation
#開啟新的簡報物件
prs = Presentation()
#建立簡報檔第一張頁面物件
title_slide_layout = prs.slide_layouts[0]
#增加一張簡報
slide = prs.slides.add_slide(title_slide_layout)
#設定第一張簡報的標題
title = slide.shapes.title
title.text = "Hello Python PPT"
#設定第一張簡報的副標題
subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"
#將簡報物件存檔
prs.save("python_ppt_v1.pptx")
Meiko:「這麼容易呀!」
Jason:「對啊,其實用 Python 做出 PPT 簡報一點都不難唷!不過,我還是要一行行跟你說每個程式碼在做什麼,這樣你才可以繼續自己做下去。」
Meiko:「我腦海中想的 PPT 簡報,跟程式做出來的好像還是有點差距,哈哈!看起來有點樸素...」
Jason:「沒那麼快拉,我們先看第一行,如果你在程式碼中有打中文字的話,就一定要有下面這行」
# -*- coding: UTF-8 -*-
Jason:「接著,我們就來看程式碼在做什麼事囉!這行就是用我們 import 的模組 Presentation 產生一個物件出來!」
prs=Presentation()
Jason:「然後我們就要去看說,我們想要增加什麼樣的排列方式,可以用.slide_layouts[數字]
來代表,比如說你先把上面那個 python_ppt_v1.pptx 打開,並且用 檢視->投影片母片 的方式打開,你就會發現會有兩個階層的簡報母片檔,.slide_layouts[0]
就代表第一張的格式,.slide_layouts[1]
第二張的格式,依此類推,你可以試試看下面的 6 種數字對應的格式,選擇不同的.slide_layouts[數字]
看會呈現什麼方式,就會比較有感覺囉!」
title_slide_layout= prs.slide_layouts[0]
Jason:「像這行就代表選了上面數字為 0 的格式,並且指定到 title_slide_layout 裡面。」
slide = prs.slides.add_slide(title_slide_layout)
Jason:「接著,我們就用.slides.add_slide 的方式把這張首頁的簡報,加到我們一開始建立的prs
裡面。」
Meiko:「歐,也是一步步完成的感覺!」
Jason:「對啊,接下來我們就來設定簡報的標題」
title = slide.shapes.title
title.text = "Hello Python PPT"
Meiko:「這邊沒問題!」
Jason:「最後我們要設定簡報下方的小標,作者就是你拉!」
subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"
Meiko:「大標、小標都做好了,應該要來存檔一下,對吧?」
Jason:「沒錯,我們就開透過.save(檔名)
來存檔,我們執行之後,接下來到你工作的資料夾,就可以看到剛剛用 Python 程式執行後得出來的簡報檔 "python_ppt_v1.pptx"」
prs.save("python_ppt_v1.pptx")
Meiko:「我們有了第一頁,應該要有個內頁,那我們先放一張圖再有個大標,比較有感覺!」
# -*- coding: UTF-8 -*-
from pptx import Presentation
import matplotlib.pyplot as plt
from pptx.util import Inches
#開啟新的簡報物件
prs = Presentation()
#建立簡報檔第一張頁面物件
title_slide_layout = prs.slide_layouts[0]
#增加一張簡報
slide = prs.slides.add_slide(title_slide_layout)
#設定第一張簡報的標題
title = slide.shapes.title
title.text = "Hello Python PPT"
#設定第一張簡報的副標題
subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"
#將簡報物件存檔
def add_slide(prs, layout, img):
#加一張投影片
slide = prs.slides.add_slide(layout)
shapes = slide.shapes
#投影片標題
title_shape = shapes.title
title_shape.text = '長方圖示範'
# show the figure
left = Inches(3)
height = Inches(4.5)
left = top = Inches(3)
pic = slide.shapes.add_picture(img, left, top, height=height)
return slide
x_labels = ['A','B','C']
sales_num = [120,90,60]
plt.bar(x_labels,sales_num)
plt.savefig('graph.jpg')
img = 'graph.jpg'
title_slide_layout = prs.slide_layouts[1]
slide = add_slide(prs, title_slide_layout ,img)
prs.save("python_ppt_v1.pptx")
Meiko:「Jason,這雖然可以自動產生,但看起來就是一個還沒有編排過的圖檔,實在很不專業耶!」
Jason:「別急麻,我們先來講解一下這部分的內容,你看到最下面從 x_labels的地方,其實跟我們Day-25提到的內容是相同的,只是我們多增加了一行plt.savefig()
我們把這個圖檔另外存成一個叫做graph.jpg
的檔案。」
Meiko:「歐,這邊只有一點點差異而已。」
Jason:「對啊,然後比較新的東西,就是我們多增加一個函數add_slide
,裡面有 3 個輸入的參數,分別是prs
,title_slide_layout
和img
。prs
和title_slide_layout
前面提過了,img
就是前步驟存下來的圖檔當作這個函式的輸入。」
Meiko:「看起來不難麻。哈!」
Jaosn:「還沒講完唷,下面這兩行就是增加一張投影片」
slide = prs.slides.add_slide(layout)
shapes = slide.shapes
Jaosn:「接著,下面這兩行就是增加投影片的標題」
title_shape = shapes.title
title_shape.text = '長方圖示範'
Jason:「最後,就是新增圖檔囉!我們用slide.shapes.add_picture
這個方法,然後設定img
、left
、top
和 height
這幾個參數,概念上就是以 Inches(英吋)為單位,去把該圖片要放在距離投影片左邊和上方的距離定義出來,然後加入到slide
就可以囉!」
left = Inches(3)
height = Inches(4.5)
left = top = Inches(3)
pic = slide.shapes.add_picture(img, left, top, height=height)
Meiko:「原來是這樣!」
Jason:「對啊,你剛有提到這投影片好像沒有編排過,可能是因為沒有說明的文字吧!」
def add_slide(prs, layout,img):
slide = prs.slides.add_slide(layout)
shapes = slide.shapes
#投影片標題
title_shape = shapes.title
title_shape.text = '長方圖示範'
#投影片內第一大點
body_shape = shapes.placeholders[1]
tf = body_shape.text_frame
tf.text = '這是一個一週銷售狀況的示範'
#投影片內第二階層小點
p = tf.add_paragraph()
p.text = '分別有 A、B、C 三種品牌的銷售量'
p.level = 1
# show the figure
left = Inches(3)
height = Inches(4.5)
left = top = Inches(3)
pic = slide.shapes.add_picture(img, left, top, height=height)
return slide
Jason:「哈囉,你看我在add_slide
這個函式裡面,新增加body_shape
和add_paragraph
之後,就可以像一般我們在做投影片上打字一樣的感覺!」
Meiko:「這文字好像有一個階層的關係,Jason 你可以講解一下嗎?」
Jason:「不錯唷,你可以把它看成是 slide->shape->text_frame->add_paragraph 這樣的關係。如果你想要加更多階層的字,可以看一下它有一個p.level
的方式,像這邊p.level=1
,就是大點的下一階層的文字。」
Meiko:「哇,這樣我迫不及待看到一個完整的報告了!!」
我大寶寶~拉,今天我們談了用 python-pptx 的模組,如果是固定格式的簡報,用 Python 來產生會快很多!
大寶寶平常最常使用的時機就是在產生報表,或是週報,這種不太會有大幅度變化的時間點,雖然剛開始要花一點時間才能熟悉整個程式運作背後的邏輯,但是熟悉之後,要做簡報就變得非常容易了!明天,我們會嘗試把先前做過的圖表,用 Python 放到簡報裡面,想辦法變成一個完整的報告!
歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!