問題背景
大量表格數據需要生成指定格式的ppt文件,內容以文字和表格為主,首尾頁與內容有固定格式。博主不熟悉VBA操作,希望通過模板用Python完成自動化。
基本思路
- 使用
xlrd
模塊讀取xlsx文件內容 - 使用
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])