1. 前言
自動化辦公誓酒,非 Python 莫屬咖为!
從本篇文章開始柒凉,我們繼續(xù)聊聊自動化辦公中另外一個常用系列:PPT
2. 準(zhǔn)備一下
Python 操作 PPT 最強(qiáng)大的依賴庫是:python-pptx
所以苞笨,在開始操作之前债朵,我們需要在虛擬環(huán)境下安裝這個依賴庫
# 安裝依賴pip3install python-pptx
3. PPT 結(jié)構(gòu)
首先子眶,我們需要了解一個 PPT 文檔的頁面結(jié)構(gòu)
正在上傳... 取消
一個 PPT 文檔對應(yīng)一個 Presentation 對象
一個 Presentation 包含多個 Slide 對象,每一個 Slide 代表一個幻燈片
每一張幻燈片的內(nèi)容都是由各種形狀 Shape 組成
其次序芦,PPT 中的內(nèi)容元素都是由各種形狀構(gòu)成
比如:文字框臭杰、圖片、占位符谚中、表格渴杆、普通形狀等
通過翻看源碼,發(fā)現(xiàn)他們都定義在 MSO_SHAPE_TYPE? 類中
正在上傳... 取消
最后藏杖,我們需要了解一下 PPT 中的 版式模板
使用 Presentation 對象的 屬性方法 slide_layouts 可以獲取內(nèi)置的 11 種母版樣式
# 使用Presentation獲取PPT內(nèi)置的11種版式樣式# 版式索引從0開始slide_layout= presentation.slide_layouts[slide_style_index]
他們分別是:
Title Slide 標(biāo)題幻燈片
Title and Content? ? 標(biāo)題和內(nèi)容幻燈片
Section Header? ? 節(jié)標(biāo)題幻燈片
Two Content? ? 兩欄內(nèi)容幻燈片
Comparison? ? 比較幻燈片
Title Only? ? 僅標(biāo)題的幻燈片
Blank? ? 空白幻燈片
Content with Caption? ? 內(nèi)容和標(biāo)題的幻燈片
Picture with Caption? ? 圖片和標(biāo)題的幻燈片
Title and Vertical Text 標(biāo)題和豎排內(nèi)容
Vertical Title and Text 豎排標(biāo)題和文本
當(dāng)然,也可以在 Microsoft PPT / WPS 中查看對應(yīng)母版的樣式
這里補(bǔ)充一下脉顿,除了內(nèi)置的版式樣式蝌麸,也可以通過占位符 PlaceHolder 去自定義母版,滿足一些特定的場景需求
4. 幻燈片管理
一個 PPT 文件是由一個或多張幻燈片組成
1-1? 那如何添加一張一張幻燈片呢艾疟?
這里来吩,只需要通過下面 3 個步驟
實例化一個 Presentation 對象
通過內(nèi)置的版本樣式,新建一個版本樣式 Layout
通過版本樣式 Layout蔽莱,添加一張幻燈片
defadd_slide(presentation, slide_style_index):"""
? ? 在PPT文檔中弟疆,以內(nèi)置的版式添加幻燈片
? ? :param presentation:文檔對象
? ? :param slide_style_index:版式索引
? ? :return:
? ? """# PPT版式樣式# 內(nèi)置有11種版式樣式# 0:Title Slide 標(biāo)題幻燈片# 1:Title and Content? 標(biāo)題和內(nèi)容# 2:Section Header? 節(jié)標(biāo)題# 3:Two Content? 兩欄內(nèi)容# 4:Comparison? 比較# 5:Title Only? 僅標(biāo)題# 6:Blank? 空白# 7:Content with Caption? 內(nèi)容和標(biāo)題# 8:Picture with Caption? 圖片和標(biāo)題# 9:Title and Vertical Text? 標(biāo)題和豎排內(nèi)容# 10:Vertical Title and Text? 豎排標(biāo)題和文本slide_layout = presentation.slide_layouts[slide_style_index]# 通過樣式Layout,新增一張幻燈片slide = presentation.slides.add_slide(slide_layout)returnslide# 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 屬性 會返回當(dāng)前 PPT 文檔中所有的幻燈片對象列表
defget_slides(presentation):"""
? ? 獲取所有的幻燈片
? ? :param presentation:
? ? :return:
? ? """# 所有幻燈片slides = presentation.slides# 幻燈片數(shù)目slide_num =len(slides)returnslides, slide_numdefget_slide(presentation, slide_index):"""
? ? 根據(jù)索引怠苔,獲取某一個幻燈片
? ? :param presentation:
? ? :param slide_index:頁面索引,從0開始
? ? :return:
? ? """slides, slide_num = get_slides(presentation=presentation)returnslides[slide_index]# 1.2.1 獲取所幻燈片slides, slide_num = get_slides(self.presentation)print('現(xiàn)有幻燈片:', slides)print('幻燈片數(shù)目:', slide_num)# 1.2.2 獲取某一個幻燈片slide = get_slide(self.presentation,1)print(slide.shapes)
1-3? 如果需要刪除某一張幻燈片仪糖,如何破柑司?
這個也簡單,只需要先獲取目前幻燈片對象锅劝,然后使用下面方法移除即可
defdel_slide(presentation, slide_index=0):"""
? ? 刪除某一張幻燈片
? ? :param presentation:
? ? :param slide_index: 索引
? ? :return:
? ? """# 所有幻燈片的列表slides =list(presentation.slides._sldIdLst)# 根據(jù)索引攒驰,刪除某一張幻燈片presentation.slides._sldIdLst.remove(slides[slide_index])# 1.3 根據(jù)索引,刪除PPT文檔中某一張幻燈片# 比如:刪除第4張幻燈片del_slide(self.presentation,3)
5. 文字及段落
我們首先需要指定一個幻燈片對象 Slide故爵,它可以是已有的幻燈片玻粪,也可以是新建的一張幻燈片
接著,使用幻燈片對象的 slide.shapes 屬性诬垂,獲取當(dāng)前幻燈片中的所有形狀 Shape 組成的隊列
最后利用形狀隊列的下面這個函數(shù)添加一個文本框劲室,函數(shù)返回值為一個:文本框?qū)ο?/p>
add_textbox( left , top , width , height )
該函數(shù)參數(shù)分別為:
left? 左邊距
top? 上邊距
width? 文字框?qū)挾?/p>
height? 文字框高度
這里需要引出另外一個概念:文字形狀
PS:文字形狀便于在文字框中添加段落和設(shè)置樣式,通過「文本框?qū)ο蟆沟膶傩院瘮?shù) text_frame 獲取
definsert_textbox(slide, left, top, width, height, unit=Inches):"""
? ? 幻燈片中添加文本框
? ? :param unit: 單元结窘,默認(rèn)設(shè)置為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_framereturntextbox, tf
為了便于使用痹籍,我對幻燈片中插入文字框這一動作進(jìn)行了一次封裝
長度單位默認(rèn)設(shè)置為:Inches,也可以自定義為厘米等單位
接下來晦鞋,我們來操作文字框及段落的常見操作
1-1? 插入文本框蹲缠,并設(shè)置默認(rèn)段落內(nèi)容
插入文本框的同時棺克,文本框形狀對象會自帶一個段落,可以對這個段落設(shè)置內(nèi)容
# 2线定、往幻燈片中插入一個文本框娜谊,返回一個文本框?qū)ο蠛鸵粋€文本框形狀對象textbox, tf = insert_textbox(slide,8,2,10,4, unit=Cm)# 2.1 默認(rèn)的段落paragraph_default= tf.paragraphs[0]paragraph_default.text ="設(shè)置段落默認(rèn)的內(nèi)容"
1-2? 文本框中新增一個段落
查看源碼發(fā)現(xiàn),文本框形狀對象是 TextFrame 的子類斤讥,因此可以使用 TextFrame 類中的 add_paragraph() 函數(shù)添加一個新的段落
# 2.2 添加一個新的段落paragraph_new= tf.add_paragraph()# 2.3 給段落設(shè)置內(nèi)容paragraph_new.text="歡迎關(guān)注公眾號:AirPython\n每周分享 Python 原創(chuàng)技術(shù)干貨纱皆!"
1-3? 設(shè)置段落及文字樣式
和 Word 一樣,使用 python-pptx 同樣可以設(shè)置 PPT 文檔的段落樣式
其中
對齊方式:對齊方式是針對段落的芭商,只需要指定段落對象的 alignment 的屬性值即可
defset_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False,? ? ? ? ? ? ? ? ? ? ? ? paragraph_alignment=PP_ALIGN.CENTER):"""
? ? 設(shè)置段落中文本的樣式派草,包含:字體名稱、顏色铛楣、大小近迁、是否加粗、是否斜體
? ? :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# 設(shè)置字體樣式set_font_style(font, font_name, font_color, font_size, font_bold, font_italic)returnfont
段落文字屬性:使用段落對象的 font 屬性獲取字體對象簸州,接著設(shè)置字體名稱鉴竭、大小、顏色岸浑、是否斜體搏存、加粗
defset_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):"""
? ? 設(shè)置字體樣式
? ? :param font:
? ? :param font_name:
? ? :param font_color:
? ? :param font_size:
? ? :param font_bold:
? ? :param font_italic:
? ? :return:
? ? """# 字體名稱iffont_name:? ? ? ? font.name = font_name# 字體顏色iffont_colorandlen(font_color) ==3:? ? ? ? font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])# 字體大小iffont_size !=-1:? ? ? ? font.size = Pt(font_size)# 是否加粗,默認(rèn)不加粗font.bold = font_bold# 是否傾斜矢洲,默認(rèn)不傾斜font.italic = font_italic
1-4? 設(shè)置文字框的背景顏色
設(shè)置文字框背景顏色只需要 2 步
將形狀的填充類型設(shè)置為純色
設(shè)置文字框的背景顏色
defset_widget_bg(widget, bg_rgb_color=None):"""
? ? 設(shè)置【文本框textbox/單元格/形狀】的背景顏色
? ? :param widget:文本框textbox璧眠、單元格、形狀
? ? :param bg_rgb_color:背景顏色值
? ? :return:
? ? """ifbg_rgb_colorandlen(bg_rgb_color) ==3:# 1读虏、將形狀填充類型設(shè)置為純色widget.fill.solid()# 2蛆橡、設(shè)置文本框的背景顏色widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2])# 4、設(shè)置文字框的背景顏色set_widget_bg(textbox, [0,255,0])
需要指出的是掘譬,該方法同樣適用于設(shè)置表格單元格泰演、普通形狀的背景顏色
1-5 文本框的自動對齊
一旦文本框設(shè)置一段很長的文字,單行可能顯示不完全
這時候葱轩,我們只需要設(shè)置文字形狀的 word_wrap 值為 True睦焕,則可以讓文本框的文字自動換行顯示
# 5、設(shè)置文本框的文字自動對齊tf.word_wrap=True
龍華大道1號 http://www.kinghill.cn/Dynamics/2106.html