关于openpyxl读取excel中图片(shape)的注意点

关于读取Excel中图片以及其位置的解决方案(免费),有如下两种:

  1. Microsoft.Office.Interop.Excel
  2. openpyxl

Microsoft.Office.Interop.Excel的使用就不多讲了,很简单,只是要依赖Excel程序,能够处理各个版本的Excel。

其实在我测试openpyxl之前,我一直以为python只能够简单读取excel内容和格式,经过今天的试用,我发现其实openpyxl可以读取到excel的几乎所有的内容(当然,这得益于微软将excel改成xml存储)。
接下来,讲一下openpyxl如何读取excel中的图片,openpyxl有多么强大,用过就知道了。

一开始,我习惯性的使用openpyxl只读模式去读取excel,心里以为这样可以更快读取到内容。当我发现这样只能读取到excel的单元格的值时,我很失望。可是我一定要取出来图片的信息,怎么办呢?于是我自己用python写解析excel的代码,写着写着,发现excel真的内容太多了,我写个局部读取指定信息的还可以,但是要全部读取,太多了,一时间是无法完成的。想想openpyxl也是去读取xml的,已经推出来这么久了,肯定很全面,只是我哪里设置得不对。

于是,我就单步运行load excel文件,终于发现两处导致我读不到图片的原因。第一处,不能使用只读模式;第二处,必须安装pillow。
解决这两个问题后,就可以顺利取到图片的信息以及图片在excel中的位置了。

### 如何使用 Python 的 openpyxl读取 Excel 文件 以下是通过 `openpyxl` 库读取 Excel 文件的具体方法: #### 安装依赖库 在开始之前,需要安装 `openpyxl` 库。可以通过以下命令完成安装: ```bash pip install openpyxl ``` #### 基本代码示例 下面提供了一个简单的例子来展示如何加载并读取 Excel 文件的内容[^1]。 ```python from openpyxl import load_workbook # 加载现有的Excel文件 workbook = load_workbook(filename="example.xlsx") # 获取活动的工作表(默认第一个工作表) sheet = workbook.active # 遍历每一行的数据 for row in sheet.iter_rows(values_only=True): print(row) ``` 上述代码实现了以下几个功能: - 使用 `load_workbook()` 函数加载指定的 `.xlsx` 文件。 - 调用 `active` 属性获取当前活跃的工作表。 - 利用 `iter_rows()` 方法遍历表格中的所有行,并打印每行的值。 如果需要访问特定单元格的值,则可以直接索引该单元格的位置。例如: ```python cell_value = sheet["A1"].value print(cell_value) ``` 这会输出 A1 单元格内的内容[^2]。 #### 处理更复杂的情况 对于某些特殊需求,比如提取嵌入式图片,可以参考如下扩展逻辑[^3]: ```python from openpyxl import load_workbook from PIL import Image import numpy as np import cv2 from io import BytesIO def extract_image(sheet, image_obj): """ 将openpyxl读取图片转换为PIL图像 """ img_bytes = image_obj._data() pil_img = Image.open(BytesIO(img_bytes)) # 如果需要进一步处理成数组形式 img_array = np.array(pil_img) # 对于颜色通道调整(BGR -> RGB), 可选操作 if len(img_array.shape) == 3 and img_array.shape[2] == 3: img_array = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB) return img_array workbook = load_workbook("example_with_images.xlsx") sheet = workbook.active images = [] for rel_id in sheet._rels.keys(): try: drawing = sheet.drawing._charts_or_images[int(rel_id.split('rId')[1]) - 1] images.append(extract_image(sheet, drawing)) except Exception as e: continue if images: first_image = images[0] cv2.imwrite("extracted_image.jpg", first_image) ``` 此脚本展示了如何从 Excel 表单中抽取图片资源,并将其保存至本地磁盘上作为 JPEG 图像文件。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值