当前位置:   article > 正文

python通过pypiwin32操作PPT_python播放ppt并打印页码

python播放ppt并打印页码

简介

可以操作.ppt&.pptx文件

必须在windows平台,必须安装MS Office或WPS

conda create -n pptdeal python=3.7
conda activate pptdeal
pip install pypiwin32
  • 1
  • 2
  • 3

基本操作

# 1. 调用PPT程序

# 调用Microsoft PPT,不显示警告
pptCOM = DispatchEx("PowerPoint.Application")
pptCOM.DisplayAlerts = 0
...
# 关闭调用
pptCOM.Quit()

# 调用WPS PPT,不显示警告
pptCOM = DispatchEx("kwpp.Application")
pptCOM.DisplayAlerts = 0
...
# 关闭调用
pptCOM.Quit()



# 2. 文档操作模板【所有path使用绝对路径,不能使用相对路径】

# 打开已有文档【必须save或saveAs,否则PPT程序将中断并询问是否保存,python端将发生错误】
ppt = pptCOM.Presentations.Open(ppt_path)
...
# 保存
ppt.Save()
# 关闭
ppt.Close()

# 打开已有文档【必须save或saveAs,否则PPT程序将中断并询问是否保存,python端将发生错误】
ppt = pptCOM.Presentations.Open(ppt_path)
...
# 另存为
ppt.SaveAs()
# 关闭
ppt.Close()

# 新建文档  【ppt中必须存在内容否则将报错失败,可以通过Copy&Paste或InsertFromFile等操作获得】
# 【必须saveAs,否则PPT程序将中断并询问是否保存,python端将发生错误】
ppt = pptCOM.Presentations.Add()
...
# 另存为
ppt.SaveAs(ppt_path)
# 关闭
ppt.Close()



# 3. 常用文档操作【所有path使用绝对路径,不能使用相对路径】【所有的index从1开始】
# 当前ppt页数
print(ppt.Slides.Count)
# 删除页
ppt.Slides(page_index).Delete()
# 从其他文档中添加【源文档路径、目标文档插入位置(0为最前,ppt.Slides.Count为最后),从源文档插入的起始页码,从源文档插入的终止页码】
# 【添加仅限文字和图片等,并没有保留源文档的模板格式】
ppt.Slides.InsertFromFile(source_ppt_path, insert_index, start, end)
# 复制粘贴,将粘贴到ppt的最后【粘贴仅限文字和图片等,并没有保留源文档的模板格式】
source_ppt.Slides(page_index).Copy()
ppt.Slides.Paste()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

封装工具类

# ms_office_tool.py
from shutil import copyfile
import os
from win32com.client import DispatchEx


def splitAndMergePPT(pathList, savePath, pageList, pptx):
    """
    截取PPT
    将第一个文件复制并删除无用的页,将第二个及之后的文件欲截取的页加入到该文件中,这样可以使用第一个PPT的背景模板
        若新建PPT,将所有需要的页粘贴进来则丢掉了背景模板

    调用示例:
        # 或pptx = DispatchEx("kwpp.Application"),调用wps版本的PowerPoint
        pptx = DispatchEx("PowerPoint.Application")
        pptx.DisplayAlerts = 0
        pptx.Visible = 1

        splitAndMergePPT('1.ppt', 'sp1.ppt', '5-10', pptx)
        splitAndMergePPT(['1.ppt', '1.ppt'], 'sp2.ppt', ['5-10', '15-20'], pptx)
        splitAndMergePPT(['1.ppt', '2.ppt'], 'sp3.ppt', ['5-10', '15-20'], pptx)

        pptx.Quit()

    :param pathList: PPT路径列表(str/str list)
    :param savePath: PPT结果保存位置
    :param pageList: 欲截取的PPT片段起止页码列表(str/str list),格式为'开始页码-截止页码'(从1开始),
        开始页码/截止页码需使用整数
    :param pptx: ppt应用操作句柄
    :return:    空
    """

    # 若为str,转为str list
    if isinstance(pathList, str):
        pathList = [pathList]
    if isinstance(pageList, str):
        pageList = [pageList]

    # 解析并标准化起止页码,标准格式为int类型
    startList = []
    endList = []
    for item in pageList:
        t = item.split('-')
        startList.append(int(t[0]))
        endList.append(int(t[1]))

    # 将第一个文件复制并删除无用的页
    copyfile(pathList[0], savePath)
    if ':' in savePath:
        pptnew = pptx.Presentations.Open(savePath)
    else:
        pptnew = pptx.Presentations.Open(os.path.join(os.getcwd(), savePath))

    for i in range(startList[0] - 1):
        pptnew.Slides(1).Delete()
    num = endList[0] - startList[0] + 1
    cnt = pptnew.Slides.Count
    while cnt != num:
        pptnew.Slides(pptnew.Slides.Count).Delete()
        cnt = cnt - 1

    # 将第二个及之后的文件欲截取的页加入到该文件中
    for item, start, end in zip(pathList[1:], startList[1:], endList[1:]):
        if ':' not in savePath:
            item = os.path.join(os.getcwd(), item)
        pptnew.Slides.InsertFromFile(item, pptnew.Slides.Count, start, end)

    # 保存并关闭
    pptnew.Save()
    pptnew.Close()


if __name__ == '__main__':

    # 测试splitAndMergePPT
    pptx = DispatchEx("PowerPoint.Application")
    pptx.DisplayAlerts = 0
    pptx.Visible = 1

    splitAndMergePPT('../test_data/1.ppt', '../test_data/sp1.ppt', '5-10', pptx)
    splitAndMergePPT(['../test_data/1.ppt', '../test_data/1.ppt'], '../test_data/sp2.ppt', ['5-10', '15-20'], pptx)
    splitAndMergePPT(['../test_data/1.ppt', '../test_data/2.ppt'], '../test_data/sp3.ppt', ['5-10', '15-20'], pptx)

    pptx.Quit()

    exit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号