目录
  • 读取 ppt
  • 写入 ppt
  • ppt 转 pdf

      如果你有一堆 ppt 要做,他们的格式是一样的,只是填充的内容不一样,那你就可以使用 python 来减轻你的负担。

      ppt 分为内容和格式,用 python 操作 ppt,就是利用 python 对 ppt 的内容进行获取和填充,修改 ppt 的格式并不是 python 的强项。因此,当你有一堆 ppt 要做的时候,先做好一个带格式的 ppt,然后用 python 复制这个 ppt 文件,然后再对其进行读写。

      python-pptx 模块的安装

      pip install python-pptx

      读取 ppt

      假如文件「测试.pptx」的内容如下:

      那么以下代码可以读取其内容:

      from pptx import presentation
      prs = presentation("测试.pptx")
      for index, slide in enumerate(prs.slides):
          print(f"第 {index+1} 页")
          for shape in slide.shapes:
              if shape.has_text_frame:
                  text_frame = shape.text_frame
                  # print(text_frame.text)
                  # 如果分段读就用下面的代码
                  for paragraph in text_frame.paragraphs:
                      print(paragraph.text)

      执行结果如下所示:

       

      写入 ppt

      先来个简单点的。

      假如要生成如下图所示的 ppt 页

      代码可以这样写:

      from pptx import presentation
      prs = presentation()
      title_slide_layout = prs.slide_layouts[0]
      slide = prs.slides.add_slide(title_slide_layout)
      title = slide.shapes.title
      subtitle = slide.placeholders[1]
      title.text = "hello, world!"
      subtitle.text = "python-pptx was here!"
      prs.save('test.pptx')

      添加一张幻灯片

      幻灯片都有板式,同样的,pptx 提供了 9 种版式让我们选择,分别是:

      • title (presentation title slide)
      • title and content
      • section header (sometimes called segue)
      • two content (side by side bullet textboxes)
      • comparison (same but additional title for each side by side content box)
      • title only
      • blank
      • content with caption
      • picture with caption

      分别对应 ppt 的如下版式,我已经用数据一一标出:

      比如现在要添加一张标题和内容的版式,就可以这样写代码:

      from pptx import presentation
      prs = presentation()
      sld_layout_title_and_content = 1  ##标题和内容版式的序号
      slide_layout = prs.slide_layouts[sld_layout_title_and_content]
      slide = prs.slides.add_slide(slide_layout)
       

      为幻灯片添加内容

      添加内容之前先理解一下形状。从技术上讲,可以在幻灯片上放置 9 种类型的形状:

      • 形状 – 带有填充和轮廓的自动形状
      • 文本框 – 没有填充和轮廓的自动形状
      • 占位符 – 可以出现在幻灯片布局或母版上的自动形状,并在使用该布局的幻灯片上继承,允许添加采用占位符格式的内容
      • 线路/连接器
      • 图片
      • 表格 – 行和列的东西
      • 图表 – 饼图、折线图等。
      • 智能艺术 – 尚不支持,但如果存在则保留
      • 媒体剪辑——视频或音频

      每一个幻灯片都有由一个形状树来组织,之所以称为树,是因为它在一般情况下是分层的;形状树中的节点可以是一个组形状,它本身可以包含形状并具有与形状树相同的语义。对于大多数用途,形状树具有列表语义。

      获取幻灯片中的形状:

      shapes = slide.shapes

      自动形状是规则形状。正方形、圆形、三角形、星星之类的。有 182 种不同的形状可供选择。其中 120 个具有调整“手柄”,您可以使用它来改变形状。

      许多形状类型共享一组公共属性。我们将在此处介绍其中的许多形状,因为其中一些形状只是 autoshape 的一种特殊形式。

      添加自动形状

      以下代码添加一个圆角矩形形状,一英寸见方,并放置在距幻灯片左上角一英寸处:

      from pptx.enum.shapes import mso_shape
      from pptx.util import inches
      shapes = slide.shapes
      left = top = width = height = inches(1.0)
      shape = shapes.add_shape(
          mso_shape.rounded_rectangle, left, top, width, height
      )
      prs.save('新建幻灯片.pptx')

      有关所有 182 种自动形状类型的列表,具体请参阅官方文档 mso_auto_shape_type 枚举项。

      占位符

      占位符也是一种形状,有 18 种类型的占位符。标题、中心标题、副标题、正文,内容,图片,剪贴画,图表、表格、智能艺术,日期、页脚、幻灯片编号,媒体剪辑,标题,垂直正文、垂直对象、垂直标题。

      幻灯片上的占位符可以为空或已填充。这在图片占位符中最为明显。未填充时,占位符会显示可自定义的提示文本。内容丰富的占位符在为空时也会显示一个或多个内容插入按钮。

      纯文本占位符在输入文本的第一个字符时进入“填充”模式,并在删除文本的最后一个字符时返回“未填充”模式。内容丰富的占位符在插入图片等内容时进入填充模式,并在删除该内容时返回未填充模式。为了删除填充的占位符,形状必须被删除两次。第一次删除删除内容并将占位符恢复到未填充模式。额外的删除将删除占位符本身。可以通过重新应用布局来恢复已删除的占位符。

      访问占位符

      >>> prs = presentation()
      >>> slide = prs.slides.add_slide(prs.slide_layouts[8])
      >>> for shape in slide.placeholders:
      ...     print('%d %s' % (shape.placeholder_format.idx, shape.name))
      ...
      0  title 1
      1  picture placeholder 2
      2  text placeholder 3

      如果已经知道占位符的索引,也可通过索引来访问:

      >>> slide.placeholders[1]
      <pptx.parts.slide.pictureplaceholder object at 0x10d094590>
      >>> slide.placeholders[2].name
      'text placeholder 3'

      将内容插入占位符

      >>> prs = presentation()
      >>> slide = prs.slides.add_slide(prs.slide_layouts[8])
      >>> placeholder = slide.placeholders[1]  # idx key, not position
      >>> placeholder.name
      'picture placeholder 2'
      >>> placeholder.placeholder_format.type
      picture (18)
      >>> picture = placeholder.insert_picture('my-image.png')

      如果要插入表格:

      from pptx import presentation
      from pptx.util import inches
      prs = presentation()
      title_only_slide_layout = prs.slide_layouts[5]
      slide = prs.slides.add_slide(title_only_slide_layout)
      shapes = slide.shapes
      shapes.title.text = 'adding a table'
      rows = cols = 2
      left = top = inches(2.0)
      width = inches(6.0)
      height = inches(0.8)
      table = shapes.add_table(rows, cols, left, top, width, height).table
      # set column widths
      table.columns[0].width = inches(2.0)
      table.columns[1].width = inches(4.0)
      # write column headings
      table.cell(0, 0).text = 'foo'
      table.cell(0, 1).text = 'bar'
      # write body cells
      table.cell(1, 0).text = 'baz'
      table.cell(1, 1).text = 'qux'
      prs.save('write_ppt_table.pptx')

      如果要插入图表:

      from pptx import presentation
      from pptx.chart.data import categorychartdata
      from pptx.enum.chart import xl_chart_type
      from pptx.util import inches
      # create presentation with 1 slide ------
      prs = presentation()
      slide = prs.slides.add_slide(prs.slide_layouts[5])
      # define chart data ---------------------
      chart_data = categorychartdata()
      chart_data.categories = ['east', 'west', 'midwest']
      chart_data.add_series('series 1', (19.2, 21.4, 16.7))
      # add chart to slide --------------------
      x, y, cx, cy = inches(2), inches(2), inches(6), inches(4.5)
      slide.shapes.add_chart(
          xl_chart_type.column_clustered, x, y, cx, cy, chart_data
      ) 
      prs.save('write_ppt_chart.pptx')

      ppt 转 pdf

      以下方法仅适用于 windows

      def ppttopdf2(inputfilename, outputfilename, formattype = 32):
          import comtypes.client
          powerpoint = comtypes.client.createobject("powerpoint.application")
          powerpoint.visible = 1
          if outputfilename[-3:] != 'pdf':
              outputfilename = outputfilename + ".pdf"
          deck = powerpoint.presentations.open(inputfilename)
          deck.saveas(outputfilename, formattype) # formattype = 32 for ppt to pdf
          deck.close()
          powerpoint.quit()

      最后的话

      本文抛砖引玉,更多复杂的 ppt 操作,请移步至文末的官方文档。

      参考文档:

      以上就是python办公自动化ppt批量转换操作的详细内容,更多关于python办公自动化的资料请关注www.887551.com其它相关文章!