当前位置:  首页>> 技术小册>> Python与办公-玩转PPT

既然SlideShapes对象是用来管理形状的,根据我们的经验,它肯定也有添加形状对象的方法。对,它有一个add_shape()方法用来新增形状,根据你的经验,它应该会有哪些参数?

首先肯定要有被添加的形状类型,然后考虑一个形状在页面里的状态,比如说形状的位置和大小,如果这些要素都确定了,那么一个形状就可以添加到页面上了。SlideShapes对象的add_shape()方法一共有五个参数,第一个是用来确定添加哪种形状的形状类型id,第二和第三个参数分别是形状的左边、上边与页面的左边、上边之间的距离,这两个值决定了形状的位置,第四和第五个参数分别是形状的宽高,宽高确定形状的大小。

那么我们来试一下添加一个形状,代码如下:

  1. from pptx import Presentation
  2. from pptx.util import Inches
  3. from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE
  4. ppt = Presentation()
  5. slide = ppt.slides.add_slide(ppt.slide_layouts[0])
  6. autoshape_type_id = MSO_AUTO_SHAPE_TYPE.ROUNDED_RECTANGLE
  7. left = top = Inches(3.0)
  8. width = height = Inches(1)
  9. shape = slide.shapes.add_shape(autoshape_type_id,left,top,
  10. width,height)
  11. print(type(shape)) # 输出:<class 'pptx.shapes.autoshape.Shape'>
  12. ppt.save("./ppt_ files/test.pptx")

上面的代码中,我们调用add_shape()方法添加了一个距离页面的左边和上边都是3英寸的圆角矩形,它的宽高都是1英寸,该方法会返回一个Shape对象,代表一个自动形状。比较关键的是,怎么知道圆角矩形的类型id?也不难,python-pptx已经把这些自动形状都定义在MSO_AUTO_SHAPE_TYPE这个枚举类里,而圆角矩形在这个类里的名字就叫ROUNDED_RECTANGLE,它对应的id是5,我们直接使用名字去代替id也是可以的。至于怎么知道ROUNDED_RECTANGLE就是指圆角矩形呢,我们可以添加该形状,再打开PPT软件看一下就确定了

实际上,MSOAUTO_SHAPE_TYPE这个枚举类一共有182种自动形状,老方法,我们遍历一下它的 members _属性,这样就能拿到所有自动形状了,再访问一下这些形状的value属性就可以知道它们对应的名字和id,代码如下:

  1. from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE
  2. print(len(MSO_AUTO_SHAPE_TYPE._ _members_ _)) # 输出:182
  3. for shape in MSO_AUTO_SHAPE_TYPE._ _members_ _:
  4. print(shape.value)
  5. # 输出:
  6. # ACTION_BUTTON_BACK_OR_PREVIOUS (129)
  7. # ACTION_BUTTON_BEGINNING (131)
  8. # ACTION_BUTTON_CUSTOM (125)
  9. # ACTION_BUTTON_DOCUMENT (134)
  10. # ACTION_BUTTON_END (132)
  11. # ...

知道了这些形状的名字和id之后,具体要用哪个就看需求了,这些形状分别长什么样,只能添加后在PPT中查看了。如果希望添加在PPT软件上看到的某个形状,但又不知道在python-pptx中它叫什么名字怎么办?这也很简单啊,在PPT软件中添加好这个形状,然后在python-pptx读取一下该形状,并把它的名字打印出来就ok了。

我们在创建形状的时候指定了位置和宽高,如果后期想要查看某个形状的位置,可以直接访问它的left和top属性,如果要看它的宽高,可以访问它的width和height属性,当然,直接通过这些属性修改它的位置和宽高也是可以的,代码如下:

  1. from pptx import Presentation
  2. from pptx.util import Inches,Cm
  3. from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE
  4. ppt = Presentation()
  5. ...
  6. shape = slide.shapes.add_shape(autoshape_type_id,left,top,
  7. width,height)
  8. print(type(shape))
  9. print(shape.left.inches) # 输出:3.0
  10. print(shape.top) # 输出:2743200
  11. print(shape.width.inches) # 输出:1.0
  12. print(shape.height) # 输出:914400
  13. shape.left = Inches(2)
  14. shape.top = Inches(3)
  15. shape.width = Cm(10)
  16. shape.height = Cm(3)
  17. ppt.save("./ppt_ files/test.pptx")