利用Python自动生成PPT的示例详解

作者:阿涛的一天 时间:2021-10-16 18:25:08 

在日常工作中,PPT制作是常见的工作,如果制作创意类PPT,则无法通过自动化的形式生成,因为创意本身具有随机性,而自动化解决的是重复性工作,两者有所冲突。

python-pptx是python处理PPT的一个库,注重的是读和写,无法导出,没有渲染功能。

利用Python自动生成PPT的示例详解

废话不多说,第一步,安装python-pptx库:

pip3 install -i https://pypi.doubanio.com/simple/ python-pptx

ppt里面处理的主要对象一般为文本框,表格,图片。

每一页的ppt为一个slide

from pptx import Presentation, util
from pptx.util import Pt,Cm
from pptx.shapes.picture import Picture
#实例化一个ppt对象
ppt = Presentation("./test.pptx")
slide = ppt.slides[0] #第几页

然后遍历查看这一页ppt中都包含哪些对象:

def rander_template(slide):
   for shape in slide.shapes:
       if shape.has_text_frame == True:
           print("==========================文本框=============================")
           print("段落长度:",len(shape.text_frame.paragraphs))
           for paragraph in shape.text_frame.paragraphs:
               # 拼接文字
               print("段落包含字段:",len(paragraph.runs))
               print(''.join(run.text for run in paragraph.runs))
               for i in range(len(paragraph.runs)):
                   print("run"+str(i)+":"+paragraph.runs[i].text)
           print(shape.text_frame.paragraphs[0].runs[0].text)
           shape.text_frame.paragraphs[0].runs[0].text = "规则是自由的第一要义"
       elif shape.has_table == True:
           print("==========================表格==============================")
           one_table_data = []
           for row in shape.table.rows:  # 读每行
               row_data = []
               for cell in row.cells:  # 读一行中的所有单元格
                   cell.text = cell.text if cell.text != "" else "未填写"
                   c = cell.text
                   row_data.append(c)
               one_table_data.append(row_data)  # 把每一行存入表
           # 用二维列表输出表格行和列的数据
           print(one_table_data)
           print("第一个单元格内容:",shape.table.rows[0].cells[0].text)

elif isinstance(shape,Picture):
           print("==========================图片==============================")
           index = 0
           with open(f'{index}.jpg','wb') as f:
               f.write(shape.image.blob)
               index += 1

文本框对象【text_frame】:

shape.has_text_frame查看是否有文本框对象,有的话查看具体有几个段落【len(shape.text_frame.paragraphs)】,每个段落又有多少个run对象【len(paragraph.runs)】

注意:修改run对象的时候,修改run[0],后面的值都会被覆盖。

表格对象【table】:

table对象还是按照行列值来定位划分的,eg:table.rows[2]cells[3].text代表第三行第四列的值

图片对象【Picture】:

插入图片需要固定图片的位置,比如:

利用Python自动生成PPT的示例详解

def insert_pic(slide):
   #需要用到pptx库的util方法
   img_path = './blue.png'  # 图片路径
   # 设置图片的位置和大小
   left = util.Cm(8.04)
   top = util.Cm(9.93)
   width = util.Cm(15.07)
   height = util.Cm(4.06)
   # 在页面中插入图片
   slide.shapes.add_picture(img_path, left, top, width, height)

全部代码:

from pptx import Presentation, util
from pptx.util import Pt,Cm
from pptx.shapes.picture import Picture
ppt = Presentation("./test.pptx")

def rander_template(slide):
   for shape in slide.shapes:
       if shape.has_text_frame == True:
           print("==========================文本框=============================")
           print("段落长度:",len(shape.text_frame.paragraphs))
           for paragraph in shape.text_frame.paragraphs:
               # 拼接文字
               print("段落包含字段:",len(paragraph.runs))
               print(''.join(run.text for run in paragraph.runs))
               for i in range(len(paragraph.runs)):
                   print("run"+str(i)+":"+paragraph.runs[i].text)
           print(shape.text_frame.paragraphs[0].runs[0].text)
           shape.text_frame.paragraphs[0].runs[0].text = "规则是自由的第一要义"
       elif shape.has_table == True:
           print("==========================表格==============================")
           one_table_data = []
           for row in shape.table.rows:  # 读每行
               row_data = []
               for cell in row.cells:  # 读一行中的所有单元格
                   cell.text = cell.text if cell.text != "" else "未填写"
                   c = cell.text
                   row_data.append(c)
               one_table_data.append(row_data)  # 把每一行存入表
           # 用二维列表输出表格行和列的数据
           print(one_table_data)
           print("第一个单元格内容:",shape.table.rows[0].cells[0].text)

elif isinstance(shape,Picture):
           print("==========================图片==============================")
           index = 0
           with open(f'{index}.jpg','wb') as f:
               f.write(shape.image.blob)
               index += 1
def insert_pic(slide):
   img_path = './blue.png'  # 图片路径
   # 设置图片的位置和大小
   left = util.Cm(8.04)
   top = util.Cm(9.93)
   width = util.Cm(15.07)
   height = util.Cm(4.06)
   # 在页面中插入图片
   slide.shapes.add_picture(img_path, left, top, width, height)

if __name__ == "__main__":
   slide = ppt.slides[0] #第几页
   rander_template(slide)
   insert_pic(slide)
   ppt.save('new.pptx')  # 保存为文件

初始ppt:

利用Python自动生成PPT的示例详解

生成ppt:

利用Python自动生成PPT的示例详解

来源:https://blog.csdn.net/weixin_44784088/article/details/124277314

标签:Python,自动,PPT
0
投稿

猜你喜欢

  • 细化解析:SQL Server 2000 的各种版本

    2009-02-05 15:41:00
  • 详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

    2023-01-05 06:49:40
  • 微软建议的ASP性能优化28条守则(7)

    2005-05-30 16:02:00
  • OpenSearch 初探

    2008-06-19 12:06:00
  • Pygame 精准检测图像碰撞的问题

    2022-01-17 17:56:13
  • js中string和number类型互转换技巧(分享)

    2024-05-05 09:14:53
  • jenkins自动构建发布vue项目的方法步骤

    2024-04-30 10:47:14
  • 常用SQL语句词典

    2008-08-03 17:19:00
  • Vue使用Echarts图表多次初始化报错问题的解决方法

    2023-07-02 16:49:54
  • Mootools 1.2教程(17)——手风琴插件

    2008-12-11 13:39:00
  • JS 添加千分位与去掉千分位的示例

    2010-08-20 06:18:20
  • golang设置http response响应头与填坑记录

    2024-05-21 10:22:24
  • Python使用urllib模块的urlopen超时问题解决方法

    2023-12-16 02:49:50
  • 在js中判断checkboxlist(.net控件客户端id)是否有选中

    2024-04-16 09:32:37
  • python3.7将代码打包成exe程序并添加图标的方法

    2021-01-17 08:29:32
  • python的pdb调试命令的命令整理及实例

    2022-10-01 01:47:12
  • python中字符串最常用的十三个处理操作记录

    2023-10-19 23:25:32
  • Oracle捕获问题SQL解决CPU过渡消耗

    2010-07-21 13:14:00
  • mysql show processlist 显示mysql查询进程

    2024-01-19 07:42:16
  • sql 查询慢的原因分析

    2024-01-16 13:11:29
  • asp之家 网络编程 m.aspxhome.com