自動化辦公,非 Python 莫屬!python
從本篇文章開始,咱們繼續聊聊自動化辦公中另一個經常使用系列:PPTide
Python 操做 PPT 最強大的依賴庫是:python-pptx函數
因此,在開始操做以前,咱們須要在虛擬環境下安裝這個依賴庫字體
# 安裝依賴 pip3 install python-pptx
首先,咱們須要瞭解一個 PPT 文檔的頁面結構3d
一個 PPT 文檔對應一個 Presentation 對象code
一個 Presentation 包含多個 Slide 對象,每個 Slide 表明一個幻燈片對象
每一張幻燈片的內容都是由各類形狀 Shape 組成blog
其次,PPT 中的內容元素都是由各類形狀構成索引
好比:文字框、圖片、佔位符、表格、普通形狀等隊列
經過翻看源碼,發現他們都定義在 MSO_SHAPE_TYPE 類中
最後,咱們須要瞭解一下 PPT 中的 版式模板
使用 Presentation 對象的 屬性方法 slide_layouts 能夠獲取內置的 11 種母版樣式
# 使用Presentation獲取PPT內置的11種版式樣式 # 版式索引從0開始 slide_layout = presentation.slide_layouts[slide_style_index]
他們分別是:
Title Slide 標題幻燈片
Title and Content 標題和內容幻燈片
Section Header 節標題幻燈片
Two Content 兩欄內容幻燈片
Comparison 比較幻燈片
Title Only 僅標題的幻燈片
Blank 空白幻燈片
Content with Caption 內容和標題的幻燈片
Picture with Caption 圖片和標題的幻燈片
Title and Vertical Text 標題和豎排內容
Vertical Title and Text 豎排標題和文本
固然,也能夠在 Microsoft PPT / WPS 中查看對應母版的樣式
這裏補充一下,除了內置的版式樣式,也能夠經過佔位符 PlaceHolder 去自定義母版,知足一些特定的場景需求
一個 PPT 文件是由一個或多張幻燈片組成
1-1 那如何添加一張一張幻燈片呢?
這裏,只須要經過下面 3 個步驟
實例化一個 Presentation 對象
經過內置的版本樣式,新建一個版本樣式 Layout
經過版本樣式 Layout,添加一張幻燈片
def add_slide(presentation, slide_style_index): """ 在PPT文檔中,之內置的版式添加幻燈片 :param presentation:文檔對象 :param slide_style_index:版式索引 :return: """ # PPT版式樣式 # 內置有11種版式樣式 # 0:Title Slide 標題幻燈片 # 1:Title and Content 標題和內容 # 2:Section Header 節標題 # 3:Two Content 兩欄內容 # 4:Comparison 比較 # 5:Title Only 僅標題 # 6:Blank 空白 # 7:Content with Caption 內容和標題 # 8:Picture with Caption 圖片和標題 # 9:Title and Vertical Text 標題和豎排內容 # 10:Vertical Title and Text 豎排標題和文本 slide_layout = presentation.slide_layouts[slide_style_index] # 經過樣式Layout,新增一張幻燈片 slide = presentation.slides.add_slide(slide_layout) return slide # 1.1 新增幻燈片 slide1 = add_slide(self.presentation, 0) slide2 = add_slide(self.presentation, 1) slide3 = add_slide(self.presentation, 2) slide4 = add_slide(self.presentation, 3)
1-2 獲取已有的幻燈片或某一張幻燈片?
Presentation 對象的 slides 屬性 會返回當前 PPT 文檔中全部的幻燈片對象列表
def get_slides(presentation): """ 獲取全部的幻燈片 :param presentation: :return: """ # 全部幻燈片 slides = presentation.slides # 幻燈片數目 slide_num = len(slides) return slides, slide_num def get_slide(presentation, slide_index): """ 根據索引,獲取某一個幻燈片 :param presentation: :param slide_index:頁面索引,從0開始 :return: """ slides, slide_num = get_slides(presentation=presentation) return slides[slide_index] # 1.2.1 獲取所幻燈片 slides, slide_num = get_slides(self.presentation) print('現有幻燈片:', slides) print('幻燈片數目:', slide_num) # 1.2.2 獲取某一個幻燈片 slide = get_slide(self.presentation, 1) print(slide.shapes)
1-3 若是須要刪除某一張幻燈片,如何破?
這個也簡單,只須要先獲取目前幻燈片對象,而後使用下面方法移除便可
def del_slide(presentation, slide_index=0): """ 刪除某一張幻燈片 :param presentation: :param slide_index: 索引 :return: """ # 全部幻燈片的列表 slides = list(presentation.slides._sldIdLst) # 根據索引,刪除某一張幻燈片 presentation.slides._sldIdLst.remove(slides[slide_index]) # 1.3 根據索引,刪除PPT文檔中某一張幻燈片 # 好比:刪除第4張幻燈片 del_slide(self.presentation, 3)
咱們首先須要指定一個幻燈片對象 Slide,它能夠是已有的幻燈片,也能夠是新建的一張幻燈片
接着,使用幻燈片對象的 slide.shapes 屬性,獲取當前幻燈片中的全部形狀 Shape 組成的隊列
最後利用形狀隊列的下面這個函數添加一個文本框,函數返回值爲一個:文本框對象
add_textbox( left , top , width , height )
該函數參數分別爲:
left 左邊距
top 上邊距
width 文字框寬度
height 文字框高度
這裏須要引出另一個概念:文字形狀
PS:文字形狀便於在文字框中添加段落和設置樣式,經過「文本框對象」的屬性函數 text_frame 獲取
def insert_textbox(slide, left, top, width, height, unit=Inches): """ 幻燈片中添加文本框 :param unit: 單元,默認設置爲Inches :param slide: 幻燈片對象 :param left: 左邊距 :param top: 上邊距 :param width: 寬度 :param height: 高度 :return: """ # 文本框 textbox = slide.shapes.add_textbox(left=unit(left), top=unit(top), width=unit(width), height=unit(height)) # 文本框形狀 tf = textbox.text_frame return textbox, tf
爲了便於使用,我對幻燈片中插入文字框這一動做進行了一次封裝
長度單位默認設置爲:Inches,也能夠自定義爲釐米等單位
接下來,咱們來操做文字框及段落的常見操做
1-1 插入文本框,並設置默認段落內容
插入文本框的同時,文本框形狀對象會自帶一個段落,能夠對這個段落設置內容
# 二、往幻燈片中插入一個文本框,返回一個文本框對象和一個文本框形狀對象 textbox, tf = insert_textbox(slide, 8, 2, 10, 4, unit=Cm) # 2.1 默認的段落 paragraph_default = tf.paragraphs[0] paragraph_default.text = "設置段落默認的內容"
1-2 文本框中新增一個段落
查看源碼發現,文本框形狀對象是 TextFrame 的子類,所以可使用 TextFrame 類中的 add_paragraph() 函數添加一個新的段落
# 2.2 添加一個新的段落 paragraph_new = tf.add_paragraph() # 2.3 給段落設置內容 paragraph_new.text = "歡迎關注公衆號:AirPython\n每週分享 Python 原創技術乾貨!"
1-3 設置段落及文字樣式
和 Word 同樣,使用 python-pptx 一樣能夠設置 PPT 文檔的段落樣式
其中
對齊方式:對齊方式是針對段落的,只須要指定段落對象的 alignment 的屬性值便可
def set_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False, paragraph_alignment=PP_ALIGN.CENTER): """ 設置段落中文本的樣式,包含:字體名稱、顏色、大小、是否加粗、是否斜體 :param paragraph_alignment: 段落對齊方式 :param paragraph: :param font_name: :param font_color: :param font_size: :param font_bold: :param font_italic: :return: """ # 對齊方式 # 注意:對齊方式是針對段落的 paragraph.alignment = paragraph_alignment # 獲取段落中字體對象 font = paragraph.font # 設置字體樣式 set_font_style(font, font_name, font_color, font_size, font_bold, font_italic) return font
段落文字屬性:使用段落對象的 font 屬性獲取字體對象,接着設置字體名稱、大小、顏色、是否斜體、加粗
def set_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False): """ 設置字體樣式 :param font: :param font_name: :param font_color: :param font_size: :param font_bold: :param font_italic: :return: """ # 字體名稱 if font_name: font.name = font_name # 字體顏色 if font_color and len(font_color) == 3: font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2]) # 字體大小 if font_size != -1: font.size = Pt(font_size) # 是否加粗,默認不加粗 font.bold = font_bold # 是否傾斜,默認不傾斜 font.italic = font_italic
1-4 設置文字框的背景顏色
設置文字框背景顏色只須要 2 步
將形狀的填充類型設置爲純色
設置文字框的背景顏色
def set_widget_bg(widget, bg_rgb_color=None): """ 設置【文本框textbox/單元格/形狀】的背景顏色 :param widget:文本框textbox、單元格、形狀 :param bg_rgb_color:背景顏色值 :return: """ if bg_rgb_color and len(bg_rgb_color) == 3: # 一、將形狀填充類型設置爲純色 widget.fill.solid() # 二、設置文本框的背景顏色 widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2]) # 四、設置文字框的背景顏色 set_widget_bg(textbox, [0, 255, 0])
須要指出的是,該方法一樣適用於設置表格單元格、普通形狀的背景顏色
1-5 文本框的自動對齊
一旦文本框設置一段很長的文字,單行可能顯示不徹底
這時候,咱們只須要設置文字形狀的 word_wrap 值爲 True,則可讓文本框的文字自動換行顯示
# 五、設置文本框的文字自動對齊 tf.word_wrap = True
受限於篇幅,本篇文章僅聊到了 PPT 的結構、幻燈片管理、段落及文字;更多複雜操做、項目實戰,會在後面的文章中進行說明
要獲取所有源碼,關注公衆號「 AirPython 」,後臺回覆「 ppt 」便可得到所有源碼
若是你以爲文章還不錯,請你們 點贊、分享、留言下,由於這將是我持續輸出更多優質文章的最強動力!
推薦閱讀
最全總結 | 聊聊 Python 辦公自動化之 Excel(上)
最全總結 | 聊聊 Python 辦公自動化之 Excel(中)
最全總結 | 聊聊 Python 辦公自動化之 Excel(下)
最全總結 | 聊聊 Python 辦公自動化之 Word(上)