1. 安装pptx
pip install python-pptx
2. 文本替换和插入图片
 - 文本通过占位符例如{{$xxx}}进行标记,然后进行替换;图片通过ppt中的图形和图片中的占位符进行标记
- ppt如下

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
prs = Presentation('ppt.pptx')
new_image_path = 'python.png'
for slide in prs.slides:
    
    for shape in slide.shapes:
        
        if shape.has_text_frame:
            if "{{$keyValue_text}}" in shape.text:
                
                shape.text = shape.text.replace("{{$keyValue_text}}", "文本替换后的内容")
        
        if shape.has_table:
            for row in shape.table.rows:
                for cell in row.cells:
                    if "{{$keyValue_table}}" in cell.text:
                        cell.text = cell.text.replace('{{$keyValue_table}}', '表格替换后的内容')
        
        if shape.shape_type == MSO_SHAPE_TYPE.AUTO_SHAPE:
            if '{{$image}}' in shape.text:
                
                slide.shapes._spTree.remove(shape.element)
                
                left = shape.left
                top = shape.top
                width = shape.width
                height = shape.height
                slide.shapes.add_picture(new_image_path, left, top, width, height)
prs.save('new_ppt.pptx')

3. 生成表格
 - 定义一个表格,并设置表格的名称{{$table}},表格只包含表头,根据提供的数据动态追加行并填充数据
- 点击选择窗格,选择ppt中的表格,设置表格名称{{$table}}

from pptx import Presentation
from copy import deepcopy
def find_table_by_identifier(slide, identifier):
    for shape in slide.shapes:
        if shape.has_table and shape.name == identifier:
            return shape.table
    return None
def add_row_to_table(table):
    
    new_row = deepcopy(table._tbl.tr_lst[-1])
    
    table._tbl.append(new_row)
def add_data_to_table(table, data):
    
    rows_to_add = len(data)
    
    for _ in range(rows_to_add):
        add_row_to_table(table)
    
    for i, row_data in enumerate(data):
        for j, cell_content in enumerate(row_data):
            cell_text = str(cell_content)
            table.cell(i + 1, j).text = cell_text
data = [
    ["张三", 28, "北京"],
    ["李四", 22, "上海"],
    ["王五", 35, "广州"]
]
ppt_path = 'table.pptx'
save_path = 'new_table.pptx'
prs = Presentation(ppt_path)
for slide in prs.slides:
    table = find_table_by_identifier(slide, "{{$table}}")
    if table is not None:
        add_data_to_table(table, data)
prs.save(save_path)
