Powershell(7)——批量生成PPT

wils
wils

创作者俱乐部成员

问题来自方盛老师的帖子:当前文件夹里有很多图片,需要新建一个演示文档,每张幻灯片插入3张图片,用完为止。

刚才写了个更详细的帖子,结果一发布就被删除了,还不能编辑,只好简单说一下。。。

代码如下:

🔔

#&cls&powershell -NoProfile -NoLogo "gc '%~0'|out-string|iex"&pause&exit

$arr = (dir -Recurse *.jpg).FullName

$arr = $arr | Get-Random -Count $arr.Count

$ppt = New-Object -ComObject kwpp.application

$ppt.Visible = $true

$p = $ppt.Presentations.Add()

$n = 0

1..[int]($arr.Count/3) | %{

$s = $p.Slides.Add($_, 12)

1..3 | %{

$i = $s.Shapes.AddPicture($arr[($n++)], 0, 1, ($_ * 200), 250)

$i.AnimationSettings.EntryEffect = 3332

}

}

首先可以稍微了解一下powershell的基础

  • $xxx是变量,通过等号将右边表达式的结果赋值给变量,后面可用

  • |是管道符,左侧表达式的结果通过管道传递给右侧表达式,作为参数处理

  • %{}是foreach-object的缩写,表示逐个循环处理左边管道传递过来的数组,大括号里是每次处理的逻辑,$_是每次处理的对象

然后要会查看PPT对象模型的文档,要知道演示文档的常用对象,有哪些属性和方法可用

然后介绍代码:

💡

#&cls&powershell -NoProfile -NoLogo "gc '%~0'|out-string|iex"&pause&exit

这是个小技巧,可以把powershell脚本当成bat批处理,方便用户使用

🔔

$arr = (dir -Recurse *.jpg).FullName

$arr = $arr | Get-Random -Count $arr.Count

dir命令用来获取当前目录里的jpg文件,-Recurse用来包含子文件夹里的jpg,列出所有jpg后,取完整路径,存入数组$arr

应方盛老师需要,第二句用Get-Random命令将$arr数组打乱顺序

📌

$ppt = New-Object -ComObject kwpp.application

$ppt.Visible = $true

$p = $ppt.Presentations.Add()

$n = 0

1..[int]($arr.Count/3) | %{

$s = $p.Slides.Add($_, 12)

1..3 | %{

$i = $s.Shapes.AddPicture($arr[($n++)], 0, 1, ($_ * 200), 250)

$i.AnimationSettings.EntryEffect = 3332

}

}

新建wps演示的com对象,用$ppt变量表示

将$ppt的Visible属性设置为真,意思是显示com对象打开的窗口

在$ppt的Presentations演示文档的集合里,新建Add个空的演示文档,用$p表示

$n用来记录当前处理到哪张图片了,是个从0开始每次加1的序号

[int]($arr.Count/3)用数组长度除以3取整,获得需要新建几张幻灯片

 1..x是生成1到x的序列

%{}是对这个序列循环,在Slides幻灯片的集合里,新建Add一个空幻灯片,需要两个参数,位置等于序号$_,模板为空模板12,这个新的幻灯片用$s表示

然后再对1到3这个序号循环,Shapes是图片图形的集合,插入图片AddPicture有7个参数

  • 显示图片名称,从$arr数组里取第$n项,之所以写成$n++,表示每次取出后序号$n增长1

  • 0表示不连接原图片

  • 1表示图片存入pptx文件

  • ($_ * 200)表示图片的位置横轴由序号乘以200计算出来

  • 250表示图片的纵轴都是一样的

  • 后面还可以加上图片的宽度、高度

当前插入的图片用$i表示,AnimationSettings.EntryEffect属性是图片的进入动画,这里的3332是查询文档得到的飞入动画效果

总的来说,通过查看PPT的对象模型的文档,了解需要处理的对象,及其属性和方法,然后用powershell写一些循环判断,最后保存成bat批处理文件,用户只需要放到图片所在文件夹,双击bat即可批量插入图片创建演示文档

powershell的好处是和外部数据的联系比JS宏方便,无论是遍历图片文件、或是从表格、文档里获取数据、图表,插入演示文档都十分方便

海南省
浏览 86
收藏
6
分享
6 +1
3
+1
全部评论 3
 
Chadwick
感谢Wils老师,能不能再简化方法
· 河北省
回复
 
方盛
方盛

创作者俱乐部成员

Wils老师这个讲的很详细,很感谢Wils老师。但是我看到代码我就头大了,能不用代码也能完成吗?
· 湖北省
回复
 
wils
wils

创作者俱乐部成员

至于ai,它不是去理解你的意思,而是找每个词的同义词,转为向量,去图书馆查类似的句子,所以越是常见的语言越准,反倒是数学问题一点也不靠谱。让ai写powershell代码比较靠谱,python最靠谱,vba不太靠谱,jsa文献太少可能不太行。可以试试https://github.com/xx025/carrot或者https://chatforai.store/
· 海南省
回复