当前位置:首页 > Python > 正文

Python读取Excel图片完整教程 - 使用openpyxl提取图像 | Python技巧

Python读取Excel中的图片 - 完整教程与代码示例

本文将详细介绍如何使用Python提取Excel文件中嵌入的图片。我们将使用openpyxl库完成这个任务,并提供了完整的代码示例和分步说明。

为什么需要读取Excel中的图片?

在日常工作中,Excel文件常被用于存储结构化数据和相关图片资源。但在以下场景中,您可能需要提取其中的图片:

  • 批量导出产品目录中的商品图片
  • 从报表中提取图表和可视化图像
  • 迁移Excel中的图片资源到其他系统
  • 自动化处理包含图片的Excel文档
  • 数据分析前清洗和提取多媒体内容

手动提取效率低下,而使用Python可以自动化这个过程,大大提高工作效率。

准备工作

在开始之前,请确保您已安装以下Python库:

pip install openpyxl pillow

openpyxl:用于读取和操作Excel文件(支持.xlsx格式)
Pillow:Python图像处理库,用于保存图片

注意事项:

  • 本教程适用于.xlsx格式文件(Excel 2007及以上版本)
  • 确保Excel文件没有密码保护
  • 图片需要直接嵌入在Excel中,而非链接到外部文件

读取Excel图片的完整代码

以下是提取Excel文件中所有图片的完整Python代码:

import os
from openpyxl import load_workbook
from PIL import Image

def extract_images_from_excel(excel_path, output_folder):
    """
    从Excel文件中提取所有图片并保存到指定文件夹
    
    参数:
        excel_path (str): Excel文件路径
        output_folder (str): 图片输出文件夹
    """
    # 创建输出文件夹
    os.makedirs(output_folder, exist_ok=True)
    
    # 加载Excel工作簿
    wb = load_workbook(excel_path)
    
    # 遍历所有工作表
    for sheet_name in wb.sheetnames:
        sheet = wb[sheet_name]
        
        # 检查工作表中是否有图片
        if not sheet._images:
            print(f"工作表 '{sheet_name}' 中没有找到图片")
            continue
            
        # 提取图片
        for idx, img in enumerate(sheet._images, 1):
            # 生成唯一文件名
            img_filename = f"{sheet_name}_image_{idx}.png"
            img_path = os.path.join(output_folder, img_filename)
            
            # 保存图片
            with open(img_path, "wb") as f:
                f.write(img._data())
                
            print(f"已保存图片: {img_path}")
            
            # 使用Pillow验证图片
            try:
                img_pil = Image.open(img_path)
                print(f"图片格式: {img_pil.format}, 尺寸: {img_pil.size}")
                img_pil.close()
            except Exception as e:
                print(f"图片验证失败: {e}")

# 使用示例
if __name__ == "__main__":
    excel_file = "示例文件.xlsx"  # 替换为你的Excel文件路径
    output_dir = "excel_images"  # 图片输出目录
    
    extract_images_from_excel(excel_file, output_dir)

代码解析

1. 导入所需库

我们使用三个主要库:

  • os:处理文件和目录路径
  • openpyxl:读取Excel文件内容
  • PIL.Image:验证提取的图片

2. 主要函数功能

  • 创建输出目录:确保保存图片的文件夹存在
  • 加载Excel工作簿:使用openpyxl读取Excel文件
  • 遍历工作表:检查每个工作表中是否包含图片
  • 提取并保存图片:将找到的图片保存为PNG文件
  • 图片验证:使用Pillow确保图片有效

3. 关键点说明

sheet._images:这是openpyxl中访问工作表图片的主要属性,包含所有图片对象
img._data():获取图片的二进制数据,可以直接写入文件
文件命名:使用工作表名称和索引创建唯一文件名,避免覆盖

常见问题与解决方案

问题1:无法找到图片(sheet._images为空)

可能原因:图片可能以形状(Shape)或图表(Chart)形式存在
解决方案:尝试使用以下方法访问:

# 访问所有图形对象
for drawing in sheet._drawings:
    for obj in drawing._shapes:
        if hasattr(obj, '_blip'):
            # 处理图片
            img_data = obj._blip.blob

问题2:提取的图片无法打开

可能原因:Excel中存储的可能是特殊格式图像
解决方案:

  • 尝试不同的文件扩展名(.jpg, .png, .bmp)
  • 使用十六进制编辑器检查文件头信息
  • 添加错误处理代码跳过无效图片

问题3:处理大型Excel文件时内存不足

优化建议:

  • 使用read_only=True模式加载工作簿
  • 及时关闭不需要的工作表
  • 分批处理图片
# 使用只读模式减少内存占用
wb = load_workbook(excel_path, read_only=True)

实际应用场景

1. 电商产品图提取

从供应商提供的Excel产品目录中批量提取所有商品图片,自动重命名并分类存储。

2. 报告自动化处理

自动从月度/季度报表Excel中提取所有图表和截图,生成PPT或PDF报告。

3. 数据迁移

将Excel中的图片资源迁移到数据库或内容管理系统,保持数据关联性。

4. 文档分析

提取Excel中的图片进行图像识别或内容分析,辅助数据验证和审核。

扩展思路

结合其他Python库如pandas进行数据分析,或使用opencv对提取的图片进行处理, 可以实现更复杂的自动化工作流程,如:图片内容识别、自动分类、尺寸调整等。

结论

通过本教程,您已经掌握了使用Python提取Excel文件中图片的核心技术。借助openpyxl库,我们可以轻松访问和保存Excel中的嵌入图像,实现自动化处理。这项技能在数据处理、文档转换和内容管理等多个领域都有广泛应用。

随着Python生态系统的不断发展,处理Office文档的能力也在不断增强。您可以将此技术与其他Python库结合,构建更强大的办公自动化解决方案。

发表评论