看我用Python瞬間制作數(shù)百份PPT,贏得小姐姐的下午茶

大家好,我是早起。
今天繼續(xù)分享Python辦公自動(dòng)化真實(shí)案例,本文是一個(gè)基于Python+Excel+PPT的應(yīng)用,看我如何用一段代碼安撫焦慮的小姐姐,贏得妹子的下午茶。先看看她的需求??
需求描述
你是一名幼兒園老師,本學(xué)期已經(jīng)結(jié)束現(xiàn)在要給 400 個(gè)小朋友制作獎(jiǎng)狀,手上有一份名單 list.xlsx 和 PPT 獎(jiǎng)狀模板 temp.pptx:
內(nèi)容大致如下(為了不影響隱私部分?jǐn)?shù)據(jù)為虛構(gòu))


過程并不是很難,按照Excel中數(shù)據(jù),一行一行的粘貼到獎(jiǎng)狀模版中就行。
可如果是手動(dòng)復(fù)制、粘貼的話,那么400多份獎(jiǎng)狀少說也要制作一天,下面我來講解如何利用Python瞬間完成!主要將涉及:
openpyxl讀取 Excel 文件python-pptx寫入 PPT 文件PPT 占位符相關(guān)知識
前置知識與邏輯梳理
完成本案例需要先閱讀我之前寫的原理文章
之后需要理解兩個(gè)概念:版式和占位符
一、版式
版式的選擇和設(shè)置操作如下圖?;旧匣脽羝摰奶砑邮腔谝粋€(gè)完整的版式,確定完了版式后再在上面添加內(nèi)容:
我們打開需求模板 temp.pptx 后會(huì)發(fā)現(xiàn)沒有任何一頁:
點(diǎn)擊創(chuàng)建后就會(huì)出現(xiàn)一個(gè)新的頁面,這個(gè)是我已解決在版式中預(yù)設(shè)好的:
仔細(xì)看會(huì)發(fā)現(xiàn),在預(yù)覽狀態(tài)下是看不見模板上這些字的,同樣點(diǎn)擊輸入后也會(huì)發(fā)現(xiàn)字會(huì)不見。原因是這些文本框不是真實(shí)的形狀,而是占位符
二、占位符
占位符看下面一張圖就行了
邏輯梳理
有了上面兩個(gè)概念的認(rèn)識,我們就可以梳理代碼創(chuàng)建 PPT 文件的邏輯:
“”
創(chuàng)建一個(gè) PPT
從幻燈片母版中確定一個(gè)版式
在不同的占位符中填寫不同的內(nèi)容
明白了邏輯后又出現(xiàn)了一個(gè)新的問題:我們的模板中有多個(gè)占位符,如何確定占位符并往相應(yīng)的占位符里填寫內(nèi)容?
答案很簡單,每個(gè)占位符都有自己的編號,在代碼中通過占位符編號就能夠確定指定的占位符了,具體見代碼實(shí)操
Python實(shí)現(xiàn)過程
首先我們讀取 list.xlsx 文件:
from?openpyxl?import?load_workbook
path?=?r'C:\xxx'?#?根據(jù)自己的情況填寫模板和名單所在的路徑
workbook?=?load_workbook(path?+?r'\list.xlsx')
sheet?=?workbook.active
獲取每個(gè)小朋友的信息的方法很簡單,通過 for row in sheet.rows: 迭代獲取每一行,這是一個(gè)元祖,指定位置就可以獲取具體參數(shù)了:
for?row?in?sheet.rows:
????class_id?=?row[0].value
????name?=?row[1].value
????title?=?row[2].value
????print(class_id,?name,?title)

接下來是 PPT 部分的操作了,在循環(huán)體外部要打開模板:
“這里是看自己的需求,本文中是將 400 個(gè)小朋友的獎(jiǎng)狀生成在 1 個(gè) PPT 文件中輸出,如果你想要輸出 400 份不同的文件,就是在循環(huán)體內(nèi)部實(shí)例化以及保存了
”
from?pptx?import?Presentation
...?#?之前打開?Excel?文件的代碼
pptx?=?Presentation(path?+?r'\temp.pptx')
然后就是以第一個(gè)版式創(chuàng)建幻燈片頁:
slide?=?pptx.slides.add_slide(pptx.slide_layouts[0])
接下來可以通過 shape.placeholder_format.idx 方法獲取占位符編號,為了直觀直接在各自的占位符內(nèi)填寫自己的編號并輸出:
slide?=?pptx.slides.add_slide(pptx.slide_layouts[0])
for?shape?in?slide.placeholders:
????shape.text?=?str(shape.placeholder_format.idx)

弄清楚占位符編號后用 slide.placeholders[編號].text = 填寫的內(nèi)容 就可以完成內(nèi)容填寫。
由于本文是 400 份獎(jiǎng)狀產(chǎn)生在同一個(gè)文件中,因此是在循環(huán)體內(nèi)創(chuàng)建幻燈片頁并填寫,最后在循環(huán)體外保存:
for?row?in?sheet.rows:
????class_id?=?row[0].value
????name?=?row[1].value
????title?=?row[2].value
????print(class_id,?name,?title)
????slide?=?pptx.slides.add_slide(pptx.slide_layouts[0])
????slide.placeholders[10].text?=?f"{class_id}?班?{name}?小朋友:"
????slide.placeholders[11].text?=?"在2020-2021學(xué)年度第一學(xué)期獲得"
????slide.placeholders[12].text?=?f"“{title}”稱號。"
????slide.placeholders[13].text?=?"特發(fā)此證,以資鼓勵(lì)。"
????slide.placeholders[14].text?=?"太陽市幼兒園"
????slide.placeholders[15].text?=?"2021年1月"'
pptx.save(path?+?r'\results.pptx')
最終效果如下:
很快就成功生成了 400 個(gè)小朋友各自的獎(jiǎng)狀,需求完成,收工!和小姐姐喝下午茶去嘍!
本文使用的練習(xí)數(shù)據(jù)下載:https://pan.baidu.com/s/1NGtNg-idEt0Wu2JW0gwwgQ 提取碼:c5np
“早起Pythonn 推出的Python辦公自動(dòng)化系列,旨在用Python解決真實(shí)工作中的問題,如果你也有用相關(guān)需求但是無法解決,可以后臺回復(fù)自動(dòng)化添加早小起微信聯(lián)系。
”
