WPS中单元格批量嵌入图片

当前Excel表格中sheet1的内容如下:

序号 图片
1
2
3

要在图片的位置插入与序号相匹配的图片,如:1.jpg、2.jpg、3.jpg、…….,依次往下。

我们可以使用WPS中的来完成这一功能,具体操作如下:

1.打开宏开发工具

按住键盘的ALT+F11,即可快捷进入宏开发工具。

或者选择上方菜单栏的“工具” -> “开发工具” -> “WPS宏编辑器” 也可以进入宏开发工具。

2.编写wps.js宏代码

需要注意的是:WPS中的JavaScript宏和Office中的VBA宏存在语法上的差异,如果要在WPS软件中使用VBA宏,需要购买VBA宏的使用权限,这里不做讨论。

WPS中,宏的语法规则为JavaScript语法。

在上一步中,进入宏开发工具后,会生成一个模块(默认名称为Module1),可以直接将下面的代码直接粘贴到编辑器中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// JavaScript宏功能说明:
// 该JavaScript宏用于在WPS表格的Sheet1工作表中,从第2行开始遍历列A,根据每个单元格的文本值构建图片文件路径,
// 然后将图片嵌入到工作表中的相应位置。

// 函数名称:EmbedImages
// 功能描述:
// - 获取工作表对象
// - 从第2行开始遍历列A中的每个单元格
// - 获取单元格的文本值,构建对应的图片文件路径
// - 获取单元格的位置信息(Top和Left)
// - 使用Shapes.AddPicture方法将图片嵌入到工作表中的相应位置
function EmbedImages() {
    // 获取工作表对象
    var ws = ThisWorkbook.Sheets("Sheet1");
    // 指定图片文件夹路径
    var imageFolderPath = ThisWorkbook.Path + "\\"  		 // 指定图片的位置为当前Excel表的路径
	// var imageFolderPath = "C:\\Users\\admin\\Desktop\\";  // 指定图片位置为任意其他文件夹

    // 从第2行开始遍历列A中的每个单元格
    for (var i = 2; i <= ws.Cells(ws.Rows.Count, "A").End(xlUp).Row; i++) {
        // 获取单元格的文本值
        var imageName = ws.Range("A" + i).Text;

        // 构建图片文件路径
        var imagePath = imageFolderPath + imageName + ".jpg";

        // 获取单元格的位置信息
        var top = ws.Range("A" + i).Top;
        var left = ws.Range("A" + i).Offset(0, 1).Left;

        // 插入图片到工作表,设置位置和大小
        try {  // 由于文件可能不存在,这里加上try语句
			ws.Shapes.AddPicture(imagePath, false, true, left, top, 100, 50);
        } catch (e) {        
        }
    }
}

这样,就生成了一个名为EmbedImages的宏。

可以根据自己的需要,修改代码中的各项参数。

由于wps.js中不支持判断文件是否存在,那么就使用try...catch... 语句直接进行插入。

  • 如果文件存在,则插入图片成功;
  • 如果文件不存在,则会抛出异常。为了不中断程序的运行,在catch语句块中什么也不做,相当于跳过不存在的文件。

参考:在表格中按名称批量插入对应图片

参考中的Dir()方法无效,无论文件是否存在,都会返回空字符串,所以需要使用try...catch... 语句。

3.运行宏

回到Excel表中,选择“工具” -> “运行宏”,就可以看到刚才定义的EmbedImages宏,选择运行即可。

注:如果多次运行宏,则会多次插入图片。

4.图片内嵌入单元格

上面这样得到的图片在Excel中是悬浮插入的,如果希望在单元格中嵌入图片,则需要进入如下的操作。

先选中其中一张图片,然后按Ctrl+A全选图片,鼠标右键,选择“图片嵌入单元格”,即可完成所有图片的单元格内嵌。

5.对前面方法的改进

前面的方法需要手动将悬浮的图片转为单元格嵌入的图片,而且如果多次运行宏,会出现重复多次插入的情况,为了改善这一问题,对上面的插入图片的代码进行修改,将插入图片的方式改为单元格内嵌,代码如下:

1
ws.Range("A" + i).Offset(0, 1).GetRangeEx().InsertCellPicture(imagePath)

完整代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function EmbedImages() {
    var ws = ThisWorkbook.Sheets("Sheet1");
    var imageFolderPath = ThisWorkbook.Path + "\\" 

    // 从第2行开始遍历列A中的每个单元格
    for (var i = 2; i <= ws.Cells(ws.Rows.Count, "A").End(xlUp).Row; i++) {
        // 获取单元格的文本值
        var imageName = ws.Range("A" + i).Text;

        // 构建图片文件路径
        var imagePath = imageFolderPath + imageName + ".jpg";

        // 获取单元格的位置信息
        var top = ws.Range("A" + i).Top;
        var left = ws.Range("A" + i).Offset(0, 1).Left;
        
        try {
            // ws.Shapes.AddPicture(imagePath, false, true, left, top, 100, 50);
            // 插入图片的方式改为‘单元格内嵌’
			ws.Range("A" + i).Offset(0, 1).GetRangeEx().InsertCellPicture(imagePath)
    	} catch (e) {
    	}
    }
}

这样修改之后,运行宏,得到的图片就是单元格内嵌的,而且多次运行宏,也不会出现重复插入的情况。

0%