Python 将多张图片插入到excel中并统一设置大小
文章目录
1.任务目标
我的一个闺蜜是开珠宝工作室的,她让我给她做一个珠宝出入库登记表。
珠宝图片有100多张,图片分别存在三个文件夹。
第1个文件夹有94张图片,第2个文件夹有40张图片,第3个文件夹有15张图片。
诉求是每张图片的尺寸不一样,她希望存放到文件夹里图片的尺寸大小是一样的。
2.准备工作
1)新建文件夹【珪玥珠宝】。
2)在【珪玥珠宝】文件夹中新建三个文件夹,分别命名为【images1】【images2】【images3】。
3)将要处理的图片分别存放到【images1】【images2】【images3】文件夹中。
4)对【images1】【images2】【images3】文件夹里的图片进行重命名。
5)在【珪玥珠宝】文件夹中新建1个excel文件,命名为【珪玥珠宝库存表.xlsx】。
5)用vscode 编辑器打开【珪玥珠宝】文件夹,并在该文件夹下新建一个.py或.ipynb文件。
重命名方法
1)全选照片:【ctrl】+【A】。
2)按【F2】,第一张图片的名称会变为蓝色。
3)输入字【图】后按回车。
得到的图片如下图所示:
重复上面的动作,将三个文件夹里的图片的名字都进行重命名。
重命名的目的是用数字排序,方便后面的循环插入图片。
【温馨提示】
注意一个文件夹里的图片类型必须一致。
可以都是【.jpn】。
可以都是【.jpeg】。
根据需要设置Excel
相对路径的获取方法
鼠标右键点击【图片(1)】。
【复制相对路径】。
注意区分路径中的括号是英文输入法下输入的。
3.实操练习
1.插入一张图片
# import 库名 导入库
import openpyxl
# 打开刚才新建的工作薄
# wb对象= 库名.方法(path)
# load_workbook是openpyxl的方法,作用是打开工作薄
# path='珪玥珠宝库存表.xlsx'
# 这里的path 是相对路径
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
# 工作薄里有3个工作表【图1】【图2】【图3】
# wb对象[工作表名]确定要插入的工作表
# 我这里先往【图3】工作表中插入图片
ws=wb['图库3']
# 自定义【图3】工作表第3行的高度
# 第一张图片要插入的位置是B3(B列,第3行)
# 工作表对象有row_dimensions 和column_dimensions属性,可以控制行高和列宽。
# ws对象.row_dimensions[行]高=值
ws.row_dimensions[3].height=80
# 根据指定的图像文件创建img图像
# img对象=库名.drawing.image.Image(path)
# 注意第1个image的i是小写
# 注意第2个Image的I是大写
# path = 'images3\图 (1).jpeg'
# path 是图 (1)的相对路径
img=openpyxl.drawing.image.Image('images3\图 (1).jpeg')
# 设置图片的宽度
# 图片对象.width = 值
img.width = 114
# 设置图片的高度
# 图片对象.height = 值
img.height = 101
# 在B3单元格中添加img图像
ws.add_image(img,'B3')
# 图片插入后将工作薄另存为'结果表1—珪玥珠宝库存表.xlsx'
wb.save('结果表1—珪玥珠宝库存表.xlsx')
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
程序结束!
代码运行后,【图库3】工作表【B3】单元格中成功插入了一张图片。
如果提示没有找到图片(在不是相对路径错误的情况下),可以在代码开头加入下面的代码。
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
2.一次性插入4张图片
插入一张图片成功后,我们来试试插入4张图片。
批量插入图片是一个重复的动作。
重复的动作通常需要for 循环。
这里有3个需要循环的内容:
1)行的宽度需要循环:第3、4、5、6行。
2)插入每张图片的路径。
3)插入图片的单元格需要循环:B3、B4、B5、B6
循环修改行高
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
import openpyxl
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
ws=wb['图库3']
# for循环后必须加英文冒号:
# for循环后的代码有缩进
# for循环控制修改需要的行高
# range(3,7)修改的是3456行行高
# range函数含前不含后,含3不含7
for i in range(3,7):
# 查看i的值
# 这不是必须的代码,初学者可以加
print(i)
ws.row_dimensions[i].height=80
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
3
4
5
6
程序结束!
循环修改图片相对路径
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
import openpyxl
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
ws=wb['图库3']
# for循环后必须加英文冒号:
# for循环后的代码有缩进
# for循环控制修改需要的行高
# range(3,7)修改的是3456行行高
# range函数含前不含后,含3不含7
for i in range(3,7):
# 查看i的值
# 这不是必须的代码,初学者可以加
#print(i)
ws.row_dimensions[i].height=80
# 创建一个变量用来批量修改图片的路径
# 行是从3开始计数的,图片是从1开始计数的
# 因此用i-2
n = i-2
# 查看路径是否正确
# 这不是必须的代码,初学者可以加
path ='images3\图 (%d).jpeg ' % n
print(path)
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
images3\图 (1).jpeg
images3\图 (2).jpeg
images3\图 (3).jpeg
images3\图 (4).jpeg
程序结束!
循环修改单元格
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
import openpyxl
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
ws=wb['图库3']
# for循环后必须加英文冒号:
# for循环后的代码有缩进
# for循环控制修改需要的行高
# range(3,7)修改的是3456行行高
# range函数含前不含后,含3不含7
for i in range(3,7):
# 查看i的值
# 这不是必须的代码,初学者可以加
#print(i)
ws.row_dimensions[i].height=80
# 创建一个变量用来批量修改图片的路径
# 行时从3开始计数的,图片是从1开始计数的
# 因此用i-2
n = i-2
# 查看路径是否正确
# 这不是必须的代码,初学者可以加
path ='images3\图 (%d).jpeg ' % n
# print(path)
# 设置变量存储单元格
# 一个单元格:B3
# 多个单元格:'B%d' % i
cell = 'B%d' % i
print(cell)
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
B3
B4
B5
B6
程序结束!
一次性插入4张图片的综合代码
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
import openpyxl
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
ws=wb['图库3']
# for循环后必须加英文冒号:
# for循环后的代码有缩进
# for循环控制修改需要的行高
# range(3,7)修改的是3456行行高
# range函数含前不含后,含3不含7
for i in range(3,7):
# 查看i的值
# 这不是必须的代码,初学者可以加
#print(i)
ws.row_dimensions[i].height=80
# 创建一个变量用来批量修改图片的路径
# 行是从3开始计数的,图片是从1开始计数的
# 因此用i-2
n = i-2
# 查看路径是否正确
# 这不是必须的代码,初学者可以加
path ='images3\图 (%d).jpeg ' % n
# print(path)
# 设置变量存储单元格
# 一个单元格:B3
# 多个单元格:'B%d' % i
cell = 'B%d' % i
#print(cell)
# 根据指定的图像文件创建myImage1图像
img=openpyxl.drawing.image.Image(path)
# 设置图片的宽度
img.width = 114
img.height = 101
# 在B3单元格中添加img图像
ws.add_image(img,cell)
# 图片插入后将工作薄另存为'结果表2—珪玥珠宝库存表.xlsx'
wb.save('结果表2—珪玥珠宝库存表.xlsx')
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
程序结束!
代码运行后,我们打开工作表【‘结果表2—珪玥珠宝库存表.xlsx’】发现我们成功插入了4张图片。
4.最终代码
在不同的工作表中插入图片需要修改3个参数:
1)工作表名称。
2)图片所在的文件夹【images1】【images2】【images3】。
3)图片的类型:我的【images1】文件夹存放的图片类型为JPG,【images2】文件夹存放的图片类型为JPEG。
【示例】
在【图库1】工作表中插入图片,需要修改的代码:
ws=wb['图库1']
path ='images1\图 (%d).jpg ' % n
在【图库2】工作表中插入图片,需要修改的代码:
ws=wb['图库2']
path ='images2\图 (%d).jpeg ' % n
【备注】
工作表名称和图片文件夹名称也可以用循环,为了不增加理解难度,这里省去。
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x:None
import openpyxl
wb=openpyxl.load_workbook('珪玥珠宝库存表.xlsx')
ws=wb['图库1']
# 图库1有94张照片,需要94行
# 表格标题和列索引占了2行
# 因此range函数为(3,97)
for i in range(3,97):
ws.row_dimensions[i].height=80
n = i-2
path ='images1\图 (%d).jpg ' % n
cell = 'B%d' % i
img=openpyxl.drawing.image.Image(path)
# 设置图片的宽度
img.width = 114
img.height = 101
# 在B3单元格中添加img图像
ws.add_image(img,cell)
# 图片插入后将工作薄并保存
wb.save('结果表—珪玥珠宝库存表.xlsx')
# 加一个输出,查看程序运行情况
print('图 (%d)插入成功 ' % n)
# 加一个输出,验证程序运行是否有错误
print('程序结束!')
【终端输出】
图 (1)插入成功
图 (2)插入成功
图 (92)插入成功
图 (93)插入成功
图 (94)插入成功
程序结束!
代码运行成功后,我们就成功插入了94张图片。
5.我的碎碎念
代码运行时间较长或代码相对复制,我通常会加一个输出,可以观察代码的运行情况。
print('图 (%d)插入成功 ’ % n)的功能如下图所示:
我今天写的特别啰嗦,我把最终的运行代码分成了如下几个步骤:
1.插入1张图片
2.插入4张图片
3.循环修改行高
4.循环修改图片名
5.循环修改图片相对路径
6.最终的运行代码
面对相对复制的代码,初学者通常不可能一次性写对。
但如果不分步骤写,初学者也很难找到报错的原因。
因此我建议大家将一个复杂的工作拆分成若干个步骤。
一个一个来完成,这样哪一步有错误,比较方便修改。
另外,我们在做工作量很大的输出时,例如要插入100张图片,那我们先写一个插入4张图片的代码,要爬取某网站前100页的内容,那我们先写爬取前4页的代码。
因为要重复操作越多,代码运行的时间越久。
为了快速找出存在问题,先写一个操作量小一点代码试运行。