请教一个使用 pywin32com 操作 ppt 幻灯片图形复制或者删除的问题。

2018-10-04 15:13:23 +08:00
 gamecmt

小弟使用的是 python3.7 里面的 win32com,想用 python 将 ppt 里的一页幻灯片( slides )中一个图形( shapes )复制到另一页幻灯片中。

通过查找网上的一些资料,可以实现将 ppt 里面的 shapes 属性赋值,但没有办法删除或者复制。查看了一下 msdn 发现 vb 实现如下,https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.shape.copy 但是在 python 中不知道如何调用 ActivePresentation,求各位大哥帮忙看看,究竟如何实现复制或者删除。

import win32com
from win32com.client import Dispatch, constants

ppt = win32com.client.Dispatch('PowerPoint.Application')
ppt.Visible = 1
pptSel = ppt.Presentations.Open("c:\\code\\pptx\\test.pptx")

# 下面两行可以实现
print(pptSel.Slides(1).Shapes.Count)
pptSel.Slides(1).Shapes(4).TextFrame.TextRange.Text="1"
# 脑洞的写下如此代码,想实现第一张幻灯片图片复制到第 2 个幻灯片中,但系统不会报错,也不运行。
pptSel.Slides(1).Shapes(1).Copy
pptSel.Slides(2).Shapes.Paste
# 删除也不运行
pptSel.Slides(1).Shapes(2).Delete
3449 次点击
所在节点    Python
11 条回复
lihongjie0209
2018-10-04 15:29:22 +08:00
还不如直接用微软系的语言写, 用 python 就没意思了
daigouspy
2018-10-04 16:12:37 +08:00
@lihongjie0209 同意!另外多去学习一下 com 组件,你会发现一个新世界。
junjieyuanxiling
2018-10-04 16:34:35 +08:00
据说 PowerShell 比较适合这么干?
gamecmt
2018-10-04 17:00:36 +08:00
微软系的语言不懂啊,凭兴趣了解了一点 python,其它的语言都没玩过。

学习语言的时间比较长,我也仅仅遇到点 ppt 批量导入几十页数据,成本上不是太划算。各位大哥有什么简单的方法不?
geelaw
2018-10-04 17:19:58 +08:00
我觉得原因是你拿到了一个 function 但是你没有 call。

这就类似

def func(): # 你们知道下面应该有缩进的,据说会被吃掉?
print('hello, world')

func

不会发生任何事情一样。

你应该写 pptSel.Slides(1).Shapes(1).Copy() 和 Paste() 和 Delete() 等。我没有尝试过。

@lihongjie0209 #1 @junjieyuanxiling #3

COM 是语言和平台无关的。
zjsxwc
2018-10-04 17:21:31 +08:00
gamecmt
2018-10-04 17:48:47 +08:00
@geelaw 大哥你是对的。刚才测试了一下正常了。但感觉有点奇怪,如 pptSel.Slides(1).Shapes.Count,TextRange.Text 等等没有()就可以运行,但不明白为什么 Copy Paste 需要()。
gamecmt
2018-10-04 17:51:11 +08:00
@zjsxwc 谢谢,是这个。刚才 geelaw 已提点我了,已成功解决。
geelaw
2018-10-04 17:56:42 +08:00
@gamecmt #7 那些是 properties,就像 Python 的 properties 也不需要括号就能访问 getter/setter。

任何正常的语言都会把 COM 绑定到该语言最合适的构造。

VBA 代码不需要括号,是因为 BASIC 里面调用 sub/function 并丢弃返回值(也就是整个语句是一个调用的时候)的语法就是

被调用者的名字 参数 1, 参数 2, ...

没有参数就没有列表,所以后面是空的。
gamecmt
2018-10-04 18:13:22 +08:00
@geelaw 懂了,谢谢!
PythonAnswer
2018-10-05 05:02:07 +08:00
用 vba 直接写吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/494876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX