温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用Python实现办公自动化PPT批量转换操作

发布时间:2021-09-14 17:47:38 来源:亿速云 阅读:270 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关如何使用Python实现办公自动化PPT批量转换操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

    python-pptx 模块的安装

    pip install python-pptx

    读取 PPT

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

    如何使用Python实现办公自动化PPT批量转换操作

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

    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)

    执行结果如下所示:

    如何使用Python实现办公自动化PPT批量转换操作 

    写入 PPT

    先来个简单点的。

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

    如何使用Python实现办公自动化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 的如下版式,我已经用数据一一标出:

    如何使用Python实现办公自动化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()

    关于“如何使用Python实现办公自动化PPT批量转换操作”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI