python自動化文章一直深受廣大python愛好者的青睞。基於此,我花了整整一周時間真理出來的python自動化文檔手冊,涉及到五個章節(如下圖所示),① python使用openpyxl操作excel;② python使用PyPDF2和pdfplumber操作pdf;③ python使用python-docx操作word;④ python使用python-pptx操作PPT;⑤ python如何自動收發郵件;⑥ python製作電話號碼歸屬地查詢工具。
2)關於本文的說明python自動化操作word,excel,pdf的文章,大家有時候會看到發布這樣的文章。但是python操作ppt的文章,卻少之又少。因此,我將這篇文章單獨整理出來,供大家學習參考。其餘文章詳細見文檔。
3)關於文檔的獲取(文末獲取)python自動化文檔手冊文檔已經整理成冊(附帶標籤),手冊中涉及到的數據都是自製。該文檔已經上傳,請勿濫用,如有盜版,必定追究。
本文目錄使用python操作PPT,需要使用的模塊就是python-pptx,下面來對該模塊做一個簡單的介紹。這裡提前做一個說明:python操作PPT,最好是我們提前設計好自己的一套樣式,然後利用進行python進行內容的獲取和填充(最主要的功能!),最好是不用使用python代碼操作PPT的格式,格式的修改肯定不如我們直接在PPT中修改方便。
python-pptx官網介紹:https://python-pptx.readthedocs.io/en/latest/2、模塊的安裝與導入1)模塊的安裝"Windows用戶命令行下輸入"pip install python-pptx"Mac用戶命令行下輸入"pip3 install python-pptx2)模塊的導入這裡有一點需要注意的是:安裝的庫是python-pptx,但是導入的時候卻有點不同。
3、python讀取PPT文檔中的內容1)PPT的結構說明在使用python操作PPT之前,首先應該清楚PPT的結構,這個對於之後代碼的編寫很有幫助。
2)獲取Slide注意:關於run塊兒的概念,可以參考我的另外一篇文章https://blog.csdn.net/weixin_41261833/article/details/106028038
from pptx import Presentation
prs = Presentation("統計學習方法PPT.pptx")for slide in prs.slides: print(slide)結果如下:
3)獲取Shape形狀import pptxfrom pptx import Presentation
prs = Presentation("統計學習方法PPT.pptx")for slide in prs.slides: for shape in slide.shapes: print(shape)"""注意:這裡得到的Shape對象,並不能看出什麼,接著往下看。"""結果如下:
4)判斷每個Shape中是否存在文字shape.has_text_frame :是否有文字import pptxfrom pptx import Presentation
prs = Presentation("統計學習方法PPT.pptx")for slide in prs.slides: for shape in slide.shapes: if shape.has_text_frame: text_frame = shape.text_frame print(text_frame.text)結果如下:
5)獲取某一頁Slide中的內容import pptxfrom pptx import Presentation
prs = Presentation("統計學習方法PPT.pptx")
for i,slide in enumerate(prs.slides): if i == 5: for shape in slide.shapes: if shape.has_text_frame: text_frame = shape.text_frame print(text_frame.text)結果如下:
6)獲取Shape中的某個Paragraphimport pptxfrom pptx import Presentation
prs = Presentation("統計學習方法PPT.pptx")
for i,slide in enumerate(prs.slides): if i == 5: for shape in slide.shapes: if shape.has_text_frame: text_frame = shape.text_frame for paragraph in text_frame.paragraphs: print(paragraph.text)"""注意:該方法和上述4)中的方法一摸一樣。上述方法是直接獲取Shpae中的文字內容;下面這個更靈活,先獲取每個Shape,然後在獲取每個Shape中的paragraph;下面方式更好:因為我們可以針對paragraph,寫一個判斷條件,只獲取第幾個paragraph;"""結果如下:
4、利用python像PPT中寫入內容1)幻燈片模板及佔位符的概念在這裡插入圖片描述2)怎麼自定義母版?
https://jingyan.baidu.com/article/925f8cb8b5dfe7c0dce05671.html
3)什麼是版式?這個概念在下面的效果中,會得以體現。其中prs.slide_layouts[]傳入0表示獲取的是第一個版式,傳入1表示獲取的是第二個版式,以此類推下去。
4)添加Slide和內容這裡就需要使用上述的自定義母版。因為畢竟是使用python操作PPT,我們可以定義好自己想要展示的PPT母版,然後藉助代碼完成PPT的內容寫入操作。
① 佔位符id的確認import pptxfrom pptx import Presentation
prs = Presentation("空白.pptx")# prs.slide_layouts[]表示的是ppt中不同的版式slide = prs.slides.add_slide(prs.slide_layouts[0])for shape in slide.placeholders: phf = shape.placeholder_format print(f"{phf.idx}--{shape.name}--{phf.type}") shape.text = f"{phf.idx}--{shape.name}--{phf.type}"# 注意:做完這個操作,一定要記得保存一下!prs.save("電子獎狀模板.pptx")"""上述列印結果如下:0--Title 1--TITLE (1) 這個表示標題佔位符,id為013--Picture Placeholder 2--PICTURE (18) 這個表示圖片佔位符,id為1314--Text Placeholder 3--BODY (2) 這個表示正文內容佔位符,id為1415--Text Placeholder 4--BODY (2) 這個表示正文內容佔位符,id為15我們一定要先知道每個空格的佔位符id,才可以進行下面內容的填充。"""效果如下:
② PPT內容的填寫import pptxfrom pptx import Presentation
prs = Presentation("空白.pptx")slide = prs.slides.add_slide(prs.slide_layouts[0])name = slide.placeholders[14]why = slide.placeholders[15]
name.text = "黃同學"why.text = "學習太積極"prs.save("內容填充.pptx")效果如下:
5)添加段落① 佔位符id的確認import pptxfrom pptx import Presentation
prs = Presentation("finall.pptx")slide = prs.slides.add_slide(prs.slide_layouts[0])for shape in slide.placeholders: phf = shape.placeholder_format print(f"{phf.idx}--{shape.name}--{phf.type}") shape.text = f"{phf.idx}--{shape.name}--{phf.type}"print("---")slide = prs.slides.add_slide(prs.slide_layouts[1])for shape in slide.placeholders: phf = shape.placeholder_format print(f"{phf.idx}--{shape.name}--{phf.type}") shape.text = f"{phf.idx}--{shape.name}--{phf.type}"
prs.save("哈哈.pptx")效果如下:
② 段落的添加import pptxfrom pptx import Presentation
prs = Presentation("finall.pptx")slide = prs.slides.add_slide(prs.slide_layouts[0])name = slide.placeholders[14]why = slide.placeholders[15]name.text = "黃同學"why.text = "學習太積極"# - #prs1 = Presentation("finall.pptx")slide1 = prs.slides.add_slide(prs.slide_layouts[1])shapes = slide1.shapestitle_shape = shapes.title # 這句代碼可以改為title_shape = shapes.placeholders[0]body_shape = shapes.placeholders[1]
title_shape.text = "這是一個標題"
tf = body_shape.text_frame# 這句代碼就是給body佔位符添加內容!tf.text = "帶圓點的符號1"
p = tf.add_paragraph()# 這個代碼表示在原來的基礎上,添加第一個段落!p.text = "帶圓點的符號2"
p = tf.add_paragraph()# 這個代碼表示在原來的基礎上,添加第二個段落!p.text = "帶圓點的符號3"
prs.save("嘿嘿.pptx")效果如下:
③ 給段落設定層級關係import pptxfrom pptx import Presentation
prs = Presentation("finall.pptx")slide = prs.slides.add_slide(prs.slide_layouts[0])name = slide.placeholders[14]why = slide.placeholders[15]name.text = "黃同學"why.text = "學習太積極"# - #prs1 = Presentation("finall.pptx")slide1 = prs.slides.add_slide(prs.slide_layouts[1])shapes = slide1.shapestitle_shape = shapes.title # 這句代碼可以改為title_shape = shapes.placeholders[0]body_shape = shapes.placeholders[1]
title_shape.text = "這是一個標題"
tf = body_shape.text_frametf.text = "帶圓點的符號1"
p = tf.add_paragraph()p.text = "帶圓點的符號2"# 原始內容的層級相當於是0,因此這個段落我設置為層級1,下面的段落設置為層級2p.level = 1
p = tf.add_paragraph()p.text = "帶圓點的符號3"p.level = 2
prs.save("嘻嘻.pptx")效果如下:
④ 添加一個文本框slide.shapes.add_textbox(left, top, width, height)from pptx import Presentationfrom pptx.util import Cm, Pt
prs = Presentation()# 使用第一個版式black_slide_layout = prs.slide_layouts[0]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frametf.text = "這是一段文本框裡面的文字"
p = tf.add_paragraph()p.text = "這是第二段文字,加粗,字號40"p.font.bold = Truep.font.size = Pt(40)
prs.save("添加一個文本框0.pptx")效果如下:
⑤ 添加一個圖片slide.shapes.add_picture(圖片路徑, 距離左邊, 距離頂端, 寬度, 高度)第一種展示:
from pptx import Presentationfrom pptx.util import Cm
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = Cm(3)pic = slide.shapes.add_picture("孫悟空.png", left, top)
prs.save("添加圖片1.pptx")效果如下:
第二種展示:
from pptx import Presentationfrom pptx.util import Cm
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = Cm(3)height = Cm(5.5)pic = slide.shapes.add_picture("孫悟空.png", left, top, height=height)
prs.save("添加圖片2.pptx")效果如下:
⑥ 添加表格shapes.add_table(rows, cols, left, top, width, height)from pptx import Presentationfrom pptx.util import Cm, Pt
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)shapes = slide.shapes
rows, cols = 5, 3left = top = Cm(5)width = Cm(18)height = Cm(3)
table = shapes.add_table(rows, cols, left, top, width, height).tabletable.columns[0].width = Cm(6)table.columns[1].width = Cm(2)table.columns[2].width = Cm(2)table.rows[0].height = Cm(2)
data = [ ["姓名","性別","成績"], ["張三","男",96], ["李四","女",87], ["王五","女",90], ["趙六","男",78]]
for row in range(rows): for col in range(cols): table.cell(row,col).text = str(data[row][col])prs.save("插入表格.pptx")結果如下:
5、PPT文檔內容樣式批量調整1)文本框位置的調整上面我們已經知道怎麼添加文本框,現在我們需要做的就是,怎麼調整文本框的位置。
from pptx import Presentationfrom pptx.util import Cm, Ptfrom pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZE
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frametf.text = "這是一段文本框裡面的文字"# - #tf.margin_bottom = Cm(0.1) # 下邊距tf.margin_left = 0 # 下邊距# 一定要導入MSO_ANCHOR這個庫tf.vertical_anchor = MSO_ANCHOR.BOTTOM # 對齊文本方式:底端對齊tf.word_wrap = True # 框中的文字自動換行
prs.save("文本框樣式的調整.pptx")結果如下:
2)文本框背景顏色調整from pptx import Presentationfrom pptx.util import Cm, Ptfrom pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZEfrom pptx.dml.color import RGBColor
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frametf.text = "這是一段文本框裡面的文字"# --- #tf.margin_bottom = Cm(0.1) # 下邊距tf.margin_left = 0 # 下邊距tf.vertical_anchor = MSO_ANCHOR.BOTTOM tf.word_wrap = True # 框中的文字自動換行# --- #fill = text_box.fillfill.solid()# 使用之前一定要導入RGBColor這個庫fill.fore_color.rgb = RGBColor(247, 150, 70)
prs.save("文本框背景色的調整.pptx")結果如下:
3)文本框邊框樣式調整from pptx import Presentationfrom pptx.util import Cm, Ptfrom pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZEfrom pptx.dml.color import RGBColor
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frametf.text = "這是一段文本框裡面的文字"# --- #tf.margin_bottom = Cm(0.1) # 下邊距tf.margin_left = 0 # 下邊距tf.vertical_anchor = MSO_ANCHOR.BOTTOM tf.word_wrap = True # 框中的文字自動換行# --- #fill = text_box.fillfill.solid()# 使用之前一定要導入RGBColor這個庫fill.fore_color.rgb = RGBColor(247, 150, 70)# --- #line = text_box.lineline.color.rgb = RGBColor(255, 0, 0)line.width = Cm(0.3)
prs.save("文本框邊框樣式調整.pptx")結果如下:
4)段落對其調整from pptx import Presentationfrom pptx.enum.text import PP_ALIGN
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frame# --- #p = tf.add_paragraph()p.text = "這是第二段文字"p.alignment = PP_ALIGN.LEFT
prs.save("段落對其調整.pptx")當然這裡還有一些其他樣式的調整,和word很類似,就不一一敘述了。
5)字體樣式調整
代碼如下:
from pptx import Presentationfrom pptx.util import Cm, Ptfrom pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZEfrom pptx.dml.color import RGBColorfrom pptx.enum.text import PP_ALIGN
prs = Presentation()# 使用第七個版式black_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(black_slide_layout)
left = top = width = height = Cm(3)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_frame# --- #p = tf.add_paragraph()p.text = "這是第二段文字"p.alignment = PP_ALIGN.LEFT# -- #p.font.bold = Truep.font.name = "宋體"p.font.color.rgb = RGBColor(247, 150, 70)p.font.size = Pt(30)
prs.save("字體樣式調整.pptx")結果如下: