zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    EveryOne Piano
    3D扫描商店
    Substance PBR Guide
    C2GOASM
    Unity调试外部DLL
    BinaryReader优化
    IL
    如何画头发
    Bitrix24
    Mac查找包含指定字符串的文件
  • 原文地址:https://www.cnblogs.com/azureology/p/12349585.html
Copyright © 2011-2022 走看看