Python实现读取excel中的图片功能

  • Post category:Python

下面是Python实现读取Excel中的图片功能的完整实例教程:

1. 准备工作

在开始我们的实例之前,需要先安装xlrdPillow两个库。xlrd库用于读取Excel文件,Pillow库用于处理图片。可以使用以下命令进行安装:

pip install xlrd Pillow

2. 读取Excel中的图片

使用xlrd库可以轻松读取Excel中的图片。具体实现步骤如下:

  1. 导入xlrd库和Pillow库。
import xlrd
from PIL import Image
  1. 打开Excel文件。
workbook = xlrd.open_workbook('test.xlsx')
  1. 获取所有工作表。
sheets = workbook.sheet_names()
  1. 遍历每个工作表,读取图片。
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文件中成功读取到的图片。