【WPS表格 批量保存图片】把WPS表格中的图片按照指定列的值来命名并保存到文件夹中
接上一个帖子(批量插入图片https://bbs.wps.cn/topic/91037),上一个帖子说到,追M多年,经常捣鼓表格,常常遇到要把大量的照片嵌入表格中,但有时是反着来的,就是将表格中的图片保存到文件夹中打压缩包,而且要求图片名称要与表格上的一致,同样我也经过很漫长时间的不断编写测试,终于也给捣鼓出来了!这个JSA宏只是简单实现了保存图片的功能,做得并不美观好看,但对于我来说已经足够用了,有兴趣的可以接着继续改进优化,并将改进的核心代码放在评论区,这样大家都能学习进步。
功能:把WPS表格中的图片按照指定列的值来命名并保存到文件夹中
分两种方式保存:
1.图片保存在同一个目录文件夹中(默认)
2.图片分散保存在不同层级的目录文件夹中
注意:必须先把图片设置为浮动图片才能保存
由于一个帖子的字数是有限制的,不能超过5000字,然而这个保存图片的JSA宏代码已经11000多字了,所以代码也不能发在帖子里,我把宏放在WPS表格中了(.xlsm格式),然后共享出来变成WPS云文档,点击链接打开云文档,再下载到桌面(是“下载”),就可以导出JSA宏代码了(.js格式),等到哪个表格的图片要保存图片再导入js进去就以用了,很方便的。
等有时间再录个视频简单操作一遍,这样就一目了然了,这样就省下摸索怎么用的时间。(视频已录好放在下面)
含有JSA宏代码的WPS云文档:https://www.kdocs.cn/l/cile4vRsVBXn
实操视频:https://www.bilibili.com/video/BV1ADTi68EwM/
因为代码字符数已超过帖子允许的最大字符数,所以只能粘贴出其中关键处的代码(完整代码在云文档里面),部分关键代码如下:
//创建目录
function 创建目录(图片列字母,名称列的列数差,目录层级列的列数差){
const sheet = Application.ActiveSheet;
const lastRow = sheet.Cells(sheet.Rows.Count, 图片列字母).End(xlUp).Row;
//获取各张图片要保存到的目录层级并放在一个列表内
let 目录层级集合 = new Set(); // 初始数据
for(pic of ActiveSheet.Shapes){//遍历当前表格中的所有图片以图片列为中心列获取目录层级数据
if(pic.Type == msoPicture){ //判断是否为图片类型,避免导出形状按钮
var 目录层级 = pic.TopLeftCell.Offset(0,目录层级列的列数差); //获取图片要保存到的目录
//Console.log("目录:"+目录)
目录层级集合.add(目录层级);// 添加元素
}
}
var 目录层级列表 = [...目录层级集合];//去重
Console.log(目录层级列表);
// 拼接完整的目录,然后创建目录
for (let i = 0; i < 目录层级列表.length; i++) {
Console.log("\ni" + i + ":" + 目录层级列表[i]);
var 内部目录列表 = String(目录层级列表[i]).split("\\");//将遍历到的元素转为字符串 如:辽宁省\朝阳市\朝阳县"
var 每次创建的目录 = ThisWorkbook.Path + "\\" + "保存好的图片(在不同的目录层级中)"; //设置初始值
try {
MkDir(每次创建的目录);//新建文件夹
}catch(exception){
try{
Kill(每次创建的目录+"\\*.*");//清空文件夹
}catch(exception){
};
}
for (let j = 0; j < 内部目录列表.length; j++){
Console.log("j" + j + ":" + 内部目录列表[j]);
var 每次创建的目录 = 每次创建的目录 + "\\" + 内部目录列表[j];
Console.log("每次创建的目录:" + 每次创建的目录);
try {
MkDir(每次创建的目录);//新建文件夹
}catch(exception){
try{
Kill(每次创建的目录+"\\*.*");//清空文件夹
}catch(exception){
};
}
}
}
保存图片到对应层级的目录中(名称列的列数差,目录层级列的列数差);
}//保存图片到对应层级的目录中
function 保存图片到对应层级的目录中(名称列的列数差,目录层级列的列数差){
//遍历当前表格中的所有图片以图片列为中心列获取目录层级数据
n = 0;
for(pic of ActiveSheet.Shapes){ //遍历当前表格中的所有图片以图片列为中心列获取目录层级数据
if(pic.Type == msoPicture){ //判断是否为图片类型,避免导出形状按钮
var 目录层级 = pic.TopLeftCell.Offset(0,目录层级列的列数差); //获取图片要保存到的目录
var 图片名称 = pic.TopLeftCell.Offset(0,名称列的列数差); //获取图片名称
var 图片的完整地址 = ThisWorkbook.Path + "\\" + "保存好的图片(在不同的目录层级中)" + "\\" + 目录层级 + "\\" + 图片名称 + ".png"; //拼接出完整的地址
isPathValid(图片的完整地址) //检查文件名(含绝对路径)是不有非法字符(< > : " / \ | ? * 以及ASCII控制字符0-31)和保留名称(CON, PRN, AUX, NUL, COM1-COM9, LPT1-LPT9)
Console.log("图片的完整地址:"+图片的完整地址);
pic.SaveAsPicture(图片的完整地址); //按地址保存图片
n += 1;
}
}
MsgBox("已成功保存了"+n+" 张图片!\n如果文件夹中图片的图片不是“"+n+"”张,\n说明有【图片名称列中有重复值】,导致图片同名被覆盖保存了!");
}
Lv.3 优质创作者