Python 将多张图片插入到excel中并统一设置大小

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页的代码。
因为要重复操作越多,代码运行的时间越久。
为了快速找出存在问题,先写一个操作量小一点代码试运行。

  • 15
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值