当前Excel表格中sheet1
的内容如下:
要在图片的位置插入与序号相匹配的图片,如: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) {
}
}
}
|
这样修改之后,运行宏,得到的图片就是单元格内嵌的,而且多次运行宏,也不会出现重复插入的情况。