用 Python 自動化操作 PPT,看完這篇文章就夠了!

作者:超級大洋蔥 806

https://tangxing.blog.csdn.net/article/details/109568830

1.PPT 自動化能幹什麼?有什麼優勢?

  1. 使用 win32com 操作 ppt

官方文檔:https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.shape.copy

2.1 pip 安裝 win32com

pip install pypiwin32

由於我已經安裝過了,這裏提示已經安裝

2.2 win32com 複製 ppt 模板

有時候我們需要對 ppt 的模板進行復制,然後再添加相應內容,由於 python-pptx 對複製模板也沒有很好的支持(我沒找到~ 憂傷),所以我們用 win32com 對模板頁進行復制,然後再用 python-pptx 增加 ppt 內容。

參考官方文檔:https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.slide.copy

先準備好一張模板: 2.2 win32 ppt 測試. pptx

示例代碼:

import win32com
from win32com.client import Dispatch
import os

ppt = Dispatch('PowerPoint.Application')
# 或者使用下面的方法,使用啓動獨立的進程:
# ppt = DispatchEx('PowerPoint.Application')

# 如果不聲明以下屬性,運行的時候會顯示的打開word
ppt.Visible = 1  # 後臺運行
ppt.DisplayAlerts = 0  # 不顯示,不警告

# 創建新的PowerPoint文檔
# pptSel = ppt.Presentations.Add() 
# 打開一個已有的PowerPoint文檔
pptSel = ppt.Presentations.Open(os.getcwd() + "\\" + "2.2 win32 ppt測試.pptx")

# 複製模板頁
pptSel.Slides(1).Copy()
#設置需要複製的模板頁數
pageNums = 10
# 粘貼模板頁
for i in range(pageNums):
    pptSel.Slides.Paste()

# pptSel.Save()  # 保存
pptSel.SaveAs(os.getcwd() + "\\" + "win32_copy模板.pptx")  # 另存爲
pptSel.Close()  # 關閉 PowerPoint 文檔
ppt.Quit()  # 關閉 office

效果如下:

3.python-pptx 創建 PPT、複製頁面

官方文檔:https://python-pptx.readthedocs.io/en/latest/

3.1 pip 安裝 python-pptx

安裝方法:

pip install python-pptx

我已經安裝過了,故提示已經安裝

3.2 python-pptx 複製頁面

使用 python-pptx 進行復制沒有找到合適的方法,有以下兩種解決辦法:

  1. 使用 win32com 對 ppt 模板進行復制

  2. 增加模板 ppt 數量,然後使用 python-pptx 對不需要的模板頁進行刪減操作

3.3 python-pptx 刪除頁面

python-pptx 多頁待刪除模板. pptx:

示例代碼:

from pptx import Presentation

# 刪除某一頁ppt
def del_slide(prs,index):
    slides = list(prs.slides._sldIdLst)
    prs.slides._sldIdLst.remove(slides[index])

# 3.3 python-pptx 刪除頁面
def fun3_3():
    # 打開ppt
    ppt = Presentation('python-pptx 多頁待刪除模板.pptx')

    # 獲取所有頁
    slides = ppt.slides
    number_pages = len(slides)
    print("刪除前ppt一共",number_pages,"頁面")

    # 設置需要刪除的頁面數量
    delPageNums = 3
    # 進行刪除操作(每次都刪除第一張ppt)
    for index in range(delPageNums):
        del_slide(ppt,0)

    # 再次獲取所有頁
    slides = ppt.slides
    number_pages = len(slides)
    print("刪除後ppt一共",number_pages,"頁面")

    ppt.save('python-pptx 多頁已刪除模板.pptx')
    print('生成完畢')

if __name__ == '__main__':
    fun3_3()

執行效果:

3.4 新建頁面

示例代碼:

from pptx import Presentation

# 新建ppt
ppt = Presentation()

# 新建頁面
slide = ppt.slides.add_slide(ppt.slide_layouts[0])

# 保存ppt
ppt.save('新建ppt.pptx')

效果如下:

4.python-pptx 插入文字、表格、形狀並設置樣式

模板 ppt:

接下來,我們就在此模板上進行我們的操作演示

4.1 python-pptx 添加文字並設置樣式

4.1.1 添加單行文字與多行文字

示例代碼:

from pptx import Presentation
from pptx.util import Pt,Cm

# 打開已存在ppt
ppt = Presentation('4. python-pptx操作模板.pptx')

# 設置添加到當前ppt哪一頁
n_page = 0
singleLineContent = "我是單行內容"
multiLineContent = \
"""我是多行內容1
我是多行內容2
我是多行內容3
"""

# 獲取需要添加文字的頁面對象
slide = ppt.slides[n_page]

# 添加單行內容

# 設置添加文字框的位置以及大小
left, top, width, height = Cm(16.9), Cm(1), Cm(12), Cm(1.2)
# 添加文字段落
new_paragraph1 = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame
# 設置段落內容
new_paragraph1.paragraphs[0].text = singleLineContent
# 設置文字大小
new_paragraph1.paragraphs[0].font.size = Pt(15)


# 添加多行

# 設置添加文字框的位置以及大小
left, top, width, height = Cm(16.9), Cm(3), Cm(12), Cm(3.6)
# 添加文字段落
new_paragraph2 = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame
# 設置段落內容
new_paragraph2.paragraphs[0].text = multiLineContent
# 設置文字大小
new_paragraph2.paragraphs[0].font.size = Pt(15)


# 保存ppt
ppt.save('4.1 添加文字.pptx')

效果如下:

4.1.2 設置文字框樣式與文字樣式

示例代碼:

from pptx import Presentation
from pptx.util import Pt,Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import MSO_VERTICAL_ANCHOR, PP_PARAGRAPH_ALIGNMENT
from pptx.enum.text import PP_ALIGN


# 打開已存在ppt
ppt = Presentation('4. python-pptx操作模板.pptx')

# 獲取需要添加文字的頁面對象
slide = ppt.slides[0]

# 設置添加文字框的位置以及大小
left, top, width, height = Cm(16.9), Cm(1), Cm(12), Cm(1.2)
# 添加文字框 slide.shapes.add_textbox(距離左邊,距離頂端,寬度,高度)
textBox = slide.shapes.add_textbox(left=left, top=top, width=width, height=height)

# 調整文本框背景顏色
textBoxFill = textBox.fill
textBoxFill.solid()  # 純色填充
textBoxFill.fore_color.rgb = RGBColor(187, 255, 255)

# 文本框邊框樣式調整
line = textBox.line
line.color.rgb = RGBColor(0, 255, 0)
line.width = Cm(0.1)

# 獲取文本框對象
tf = textBox.text_frame

# 文本框樣式調整
tf.margin_bottom = Cm(0.1)  # 下邊距
tf.margin_left = 0  # 左邊距
tf.vertical_anchor = MSO_VERTICAL_ANCHOR.BOTTOM  # 對齊文本方式:底端對齊
tf.word_wrap = True  # 文本框的文字自動對齊

# 設置內容
tf.paragraphs[0].text = '這是一段文本框裏的文字'

# 字體樣式調整
tf.paragraphs[0].alignment = PP_ALIGN.CENTER  # 對齊方式
tf.paragraphs[0].font.name = '微軟雅黑'  # 字體名稱
tf.paragraphs[0].font.bold = True  # 是否加粗
tf.paragraphs[0].font.italic = True  # 是否斜體
tf.paragraphs[0].font.color.rgb = RGBColor(255, 0, 0)  # 字體顏色
tf.paragraphs[0].font.size = Pt(20)  # 字體大小

# 保存ppt
ppt.save('4.1.2 設置文字框與字體樣式.pptx')

效果如下:

代碼詳解

  CENTER
  	Center align
  DISTRIBUTE
  	Evenly distributes e.g. Japanese characters from left to right within a line
  JUSTIFY
  	Justified, i.e. each line both begins and ends at the margin with spacing between words adjusted such that the line exactly fills the width of the paragraph.
  JUSTIFY_LOW
  	Justify using a small amount of space between words.
  LEFT
  	Left aligned
  RIGHT
  	Right aligned
  THAI_DISTRIBUTE
  	Thai distributed
  MIXED
  	Return value only; indicates multiple paragraph alignments are present in a set of paragraphs.
  # 保存ppt
  ppt.save('4.1.2 設置文字框與字體樣式.pptx')

4.2 python-pptx 添加表格並設置樣式

示例代碼:

from pptx import Presentation
from pptx.util import Pt,Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import MSO_ANCHOR
from pptx.enum.text import PP_ALIGN


# 設置需要添加到哪一頁
n_page = 0

# 打開已存在ppt
ppt = Presentation('4. python-pptx操作模板.pptx')

# 獲取slide對象
slide = ppt.slides[n_page]

# 設置表格位置和大小
left, top, width, height = Cm(6), Cm(12), Cm(13.6), Cm(5)
# 表格行列數,和大小
shape = slide.shapes.add_table(6, 7, left, top, width, height)
# 獲取table對象
table = shape.table

# 設置列寬
table.columns[0].width = Cm(3)
table.columns[1].width = Cm(2.3)
table.columns[2].width = Cm(2.3)
table.columns[3].width = Cm(1.3)
table.columns[4].width = Cm(1.3)
table.columns[5].width = Cm(1.3)
table.columns[6].width = Cm(2.1)

# 設置行高
table.rows[0].height = Cm(1)

# 合併首行
table.cell(0, 0).merge(table.cell(0, 6))

# 填寫標題
table.cell(1, 0).text = "時間"
table.cell(1, 1).text = "階段"
table.cell(1, 2).text = "執行用例"
table.cell(1, 3).text = "新增問題"
table.cell(1, 4).text = "問題總數"
table.cell(1, 5).text = "遺留問題"
table.cell(1, 6).text = "遺留致命/" \
                        "嚴重問題"

# 填寫變量內容
table.cell(0, 0).text = "產品1"
content_arr = [["4/30-5/14""DVT1""20""12""22""25""5"],
               ["5/15-5/21""DVT1""25""32""42""30""8"],
               ["5/22-6/28""DVT1""1""27""37""56""12"],
               ["5/22-6/28""DVT1""1""27""37""56""12"]]

# 修改表格樣式
for rows in range(6):
    for cols in range(7):
        # Write column titles
        if rows == 0:
            # 設置文字大小
            table.cell(rows, cols).text_frame.paragraphs[0].font.size = Pt(15)
            # 設置字體
            table.cell(rows, cols).text_frame.paragraphs[0].font.name = '微軟雅黑'
            # 設置文字顏色
            table.cell(rows, cols).text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
            # 設置文字左右對齊
            table.cell(rows, cols).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
            # 設置文字上下對齊
            table.cell(rows, cols).vertical_anchor = MSO_ANCHOR.MIDDLE
            # 設置背景爲填充
            table.cell(rows, cols).fill.solid()
            # 設置背景顏色
            table.cell(rows, cols).fill.fore_color.rgb = RGBColor(34, 134, 165)
        elif rows == 1:
            table.cell(rows, cols).text_frame.paragraphs[0].font.size = Pt(10)
            table.cell(rows, cols).text_frame.paragraphs[0].font.name = '微軟雅黑'  # 字體名稱
            table.cell(rows, cols).text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 0, 0)
            table.cell(rows, cols).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
            table.cell(rows, cols).vertical_anchor = MSO_ANCHOR.MIDDLE
            table.cell(rows, cols).fill.solid()
            table.cell(rows, cols).fill.fore_color.rgb = RGBColor(204, 217, 225)
        else:
            table.cell(rows, cols).text = content_arr[rows - 2][cols]
            table.cell(rows, cols).text_frame.paragraphs[0].font.size = Pt(10)
            table.cell(rows, cols).text_frame.paragraphs[0].font.name = '微軟雅黑'  # 字體名稱
            table.cell(rows, cols).text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 0, 0)
            table.cell(rows, cols).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
            table.cell(rows, cols).vertical_anchor = MSO_ANCHOR.MIDDLE
            table.cell(rows, cols).fill.solid()
            table.cell(rows, cols).fill.fore_color.rgb = RGBColor(204, 217, 225)

ppt.save('4.2 python-pptx 添加表格並設置樣式.pptx')

效果如下:

4.3 python-pptx 添加圖表並設置樣式

示例代碼:

from pptx import Presentation
from pptx.util import Pt,Cm
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE


# 設置需要添加到哪一頁
n_page = 0

# 打開已存在ppt
ppt = Presentation('4. python-pptx操作模板.pptx')

# 獲取slide對象
slide = ppt.slides[n_page]

# 初始化圖表
chart_data = ChartData()

# 填充需要添加的內容
content_arr = [["4/30-5/14""DVT1""20""12""22""25""5"],
               ["5/15-5/21""DVT1""25""32""42""30""8"],
               ["5/22-6/28""DVT1""1""27""37""56""12"],
               ["5/22-6/28""DVT1""1""27""37""56""12"]]

# 填充圖表
chart_data.categories = [content_arr[0][0], content_arr[1][0], content_arr[2][0], content_arr[3][0]]
chart_data.add_series("問題總數"(content_arr[0][4], content_arr[1][4], content_arr[2][4], content_arr[3][4]))
chart_data.add_series("遺留問題總數"(content_arr[0][5], content_arr[1][5], content_arr[2][5], content_arr[3][5]))
chart_data.add_series("遺留致命嚴重\n問題總數"(content_arr[0][6], content_arr[1][6], content_arr[2][6], content_arr[3][6]))

# 設置位置
left, top, width, height = Cm(6), Cm(10), Cm(16.1), Cm(7.5)
# 添加圖表
chart = slide.shapes.add_chart(
    XL_CHART_TYPE.LINE, left, top, width, height, chart_data
).chart


chart.has_legend = True
chart.legend.include_in_layout = False
# chart.series[0].smooth = True # 是否平滑
# chart.series[1].smooth = True
# chart.series[2].smooth = True
chart.font.size = Pt(10)  # 文字大小

ppt.save('4.3 python-pptx 添加圖表並設置樣式.pptx')
print('折線圖添加完成')

效果如下:

**其它圖表可參考:**https://www.cnblogs.com/adam012019/p/11348938.html

4.4 python-pptx 添加形狀並設置樣式

這裏的形狀可以是這些:

形狀別名可以再這裏查看:

https://docs.microsoft.com/zh-cn/office/vba/api/Office.MsoAutoShapeType

並對應這裏,找到正確的枚舉名:

https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoShapeType.html#msoautoshapetype

程序示例:

from pptx import Presentation
from pptx.util import Pt,Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE


# 設置需要添加到哪一頁
n_page = 0

# 打開已存在ppt
ppt = Presentation('4. python-pptx操作模板.pptx')

# 獲取slide對象
slide = ppt.slides[n_page]

# 添加矩形
# 設置位置以及大小
left, top, width, height = Cm(2.5), Cm(4.5), Cm(30), Cm(0.5)
# 添加形狀
rectangle = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
# 設置背景填充
rectangle.fill.solid()
# 設置背景顏色
rectangle.fill.fore_color.rgb = RGBColor(34, 134, 165)
# 設置邊框顏色
rectangle.line.color.rgb = RGBColor(34, 134, 165)

# 添加正三角+文字(正常)
left, top, width, height = Cm(3), Cm(5.1), Cm(0.5), Cm(0.4)
slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_EXTRACT, left, top, width, height)
new_paragraph = slide.shapes.add_textbox(left=left - Cm(0.95)top=top + Cm(0.4)width=Cm(2.4),height=Cm(1.1)).text_frame
content = """2020/01/05
內容1"""
new_paragraph.paragraphs[0].text = content
new_paragraph.paragraphs[0].font.size = Pt(10)  # 文字大小
new_paragraph.paragraphs[0].alignment = PP_ALIGN.CENTER

# 添加正三角+文字(延期)
left, top, width, height = Cm(9), Cm(5.1), Cm(0.5), Cm(0.4)
extract = slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_EXTRACT, left, top, width, height)
extract.fill.solid()
extract.fill.fore_color.rgb = RGBColor(255, 0, 0)
extract.line.color.rgb = RGBColor(255, 0, 0)

new_paragraph = slide.shapes.add_textbox(left=left - Cm(0.95)top=top + Cm(0.4)width=Cm(2.4),height=Cm(1.1)).text_frame
content = """2020/01/05
內容2"""
new_paragraph.paragraphs[0].text = content  # 文字內容
new_paragraph.paragraphs[0].font.size = Pt(10)  # 文字大小
new_paragraph.paragraphs[0].font.color.rgb = RGBColor(255, 0, 0)    # 文字顏色
new_paragraph.paragraphs[0].alignment = PP_ALIGN.CENTER # 文字水平對齊方式

# 添加倒三角+間隔條+文字
left, top, width, height = Cm(5), Cm(4), Cm(0.5), Cm(0.4)
slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_MERGE, left, top, width, height)
gap = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left + Cm(0.2), top + Cm(0.5), Cm(0.05), Cm(0.5))
gap.fill.solid()
gap.fill.fore_color.rgb = RGBColor(255, 255, 255)
gap.line.color.rgb = RGBColor(255, 255, 255)

new_paragraph = slide.shapes.add_textbox(left=left - Cm(0.95)top=top - Cm(1)width=Cm(2.4),height=Cm(1.1)).text_frame
content = """2020/01/05
內容3"""
new_paragraph.paragraphs[0].text = content
new_paragraph.paragraphs[0].font.size = Pt(10)  # 文字大小
new_paragraph.paragraphs[0].alignment = PP_ALIGN.CENTER

# 添加當前時間圖形
left, top, width, height = Cm(7), Cm(4), Cm(0.5), Cm(0.4)
now = slide.shapes.add_shape(MSO_SHAPE.DOWN_ARROW, left, top, width, height)
now.fill.solid()
now.fill.fore_color.rgb = RGBColor(254, 152, 47)
now.line.color.rgb = RGBColor(254, 152, 47)

ppt.save('4.4 python-pptx 添加形狀並設置樣式.pptx')
print('進度條添加完成')

效果如下:

5.seaborn 繪圖庫介紹與使用

官方網址:http://seaborn.pydata.org/

5.1 pip 安裝 seaborn

pip install seaborn

效果如下(我的顯示已安裝):

使用:

import seaborn as sns 
# 或者
import seaborn

使用數據集:

import seaborn as sns

tips = sns.load_dataset("tips")

無法連接:

下載數據集:

https://github.com/mwaskom/seaborn-data

放到本地:

運行程序:

import seaborn as sns

tips = sns.load_dataset("tips")

print("tips:",tips)
print("ype(tips):",type(tips))

效果如下:

參考博客:

《解決 seaborn 導入數據集出現錯誤》

https://blog.csdn.net/qq_33828738/article/details/107044082

5.2 seaborn 繪製折線圖

5.2.1 通過 relplot 來實現

示例代碼:

import matplotlib.pyplot as plt
import seaborn as sns

# 數據集
data = sns.load_dataset("fmri")
print(data.head())
# 繪畫折線圖
sns.relplot(x="timepoint"y="signal"kind="line"data=data, ci=None)
# 顯示
plt.show()

效果如下:

5.2.2 通過 lineplot() 函數來實現

示例代碼:

import matplotlib.pyplot as plt
import seaborn as sns

# 數據集
data = sns.load_dataset("fmri")
print(data.head())
# 繪畫折線圖:
sns.lineplot(x="timepoint"y="signal"data=data, ci=95)
# 顯示
plt.show()

效果如下:

5.2.3 多座標效果

示例代碼:

import matplotlib.pyplot as plt
import seaborn as sns

# 數據集
data = sns.load_dataset("fmri")
print(data.head())

# 繪畫折線圖
f, axes = plt.subplots(nrows=1, ncols=2, figsize=(14, 6))

sns.lineplot(x="timepoint"y="signal"data=data, ci=None, ax=axes[0])
sns.lineplot(x="timepoint"y="signal"hue="region"style="event"data=data, ci=None, ax=axes[1])
plt.show()

效果如下:

5.2.4 保存生成的圖片

注意:需要在 plt.show() 之前調用 savefig,不然保存的圖片就是一片空白

plt.savefig('seaborn生成的圖片.png')

plt.show()

效果如下:

5.3 seaborn replot 繪製散點圖

示例代碼:

import matplotlib.pyplot as plt
import seaborn as sns

# 準備數據:自帶數據集
tips = sns.load_dataset("tips")
print(tips.head())

# 繪畫散點圖
sns.relplot(x="total_bill"y="tip"data=tips, hue="sex"style="smoker"size="size")
sns.relplot(x="total_bill"y="tip"data=tips, hue="sex"style="smoker"size="size"sizes=(100, 100))
# 顯示
plt.show()

效果如下:

5.4 seaborn barplot 繪製柱狀圖

示例代碼:

import matplotlib.pyplot as plt
import seaborn as sns

# 顯示正負號與中文不顯示問題
plt.rcParams['axes.unicode_minus'] = False
sns.set_style('darkgrid'{'font.sans-serif':['SimHei''Arial']})

# 去除部分warning
import warnings
warnings.filterwarnings('ignore')

plt.figure(dpi=150)
x = ['金融','農業','製造業','新能源']
y = [164, 86, 126, 53]
sns.barplot(x, y)

plt.show()

效果如下:

調換橫縱座標位置即可

plt.figure(dpi=150)
x = ['金融','農業','製造業','新能源']
y = [164, 86, 126, 53]
sns.barplot(y,x )
plt.show()

6.python-pptx 插入圖片

前提條件:

示例代碼:

from pptx import Presentation
from pptx.util import Pt,Cm

# 打開已存在ppt
ppt = Presentation('6.python-pptx操作模板.pptx')

# 設置添加到當前ppt哪一頁
n_page = 0

# 獲取需要添加文字的頁面對象
slide = ppt.slides[n_page]

# 設置待添加的圖片
img_name  = 'seaborn生成的圖片.png'
# 設置位置
left, top, width, height = Cm(6), Cm(6), Cm(20), Cm(9)
# 進行添加
slide.shapes.add_picture(image_file=img_name,left=left,top=top,width=width,height=height)

# 保存ppt
ppt.save('6.python-pptx 插入圖片.pptx')

效果如下:

7.python-pptx 讀取數據

前提條件:

準備好一張有內容的 ppt

示例代碼:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE

# 打開待讀取的ppt文件
ppt = Presentation('研發管理部檢測部週報2020-09-17.pptx')

# 獲取第0張
slide0 = ppt.slides[0]

# 遍歷所有內容
for shape in slide0.shapes:
    # 打印shape名稱
    print(shape.shape_type)
    # 判斷是否爲表格
    if shape.shape_type == MSO_SHAPE_TYPE.TABLE:
        #獲取表格行
        for row in shape.table.rows:
            for cell in row.cells:
                print(cell.text_frame.text)

效果如下:

將當前幻燈片頁面中的對象名稱和表格內容全部打印出來了,反之,我們對其進行復制,就是寫操作。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/azHw5o9DAAaGJapRBHtFRQ