首页 > 编程语言 >用Python操作PPT的办公自动化教程

用Python操作PPT的办公自动化教程

时间:2023-08-08 09:55:47浏览次数:328  
标签:pptx 办公自动化 Python text slide shape prs PPT import

PPT通过其精美的可视化技巧以及良好的演示效果,成为了职场人士的必备技能。PPT的设计是一门大学问,无论是设计技巧,还是操作方法,都衍生出了专门的课程。
主要介绍Python操作PPT的技巧,编程的优势在于处理速度,对于高大上的PPT设计,还是需要"以人为本,所以该模块的使用场景主要是PPT基本元素的提取和添加,适合大量内容的转化,比如word转PPT, 减少大量繁琐的人工操作,尽管提供了一些基本的样式设计,但是满足日常办公对PPT美观性的要求上还是差点意思。

安装模块

Windows用户打开命令行输入:pip install python-pptx

Mac用户打开终端/Terminal输入:pip3 install python-pptx

使用windows系统,如果出现无法安装情况,可以在cmd模式下输入网址选择国内清华镜像。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-pptx

导入模块:import pptx

参考文档地址:https://python-pptx.readthedocs.io/en/latest/index.html

PPT的基本结构介绍

在该模块中,将ppt拆分为了以下多个元素

  1. presentations, 表示整个ppt文档

  2. sliders. 表示ppt文档的每一页

  3. shapes 方框,在每页幻灯片内插入的方框,可以是形状,也可以是文本框

  4. Run 文字块 一般为较少字符

  5. Paragraph 段落,即Shape中的每一段内容,都称为一个段落

 基本使用:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Inches, Pt, Cm
 
prs = Presentation()    #默认模板
 
prs = Presentation(mypath)    #使用自己定义的模板

获取PPT内容

from pptx import Presentation
from pptx.util import Inches
# 1. 得到幻灯片对象
prs = Presentation("demo.pptx")
# 2. 获取prs对象中的每一页PPT
for slide in prs.slides:
  # 3. 遍历获取每页PPT中的内容
    for shape in slide.shapes: 
      # 4. 打印具体的Shape
        print(shape)
     # 5. 我是一条华丽的分割线,划分不同的slide
    print("——————————————————————————")

输出结果:

 如果想获取每个Shape里面的文字也可以:

shape.has_text_frame ----->是否有文字 shape.text_frame ----->获取文字框

from pptx import Presentation
from pptx.util import Inches
# 1. 得到幻灯片对象
prs = Presentation("demo.pptx")
# 2. 获取prs对象中的每一页PPT
for slide in prs.slides:
  # 3. 遍历获取每页PPT中的内容
    for shape in slide.shapes: 
      # 4. 判断是否存在文本
        if shape.has_text_frame:
          # 5. 如果存在则获取内容
            text_frame = shape.text_frame
            print(text_frame.text)
     # 6. 我是一条华丽的分割线,划分不同的slide
    print("——————————————————————————")      

输出的结果(对比前面的幻灯片):

从shape中找paragraph

from pptx import Presentation
from pptx.util import Inches
# 1. 得到幻灯片对象
prs = Presentation("demo.pptx")
# 2. 获取prs对象中的每一页PPT
for slide in prs.slides:
  # 3. 遍历获取每页PPT中的内容
    for shape in slide.shapes: 
      # 4. 判断是否存在文本
        if shape.has_text_frame:
      # 5. 获取shape中的文本
            text_frame = shape.text_frame
            # 6. 获取text_frame中的段落内容
            for paragraph in text_frame.paragraphs:
              # 7. 打印段落内容
               print(paragraph.text)
               print('----------paragraph------------')

综合应用

编写一个Python程序,要求

(1)打开demo.pptx

(2)按照paragraph分段,转换成为word文档

(3)保存为demo.docx

from pptx import Presentation
from docx import Document

doc = Document()
prs = Presentation("婚礼策划师的最爱.pptx")
ls = []
for slide in prs.slides:
 for shape in slide.shapes:
  if shape.has_text_frame:
   text_frame = shape.text_frame
   for paragraph in text_frame.paragraphs:
    if paragraph.text != '':
     doc.add_paragraph(paragraph.text)

doc.save("demo.docx")

向PPT写入内容

首先了解模板和占位符

Slides_layouts:版式,一个幻灯片母版由多个版式组成,索引从0开始。

Placeholder:占位符:存在PPT母版里面的幻灯片的某一部件:Placeholder

在创建一页ppt时,需要指定对应的布局,在该模块中, 内置了以下9种布局

  1. Title

  2. Title and Content

  3. Section Header

  4. Two Content

  5. Comparison

  6. Title Only

  7. Blank

  8. Content with Caption

  9. Picture with Caption

通过数字下标0到9来访问,指定布局添加一页ppt的用法如下:

创建placeholders

from pptx import Presentation

prs = Presentation() #初始化一个空pptx文档
slide = prs.slides.add_slide(prs.slide_layouts[0])  # 用第一个母版生成一页ppt
for shape in slide.placeholders:         # 获取这一页所有的占位符
    phf = shape.placeholder_format
    print(f'{phf.idx}--{shape.name}--{phf.type}')  # id号--占位符形状名称-占位符的类型
    shape.text = f'{phf.idx}--{shape.name}--{phf.type}'
prs.save("new_template.pptx")

 也可以一次添加多个

from pptx import Presentation

prs = Presentation() #初始化一个空pptx文档
i = 0
while i <= 10:
    slide = prs.slides.add_slide(prs.slide_layouts[i])  
    i = i+1
    for shape in slide.placeholders:         # 获取这一页所有的占位符
        phf = shape.placeholder_format
        print(f'{phf.idx}--{shape.name}--{phf.type}')  # id号--占位符形状名称-占位符的类型
        shape.text = f'{phf.idx}--{shape.name}--{phf.type}'
prs.save("new_template.pptx")

向占位符中添加内容

主要使用:

shape.text = 字符串
prs.save(文件路径)
from pptx import Presentation

prs = Presentation()
# 用第一个母版生成一页ppt
slide = prs.slides.add_slide(prs.slide_layouts[1])
# 获取当前页的标题
title_shape = slide.shapes.title
# 向标题中添加文本
title_shape.text = '宋宋的Python专栏'
# 获取副标题
subtitle = slide.shapes.placeholders[1]
# 副标题中添加文本
subtitle.text = '宋宋是一个爱美的大女生'

# 副标题中添加新段落
new_paragraph1 = subtitle.text_frame.add_paragraph()
# 向段落中添加文本
new_paragraph1.text = '我是一个专注学习技术的大女生'
new_paragraph1.level = 1

new_paragraph2 = subtitle.text_frame.add_paragraph()
new_paragraph2.text = '我是一个认真写文章的大女生哈哈哈'
new_paragraph2.level = 2

# 保存内容
prs.save("写入内容1.pptx")

空白的PPT模板中添加文本框和图形

from pptx import Presentation
from pptx.util import Cm,Pt,Inches
from pptx.enum.shapes import MSO_SHAPE

prs = Presentation('写入内容1.pptx')
slide = prs.slides.add_slide(prs.slide_layouts[6]) # 6的layout中是一个空白的Slider,里面没有占位符

# 单独向里面添加文本框和图片
left = top = width = height =Cm(3)  # # left,top为相对位置,width,height为文本框大小。满足条件顺序是左>上>右>下
text_box = slide.shapes.add_textbox(left,top,width,height)
tf = text_box.text_frame
tf.text = "欢迎来到宋宋的Python专栏"

p = tf.add_paragraph()
p.text = "宋宋的Python专栏,有20天学会Python基础,20天学会爬虫,20天学会数据分析,还有干活趣味文章!"
p.font.bold = True
p.font.size = Pt(15)

# 添加图形

slide1 = prs.slides.add_slide(prs.slide_layouts[6]) 
shapes = slide1.shapes
left = top = width = height = Inches(1.0)
shape = shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height)

prs.save("写入内容1_new.pptx")

案例

现有一个公益捐书项目,有很多学生参与了本次活动,为了嘉奖这些学生,决定给每位学生发一张奖状。参与捐赠的学生名单和捐书数量都在students.xlsx中。

  1. 读取Excel中的数据
  2. 读取做好的PPT模板
  3. 将每位同学的姓名和捐书数量设置到PPT上
  4. 保存PPT

模版样式如下:

学生名单信息:

代码如下:

from pptx import Presentation
from pptx.util import Cm,Pt,Inches
from pptx.enum.shapes import MSO_SHAPE
from datetime import datetime

from openpyxl import load_workbook

# 1. 加载cosmetics.xlsx表格
workbook = load_workbook(filename= 'students.xlsx')
# 2. 得到Sheet1工作簿
sheet = workbook['Sheet1']

# 按照行遍历,一行是一个人的信息
for row in sheet.iter_rows(min_row=2, max_row=8, min_col= 1,max_col=2):  # 涵盖范围的所有单元格都会显示
 
 prs = Presentation("模版.pptx")

 # 2. 获取prs对象中的每一页PPT
 for slide in prs.slides:
   # 3. 遍历获取每页PPT中的内容
  for shape in slide.shapes: 
    # 4. 判断是否存在文本
   if shape.has_text_frame:
       # 5. 获取shape中的文本
    text_frame = shape.text_frame
    # 6. 获取text_frame中的段落内容
    for paragraph in text_frame.paragraphs:
     paragraph.font.size = Pt(24)
     # 7. 打印段落内容
     if paragraph.text=='__':
      paragraph.text=row[0].value
     if paragraph.text=='__册':
      paragraph.text=f'{row[1].value}册'
     if paragraph.text=='日期:':
      paragraph.font.size = Pt(18)
      paragraph.text=str(datetime.now().strftime('%Y年%m月%d日'))
 prs.save(f"模版_{row[0].value}.pptx")

标签:pptx,办公自动化,Python,text,slide,shape,prs,PPT,import
From: https://www.cnblogs.com/qian-fen/p/17613375.html

相关文章

  • python监控强势票日志
    c:\python38\python.exeF:/GZH/demo/量化/easyquant/utils/ts/A实时监控近10天最强票+昨日涨停票.pyglobal_config_path:c:\python38\lib\site-packages\easytrader/config/global.json++++++++++++++++(近10日最强+昨日涨停票)+++++++++++++++++++++++++++++++:selectdist......
  • Python实现输入三个整数x,y,z,请把这三个数由小到大输出;
    num1=input('请输入第一个数,x:')num2=input('请输入第二个数,y:')num3=input('请输入第三个数,z:')ifnum1>num2:#if语句判断num1,num2=num2,num1ifnum1>num3:num1,num3=num3,num1ifnum2>num3:num2,num3=num3,num2p......
  • How to update to the latest Python version On Linux All In One
    HowtoupdatetothelatestPythonversionOnLinuxAllInOneupdatetothelatestPythonversiononRaspberryPierrorsold$python--versionPython3.9.2new$sudoaptupdate$aptlist|greppython3.10WARNING:aptdoesnothaveastableCL......
  • opencv-python 图像分割
    本章节介绍图像分割方面的算法:分水岭算法,grabcut算法,meanshift算法等知识。图像分割:将前景物体从背景中提取出来。图像分割分为传统图像分割和基于深度学习的图像分割。传统图像分割有:分水岭算法,grabcut算法,meanshift算法,背景抠出等。1分水岭算法分水岭算法是基于图像形态学......
  • 软件测试|最详细的Windows安装Python教程
    简介Python是一种简单易学的高级编程语言,在Windows系统下安装Python非常简单。本文将详细介绍Windows系统下安装Python的教程。步骤1:下载Python安装程序首先,您需要前往Python官方网站(www.python.org/downloads/)…2.x和Python3.x。因为Python2.x版本已经在2020年停止支持,所以我们......
  • Python 递归
    ##py_recursive.py#py_learn##CreatedbyZ.Steveon2023/8/721:28.##需求:通过递归查找一个目录下的所有目录和文件os模块下的三个方法:1.os.listdir()2.os.path.isdir()os.path.isdir(path)如果path是现有的目录,则返回#True。本方法会跟踪符号......
  • 安装python3.8 所对应的pandas 1.3.3 的版本
    1、进入Anacondaprompt环境 2.进入虚拟环境开始安装  ......
  • 100到python练习题(二)
    编写一个程序,判断一个字符串是否是有效的括号序列。defisValidParentheses(s):stack=[]parentheses={')':'(',']':'[','}':'{'}forcharins:ifcharinparentheses.values():stack.a......
  • python获取Excel文件中单元格公式的计算结果
    importopenpyxl#打开Excel文件wb=openpyxl.loadworkbook('data.xlsx',data_only=True)#获取WorkSheetws=wb.worksheets[0]forrowinws.rows:print(row[0].value)注意:使用openpyxl读取公式计算结果时,如果无法得到正确结果时会读出None,此时需要打开对应的excel......
  • python使用正则表达式
    Python使用正则表达式##py_regex.py#py_learn##CreatedbyZ.Steveon2023/8/717:18.##1.Python使用正则表达式,需要导入的模块re模块#2.正则表达式基本方法:#-match()#-search()#-findall()importredeftest_re():s="hellop......