轉(zhuǎn)載請(qǐng)注明:陳熹 chenx6542@foxmail.com (簡(jiǎn)書(shū)號(hào):半為花間酒)
若公眾號(hào)內(nèi)轉(zhuǎn)載請(qǐng)聯(lián)系公眾號(hào):早起Python
這篇文章能學(xué)到的主要內(nèi)容:
openpyxl
讀取 Excel 文件python-pptx
寫入 PPT 文件- PPT 占位符相關(guān)知識(shí)
練習(xí)數(shù)據(jù):https://pan.baidu.com/s/1NGtNg-idEt0Wu2JW0gwwgQ 提取碼:c5np
需求描述
你是一名幼兒園老師,本學(xué)期即將結(jié)束你要給 400 個(gè)小朋友制作獎(jiǎng)狀,手上有一份名單 list.xlsx
和 PPT 模板 temp.pptx
:
現(xiàn)在要給每個(gè)小朋友都制作一個(gè)獎(jiǎng)狀千扔,你決定使用 Python 來(lái)實(shí)現(xiàn)
前置知識(shí)與邏輯梳理
完成本案例需要理解兩個(gè)概念:版式和占位符
一沸毁、版式
版式的選擇和設(shè)置操作如下圖柠硕。基本上幻燈片頁(yè)的添加是基于一個(gè)完整的版式,確定完了版式后再在上面添加內(nèi)容:
我們打開(kāi)需求模板 temp.pptx
后會(huì)發(fā)現(xiàn)沒(méi)有任何一頁(yè):
點(diǎn)擊創(chuàng)建后就會(huì)出現(xiàn)一個(gè)新的頁(yè)面,這個(gè)是我已解決在版式中預(yù)設(shè)好的:
仔細(xì)看會(huì)發(fā)現(xiàn)耳峦,在預(yù)覽狀態(tài)下是看不見(jiàn)模板上這些字的,同樣點(diǎn)擊輸入后也會(huì)發(fā)現(xiàn)字會(huì)不見(jiàn)焕毫。原因是這些文本框不是真實(shí)的形狀蹲坷,而是占位符
二驶乾、占位符
有了上面兩個(gè)概念的認(rèn)識(shí),我們就可以梳理創(chuàng)建 PPT 文件的邏輯:
代碼操作 PPT 創(chuàng)建文件的基本邏輯是:
- 創(chuàng)建一個(gè) PPT
- 從幻燈片母版中確定一個(gè)版式
- 在不同的占位符中填寫不同的內(nèi)容
明白了邏輯后又出現(xiàn)了一個(gè)新的問(wèn)題:我們的模板中有多個(gè)占位符循签,如何確定占位符并往相應(yīng)的占位符里填寫內(nèi)容级乐?
答案很簡(jiǎn)單,每個(gè)占位符都有自己的編號(hào)县匠,在代碼中通過(guò)占位符編號(hào)就能夠確定指定的占位符了风科,具體見(jiàn)代碼實(shí)操
代碼實(shí)操
首先我們讀取 list.xlsx
文件:
from openpyxl import load_workbook
path = r'C:\xxx' # 根據(jù)自己的情況填寫模板和名單所在的路徑
workbook = load_workbook(path + r'\list.xlsx')
sheet = workbook.active
獲取每個(gè)小朋友的信息的方法很簡(jiǎn)單,通過(guò) 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)
接下來(lái)是 PPT 部分的操作了腔召,在循環(huán)體外部要打開(kāi)模板:
(這里是看自己的需求杆查,本文中是將 400 個(gè)小朋友的獎(jiǎng)狀生成在 1 個(gè) PPT 文件中輸出,如果你想要輸出 400 份不同的文件臀蛛,就是在循環(huán)體內(nèi)部實(shí)例化以及保存了)
from pptx import Presentation
... # 之前打開(kāi) Excel 文件的代碼
pptx = Presentation(path + r'\temp.pptx')
然后就是以第一個(gè)版式創(chuàng)建幻燈片頁(yè):
slide = pptx.slides.add_slide(pptx.slide_layouts[0])
接下來(lái)可以通過(guò) shape.placeholder_format.idx
方法獲取占位符編號(hào)亲桦,為了直觀直接在各自的占位符內(nèi)填寫自己的編號(hào)并輸出:
slide = pptx.slides.add_slide(pptx.slide_layouts[0])
for shape in slide.placeholders:
shape.text = str(shape.placeholder_format.idx)
弄清楚占位符編號(hào)后用 slide.placeholders[編號(hào)].text = 填寫的內(nèi)容
就可以完成內(nèi)容填寫。由于本文是 400 份獎(jiǎng)狀產(chǎn)生在同一個(gè)文件中浊仆,因此是在循環(huán)體內(nèi)創(chuàng)建幻燈片頁(yè)并填寫客峭,最后在循環(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}”稱號(hào)。"
slide.placeholders[13].text = "特發(fā)此證抡柿,以資鼓勵(lì)舔琅。"
slide.placeholders[14].text = "太陽(yáng)市幼兒園"
slide.placeholders[15].text = "2021年1月"'
pptx.save(path + r'\results.pptx')
成功生成了 400 個(gè)小朋友各自的獎(jiǎng)狀,需求完成洲劣!