小弟使用的是 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
1
lihongjie0209 2018-10-04 15:29:22 +08:00 1
还不如直接用微软系的语言写, 用 python 就没意思了
|
2
daigouspy 2018-10-04 16:12:37 +08:00 via Android 1
@lihongjie0209 同意!另外多去学习一下 com 组件,你会发现一个新世界。
|
3
junjieyuanxiling 2018-10-04 16:34:35 +08:00 via Android 1
据说 PowerShell 比较适合这么干?
|
4
gamecmt OP 微软系的语言不懂啊,凭兴趣了解了一点 python,其它的语言都没玩过。
学习语言的时间比较长,我也仅仅遇到点 ppt 批量导入几十页数据,成本上不是太划算。各位大哥有什么简单的方法不? |
5
geelaw 2018-10-04 17:19:58 +08:00 1
我觉得原因是你拿到了一个 function 但是你没有 call。
这就类似 def func(): # 你们知道下面应该有缩进的,据说会被吃掉? print('hello, world') func 不会发生任何事情一样。 你应该写 pptSel.Slides(1).Shapes(1).Copy() 和 Paste() 和 Delete() 等。我没有尝试过。 @lihongjie0209 #1 @junjieyuanxiling #3 COM 是语言和平台无关的。 |
6
zjsxwc 2018-10-04 17:21:31 +08:00 via Android 1
|
7
gamecmt OP @geelaw 大哥你是对的。刚才测试了一下正常了。但感觉有点奇怪,如 pptSel.Slides(1).Shapes.Count,TextRange.Text 等等没有()就可以运行,但不明白为什么 Copy Paste 需要()。
|
9
geelaw 2018-10-04 17:56:42 +08:00 1
@gamecmt #7 那些是 properties,就像 Python 的 properties 也不需要括号就能访问 getter/setter。
任何正常的语言都会把 COM 绑定到该语言最合适的构造。 VBA 代码不需要括号,是因为 BASIC 里面调用 sub/function 并丢弃返回值(也就是整个语句是一个调用的时候)的语法就是 被调用者的名字 参数 1, 参数 2, ... 没有参数就没有列表,所以后面是空的。 |
11
PythonAnswer 2018-10-05 05:02:07 +08:00
用 vba 直接写吧
|