下面是Python实现读取Excel中的图片功能的完整实例教程:
1. 准备工作
在开始我们的实例之前,需要先安装xlrd
和Pillow
两个库。xlrd
库用于读取Excel文件,Pillow
库用于处理图片。可以使用以下命令进行安装:
pip install xlrd Pillow
2. 读取Excel中的图片
使用xlrd
库可以轻松读取Excel中的图片。具体实现步骤如下:
- 导入
xlrd
库和Pillow
库。
import xlrd
from PIL import Image
- 打开Excel文件。
workbook = xlrd.open_workbook('test.xlsx')
- 获取所有工作表。
sheets = workbook.sheet_names()
- 遍历每个工作表,读取图片。
for sheet_name in sheets:
sheet = workbook.sheet_by_name(sheet_name)
for i in range(sheet.nrows):
for j in range(sheet.ncols):
if sheet.cell(i, j).ctype == 2 and 'image' in sheet.cell(i, j).value:
image = sheet.cell(i, j).value.split(":")[-1]
_, _, row_str, col_str = re.split('(\d+)', image)
img_row = int(row_str) - 1
img_col = col_str_to_col_num(col_str) - 1
image_data = sheet.cell(i, j).value
if image_data.startswith('data:image/jpeg;base64,'):
image_data = image_data.replace('data:image/jpeg;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open(f'{sheet_name}_{i+1}_{j+1}.jpg', 'wb') as f:
f.write(image_data)
elif image_data.startswith('data:image/png;base64,'):
image_data = image_data.replace('data:image/png;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open(f'{sheet_name}_{i+1}_{j+1}.png', 'wb') as f:
f.write(image_data)
这里通过遍历每个单元格,找到其中的图片,并将图片数据转换为本地文件保存。我们选择将图片保存为jpg和png两种格式,当然也可以根据需要选择其他格式。对于图片格式的转换,可以使用Pillow
库进行操作。
3. 示例说明
示例1:读取单个图片
首先我们创建一个名为test.xlsx
的Excel文件,其中包含一张名为image1.jpg
的图片。运行以下代码可以读取该图片并保存到本地。
import xlrd
from PIL import Image
workbook = xlrd.open_workbook('test.xlsx')
sheet = workbook.sheet_by_name('Sheet1')
for i in range(sheet.nrows):
for j in range(sheet.ncols):
if sheet.cell(i, j).ctype == 2 and 'image' in sheet.cell(i, j).value:
image = sheet.cell(i, j).value.split(":")[-1]
_, _, row_str, col_str = re.split('(\d+)', image)
img_row = int(row_str) - 1
img_col = col_str_to_col_num(col_str) - 1
image_data = sheet.cell(i, j).value
if image_data.startswith('data:image/jpeg;base64,'):
image_data = image_data.replace('data:image/jpeg;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open('image1.jpg', 'wb') as f:
f.write(image_data)
elif image_data.startswith('data:image/png;base64,'):
image_data = image_data.replace('data:image/png;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open('image1.png', 'wb') as f:
f.write(image_data)
示例2:读取多个图片
接下来我们创建一个名为test2.xlsx
的Excel文件,其中包含多张图片。运行以下代码可以读取所有图片并保存到本地。
import xlrd
from PIL import Image
def col_str_to_col_num(col_str):
num = 0
for c in col_str:
if c.isalpha():
num = num * 26 + (ord(c.upper()) - ord('A')) + 1
return num
workbook = xlrd.open_workbook('test2.xlsx')
sheets = workbook.sheet_names()
for sheet_name in sheets:
sheet = workbook.sheet_by_name(sheet_name)
for i in range(sheet.nrows):
for j in range(sheet.ncols):
if sheet.cell(i, j).ctype == 2 and 'image' in sheet.cell(i, j).value:
image = sheet.cell(i, j).value.split(":")[-1]
_, _, row_str, col_str = re.split('(\d+)', image)
img_row = int(row_str) - 1
img_col = col_str_to_col_num(col_str) - 1
image_data = sheet.cell(i, j).value
if image_data.startswith('data:image/jpeg;base64,'):
image_data = image_data.replace('data:image/jpeg;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open(f'{sheet_name}_{i+1}_{j+1}.jpg', 'wb') as f:
f.write(image_data)
elif image_data.startswith('data:image/png;base64,'):
image_data = image_data.replace('data:image/png;base64,', '')
image_data = bytes(image_data, encoding="utf8")
image_data = base64.decodebytes(image_data)
with open(f'{sheet_name}_{i+1}_{j+1}.png', 'wb') as f:
f.write(image_data)
此时我们可以发现,在同一目录下生成了多个图片文件,以sheet_name_row_col.jpg/png
的形式命名。这些文件就是我们从Excel文件中成功读取到的图片。