Python pptx 向已有ppt的不同page里面插入table

我在使用pptx模块向已有里面插入table的时候,20页的模板里面只能插入到最后一页,主体代码块如下,最后的保存无论是放在for循环里面还是外面都只能update最后一页的内容,比如我想插入到4-7页,最后只有第七页有更新,请教各位熟悉python的童鞋:

from pptx import Presentation
from pptx.util import Cm, Pt #Inches
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN

#df1,df2,df3,df4是结构相同的不同的dataframe,分别要放到模板的4,5,6,7页
list = [df1,df2,df3,df4]
prs = Presentation('new.pptx')  

for i in range(1,5):
    slide_index = i + 3
    df = globals()["df" + str(i)]
    globals()["slide" + str(slide_index)] = prs.slides[slide_index] 
    globals()["shapes" + str(slide_index)] = globals()["slide" + str(slide_index)].shapes
            # 表格样式 --------------------
    rows = df.shape[0] + 1
    cols = df.shape[1]
    top    = Cm(5)
    left   = Cm(1) #Inches(2.0)
    width  = Cm(20) # Inches(6.0)
    height = Cm(6) # Inches(0.8)
        
        # 添加表格到幻灯片 --------------------
    table = globals()["shapes" + str(slide_index)].add_table(rows, cols, left, top, width, height).table
    
    for row in range(df.shape[0] + 1):
            for col in range(0,df.shape[1]):
                table.cell(row,col).text = str(df1[df1.columns[col]][row-1])
                
    #prs.save('test_template1.pptx') 
prs.save('test_template1.pptx') 
    



阅读 4.6k
1 个回答

如果只是布局不同,数据有变化,你应该考虑使用多母版+占位符的形式自动完成。出现只有最后一页有更新,在于你始终用最后一张幻灯片对象的引用,add_table本质并不是直接添加进幻灯片类,而是加入当前shapes类(该类相当于ps中的图层)。另建议不要用globals(),滥用全局变量会产生不可预知结果。先认识pptx模块类层次关系,多页示例代码如下

Presentation   演示文稿构造对象

slide_masters   幻灯片母版(一个演示文件可以具有多个幻灯片母版)
slide_layouts   幻灯片片布局(属于母版而非prs)

slides          幻灯片                        add_slide
shapes          形状,类似于ps中的图层         add_shape
placeholders...    占位符,字典辅助类...

Presentation -> slide_masters -> slide_layouts
Presentation -> slides -> shapes -> placeholders | note | text_frame ...

下面示例是一个使用了默认母版的,添加5页不同标题幻灯片示例,仅供参考

from pptx import Presentation
from pptx.util import Inches


# 演示文稿根对象,使用默认母版
prs = Presentation()
# 幻灯片布局
title_only_slide_layout = prs.slide_layouts[5]
# prs.slide_masters 幻灯片母版

for i in range(0,5):
    # 1. 当前幻灯片对象
    slide = prs.slides.add_slide(title_only_slide_layout)
    # 若prs = Presentation("xx.pttx") xx为已存在的模板
    # slide = prs.slides[i] 读取已存在的幻灯片第i+1张

    # 2. 当前shapes(背景画布)对象
    shapes = slide.shapes
    #  变更幻灯片主标题内容
    shapes.title.text = 'Adding a Table pardon110'+str(i)

    # 3.配置位置尺寸参数
    rows = cols = 2
    left = top = Inches(2.0)
    width = Inches(6.0)
    height = Inches(0.8)

    # 4.在(画布)上添加表格图层(表格是shapes的一种类型)
    table = shapes.add_table(rows, cols, left, top, width, height).table

    # 5.table图层设置
    table.columns[0].width = Inches(2.0)
    table.columns[1].width = Inches(4.0)

    # 表格头填充
    table.cell(0, 0).text = 'Foo'
    table.cell(0, 1).text = 'Bar'

    # 表格内容填充
    table.cell(1, 0).text = 'Baz'
    table.cell(1, 1).text = 'Qux'

    # # 添加多个表格
    # left = Inches(2.0)
    # top = Inches(6.0)
    # 当前画布上添加另一个表格
    # table = shapes.add_table(rows, cols, left, top, width, height).table
    # table.cell(0, 0).text = 'pardon110'

prs.save('test.pptx')

上述代码演示了创建table,没直接上修改table。之所以这样做是有原因的,详情参见用 pttx 模块批量操作幻灯片

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题