【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说明有【图片名称列中有重复值】,导致图片同名被覆盖保存了!");
}   
 

广西
浏览 568
2
3
分享
3 +1
2
2 +1
全部评论 2
 
马成功老师
马成功老师 WPS资深用户Lv.3 优质创作者KVPWPS函数专家

Lv.3 优质创作者

感谢大神的分享。我感觉,这种需求,龙虾或许也能实现吧?
举报
0
1
叶文荣
我还不懂用AI呀,求详细教程。
· 广西
举报
0
0