使用Python-pptx?告別繁瑣的幻燈片制作
Python自動化:python-pptx 批量生成幻燈片
需求分析
最近遇到了制作 PPT 報告的任務(wù),前期收集整理后的表格數(shù)據(jù)長這樣:

隨后要基于上述數(shù)據(jù)制作 PPT 報告,幾十頁的幻燈片都是下圖的格式:

Well, my coding fingers got quite itchy.??
這種繁瑣的手動制作幻燈片還是交給 Python 來自動完成吧!Python 中已有第三方庫很好地支持 PowerPoint ??
python-pptx 介紹
python-pptx是用于創(chuàng)建和更新 PowerPoint(.pptx)文件的 Python 庫。
其用途大致如下:
- 典型的是從數(shù)據(jù)庫內(nèi)容生成自定義的可用于演示的工程狀態(tài)報告,可通過單擊 Web 應(yīng)用程序中的鏈接下載該演示文稿。
- 用于對演示文稿庫進行批量更新。
- 自動化制作對于人工操作繁瑣的幻燈片。
由于開發(fā)團隊的辛勤維護,目前已具有以下功能:
- 打開、讀取、創(chuàng)建、保存演示文稿(.pptx文件)
- 添加幻燈片
- 填充文本占位符,例如創(chuàng)建項目符號幻燈片
- 添加圖像并調(diào)整位置和尺寸
- 添加文本框并調(diào)整文本的字體、大小和粗體
- 添加表格
- 添加形狀,如多邊形、流程圖形狀等
- 添加圖表,如柱形圖、條形圖、折線圖和餅圖等
- 訪問和修改元素屬性,例如標題、主題等
- ……(更多功能開發(fā)ing)
python-pptx 安裝
python-pptx 托管在 PyPI 上,可以很方便地用 pip 安裝:
pip install python-pptx
- 支持 Python 2.6, 2.7, 3.3, 3.4, 3.6(測試 3.7 能正常安裝和簡單使用,是否會有使用異常尚未知)本文代碼運行環(huán)境為 Python 3.6。
- 依賴庫會自動安裝:lxml、Pillow、XlsxWriter
Hello World! 示例
成功安裝后,運行以下示例代碼,體驗一下效果:
# 導(dǎo)包
from pptx import Presentation
# 創(chuàng)建空白演示文稿
prs = Presentation()
# 添加標題布局的幻燈片
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
# 設(shè)置標題和副標題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"
# 保存
prs.save('test.pptx')

更多用例請移步Getting Started
后面有空我也會整理一下學習 python-pptx 的代碼筆記
需求實現(xiàn)
有了 python-pptx 的加持,要實現(xiàn)文章一開始的需求就容易多了,簡單分為以下幾步:
- 讀取 Excel 數(shù)據(jù)(并預(yù)處理)—— 本例使用 pandas庫讀取 news.xlsx文件
- 創(chuàng)建空白演示文稿(并添加封面幻燈片)
- 依據(jù)數(shù)據(jù)循環(huán)添加幻燈片并設(shè)置文本格式(這一步是重點也是難點,詳細說明參考代碼注釋)
- 保存演示文稿
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pptx import Presentation
from pptx.util import Pt
import pandas as pd
class WritePowerPoint:
def __init__(self, ppt_name, input_excel, title_cover, subtitle):
self.ppt_name = ppt_name
self.input_excel = input_excel
self.title_cover = self.title_per_page = title_cover
self.subtitle_cover = subtitle
# 創(chuàng)建空白演示文稿
self.prs = Presentation()
def add_cover(self):
# 添加封面布局幻燈片
slide_layout_cover = self.prs.slide_layouts[0]
slide = self.prs.slides.add_slide(slide_layout_cover)
# 設(shè)置標題和副標題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = self.title_cover
subtitle.text = self.subtitle_cover
def add_slide(self, line2_texts):
# 添加布局5幻燈片
slide_layout = self.prs.slide_layouts[5]
slide = self.prs.slides.add_slide(slide_layout)
shapes = slide.shapes
# 設(shè)置標題:內(nèi)容、位置、字體、大小等格式
title_shape = shapes.title
title_shape.text = self.title_per_page
title_shape.left, title_shape.top = Pt(32), Pt(22)
title_shape.width, title_shape.height = Pt(660), Pt(50)
tf0 = title_shape.text_frame
p0 = tf0.paragraphs[0]
p0.font.name = '微軟雅黑'
p0.font.size = Pt(24)
# 添加文本框
left, top, width, height = Pt(32), Pt(82), Pt(665), Pt(396)
text_box = slide.shapes.add_textbox(left, top, width, height)
tf = text_box.text_frame
def add_paragraph_texts(texts):
print(texts[0])
for i, text in enumerate(texts[:-1]): # 最后的網(wǎng)址作為超鏈接
p = tf.add_paragraph()
p.text = text
if i == len(texts) - 2:
run = p.add_run()
run.text = '查看更多'
run.hyperlink.address = texts[-1] # 寫入超鏈接
tf.add_paragraph()
# 在文本框中添加內(nèi)容
for lst in line2_texts:
add_paragraph_texts(lst)
def run(self):
# 讀取 Excel 數(shù)據(jù)并進行預(yù)處理
df = pd.read_excel(self.input_excel)
df['發(fā)布機構(gòu)'] = '發(fā)布機構(gòu):' + df['發(fā)布機構(gòu)']
df['發(fā)布時間'] = '發(fā)布時間:' + df['發(fā)布時間']
df['關(guān)鍵詞'] = '關(guān)鍵詞:' + df['關(guān)鍵詞']
# 添加封面幻燈片
self.add_cover()
# 添加重復(fù)格式的幻燈片,每頁寫 2 條數(shù)據(jù)
for i in df.index[::2]:
self.add_slide([df.loc[i, :].tolist(), df.loc[i+1, :].tolist()])
# 保存
self.prs.save(self.ppt_name)
if __name__ == '__main__':
wpt = WritePowerPoint('news.pptx', 'news.xlsx', 'News Briefs', '2020/4/5')
wpt.run()
代碼運行后便可得到若干頁的 news.pptx:


代碼中還可以加入更多的文本格式設(shè)置代碼,美化幻燈片:

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
全網(wǎng)最簡約的Anaconda+Python3.7安裝教程Win10
這篇文章主要介紹了全網(wǎng)最簡約的Anaconda+Python3.7安裝教程Win10,圖文講解全流程安裝方法,還不會的小伙伴快來看看吧2023-03-03
使用python實現(xiàn)strcmp函數(shù)功能示例
這篇文章主要介紹了使用python實現(xiàn)strcmp函數(shù)功能的示例,需要的朋友可以參考下2014-03-03
Python數(shù)據(jù)庫sqlite3圖文實例詳解
SQLite是一個進程內(nèi)的庫,實現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的SQL數(shù)據(jù)庫引擎,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)庫sqlite3的相關(guān)資料,需要的朋友可以參考下2022-09-09
Django用戶注冊并自動關(guān)聯(lián)到某數(shù)據(jù)表條目的實現(xiàn)步驟
當一個新用戶注冊并且你想要自動關(guān)聯(lián)到特定的Box條目(假設(shè)其ID為1)時,下面給大家分享完整實現(xiàn)流程和步驟,對Django關(guān)聯(lián)數(shù)據(jù)表條目實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧2017-04-04
Python爬蟲報錯<response [406]>(已解決)
本文主要介紹了Python爬蟲報錯<response [406]>,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02
Python數(shù)據(jù)讀寫之Python讀寫CSV文件
這篇文章主要介紹了Python數(shù)據(jù)讀寫之Python讀寫CSV文件,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06
PyTorch中Tensor的數(shù)據(jù)統(tǒng)計示例
今天小編就為大家分享一篇PyTorch中Tensor的數(shù)據(jù)統(tǒng)計示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法
今天小編就為大家分享一篇Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

