Python之pptx實現添加內容與刪除(移動)頁操作


問題背景

大量表格數據需要生成指定格式的ppt文件,內容以文字和表格為主,首尾頁與內容有固定格式。博主不熟悉VBA操作,希望通過模板用Python完成自動化。

基本思路

  1. 使用xlrd模塊讀取xlsx文件內容
  2. 使用pptx模塊完成ppt修改

模塊版本

本文完成時使用的Python模塊版本如下

pip install xlrd==1.2.0 python-pptx==0.6.18

具體實現

數據讀取

有關xls讀取參考我的博文:Python之xlrd模塊讀取xls文件與報錯解決

插入頁面

網上有很多關於pptx的參考資料,很快可以上手並新建新的幻燈片頁(slide):

from pptx import Presentation
prs = Presentation('template.pptx')

def new_slide(idx):
    'Add slide with layout, 0 = title, 1 = content, 2 = ending'
    layout = prs.slide_layouts[idx]
    slide = prs.slides.add_slide(layout)
    return slide

上述代碼支持根據幻燈片版式(layout)生成不同的空白頁,如模板定義0標題1內容2結尾。具體版式可在ppt菜單【視圖】-【幻燈片母版】中進行編輯。

缺陷:新建slide會自動添加到末尾頁,無法移動。

寫入內容

在Office 2007之后的pptx文件本質上是一個結構化的xml壓縮包,而xml中的段落決定了每一頁的元素的模板、內容、格式、字體、大小、位置等,因此通過搜過xml文件中不同的內容即可快速定位到需要修改的字段。

在ppt中每個元素都抽象為shape,對於表格,我的方案是在模板中做好格式並使用deepcopy復制到新的頁面再修改內容。

from copy import deepcopy

slide = new_slide(1) #content slide
slide.shapes.title.text = '本頁標題'
el = prs.slides[1].shapes[2].element #table in template
ol = deepcopy(el) #duplicate
slide.shapes._spTree.insert_element_before(ol)
table = slide.shapes[1].table #table in new slide
table.cell(1,1).text_frame.paragraphs[0].runs[0].text = '表格內容'

刪除頁面

官方issue指出無法移動slide可通過remove+insert間接實現,比較繁瑣。
問題簡化:尾部批量添加新容頁結和尾最頁,后刪去模板二三頁。
【模板開頭】【模板內容】【模板結尾】【新內容1】【新內容2】……【新結尾】

def del_slide(index):
    slides = list(prs.slides._sldIdLst)
    prs.slides._sldIdLst.remove(slides[index])

參考文檔

feature: reorder a slide #68


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM