【WPS表格批量插入图片】用JSA宏将文件夹中的图片按照指定列的值批量地插入到指定的列对应单元格中

追M多年,经常捣鼓表格,常常遇到要把大量的照片嵌入表格中,还得要与名字一 一对应,如果一张张嵌入不但费时还容易错,为了解决这个烦恼,想到了JSA宏,因为自己不懂,所以写宏代码的过程很曲折,但我最终还是捣鼓出来了。我写这个JSA宏的初衷只是想解决当前问题提高效率,所以不完善的地方得靠大家继续改进,将改进的关键代码发在评价区,这样大家都有收获。

/*
功能: 将文件夹中的图片按照指定列的值批量地插入到指定的列对应的单元格中
注意:
①先把要用到的图片全部放到一个文件夹中
②文件夹中图片的文件名必须与表格中指定列的值一致(不要有空格或其他字符干扰)
③目前仅支持png、jpg、jpeg、gif、webp这五种格式的图片
2025-2-2叶文荣整理编写
2025-7-6更新优化,增加支持两种图片格式,增加中途取消功能,增加缺图片名单统计功能
2025-7-26更新:插入图片时直接插入,不再插入浮动的图片,增加支持gif格式图片
2026-1-5更新:新增支持webp格式的图片
*/
function 将文件夹中的图片按照指定列的值批量地插入到指定的列对应的单元格中(图片文件夹,名称列字母,名称列序号,目标列字母,目标列序号){
    var sheet = Application.ActiveSheet;
    lastrow = Range(名称列字母+Rows.Count).End(3).Row //最后数据行号
    //// 保存原来的行高 
    //var originalHeights = [];
    //for (var i = 1; i <= lastrow; i++) {
    //    originalHeights[i] = sheet.Rows(i).RowHeight;
    //}
    // //恢复原来的行高 
    //for (var i = 1; i <= lastrow; i++) {
    //    sheet.Rows(i).RowHeight = originalHeights[i];
    //}
    
    var 缺少图片的名单列表 =[]
    for( i = 1;i <= lastrow;i++){     //从第1行循环到最后一行
        图片名 = Cells.Item(i, 名称列序号)  //cell(行,列)图片名称
        Console.log(`\n当前坐标:(${i},${名称列序号})\n当前名称:${图片名}`) 
        rg = Cells.Item(i, 目标列序号)  //cell(行,列)图片插入的单元格
        png_file = 图片文件夹 +"\\" + 图片名 + ".png"      //图片路径
        jpg_file = 图片文件夹 +"\\" + 图片名 + ".jpg"      //图片路径
        jpeg_file = 图片文件夹 +"\\" + 图片名 + ".jpeg"      //图片路径
       gif_file = 图片文件夹 +"\\" + 图片名 + ".gif"      //图片路径
       webp_file = 图片文件夹 +"\\" + 图片名 + ".webp"      //图片路径
            
        if(Dir(png_file)){                //判断文件夹中图片是否存在
            //如果png格式的图片存在则插入单元对应单元格
            rg.GetRangeEx().InsertCellPicture(png_file);
        } else if (Dir(jpg_file)) {
            //如果jpg格式的图片存在则插入单元对应单元格
            rg.GetRangeEx().InsertCellPicture(jpg_file);
        } else if (Dir(jpeg_file)) {
            //如果jpeg格式的图片存在则插入单元对应单元格    
            rg.GetRangeEx().InsertCellPicture(jpeg_file);
        }  else if (Dir(gif_file)) {
            //如果gif格式的图片存在则插入单元对应单元格    
            rg.GetRangeEx().InsertCellPicture(gif_file);
        } else if(Dir(webp_file)){
            //如果webp格式的图片存在则插入单元对应单元格    
            rg.GetRangeEx().InsertCellPicture(webp_file);    
        } else {
            //如果以上三种格式的图片都不存在则记录名单
            if (String(图片名)!==""){
                缺少图片的名单列表.push(String(图片名));  
            } 
            Console.log(`缺少图片的名单列表:${缺少图片的名单列表}`)           
        }
    }
    // 从第3行开始将行高调整为13.8
    for (var i = 3; i <= lastrow; i++) {
        sheet.Rows(i).RowHeight = 13.8;
    }
    
    if (缺少图片的名单列表.length >0) {
        var response = MsgBox(`${JSON.stringify(缺少图片的名单列表)}\n\n以上是找不到图片的名单!\n\n请先记录好这些名称,再用《A提取文件夹中的文件名2025-07-5更新.bat》获取文件夹中的图片名,然后再粘贴表格中做高亮核对!\n\n`, jsOKOnly + jsExclamation, "提示");
        if (response === 1) {                      // 用户点击“确定”后立即终止宏执行 
            Console.log(`缺少图片的名单:${JSON.stringify(缺少图片的名单列表)}`); 
            //Application.EnableEvents = false;      // 终止当前执行的宏
            //Application.ScreenUpdating = true;     // 恢复当前执行的宏
            //throw "所有宏执行已被终止";             // 抛出错误终止执行 
        }
    } 
}

function 批量插入图片(){
    alert("功能:\n将文件夹中的图片按照指定列的值批量地插入到指定的列对应的单元格中\n\n注意:\n①先把要用到的图片全部放到一个文件夹中\n②文件夹中图片的文件名必须与表格中指定列的值一致\n③目前仅支持png、jpg、jpeg、gif、webp这五种格式的图片\n2026-1-5更新")
    //获取名称列的列标
    while (true){
        var sheet = Application.ActiveSheet;
        var 名称列字母 = InputBox("\n请问根据那一列的值来插入图片?\n\n请输入【名称列】的列标字母:","确定名称列").toString().trim().toUpperCase();
        if (名称列字母 === "") {
            return;//  用 户点击“取消”则直接退出宏,没有任何提示
        }
        var 名称列字母 = 名称列字母.match(/[A-Z]{1,3}/);
        if (/[A-Z]{1,3}/.test(名称列字母)) {
            var 名称列序号 = sheet.Range(名称列字母+"1").Column;
            Console.log(`\n名称列字母是:${名称列字母}  列序号t:${名称列序号}`);
            break;
        } else {
            alert("您输入的内容不规范,列标只能是1~3个字母!\n请按要求重新输入!");
            continue;
        }
    }
    
    //获取目标列字母
    while (true){
        var sheet = Application.ActiveSheet;
        var 目标列字母 = InputBox("\n您想把图片插入到哪一列?\n\n请输入列标字母:","确定目标列").toString().trim().toUpperCase();
        if (目标列字母 === "") {
            return;//  用 户点击“取消”则直接退出宏,没有任何提示
        }
        var 目标列字母 = 目标列字母.match(/[A-Z]{1,3}/);
        if (/[A-Z]{1,3}/.test(目标列字母)) {
            var 目标列序号 = sheet.Range(目标列字母+"1").Column
            Console.log(`\n图片列字母是:${目标列字母}  列序号:${目标列序号}`);
            break;
        } else {
            alert("您输入的内容不规范,列标只能是1~3个字母!\n请按要求重新输入!");
            continue;
        }
    }
    
    //选择图片所在的文件夹
    alert("请问图片放在哪个文件夹中?\n\n请选择该文件夹")
    let f = Application.FileDialog(msoFileDialogFolderPicker)
    statu = f.Show()
    if (statu==0){return;}else{
          var 图片文件夹 = f.SelectedItems(1);
        Console.log("您选择的文件夹的是:" + 图片文件夹);
    }
    alert(`名称列字母是:${名称列字母}                列序号:${名称列序号}\n\n列目标字母是:${目标列字母}                列序号:${目标列序号}\n\n您选择的文件夹的是:\n${图片文件夹}`);
    //插入图片
    Application.ScreenUpdating = false; // 关闭屏幕刷新
    将文件夹中的图片按照指定列的值批量地插入到指定的列对应的单元格中(图片文件夹,名称列字母,名称列序号,目标列字母,目标列序号);
    Application.ScreenUpdating = true;// 恢复屏幕刷新
}
广西
浏览 137
2
8
分享
8 +1
2 +1
全部评论