Как найти ячейки, которые содержат изображения с openpyxl

Я перебираю каждую ячейку в рабочей книге. По какой-то причине, когда openpyxl выполняет итерацию по рабочему листу, содержащему изображение, изображение удаляется. Как это исправить?

Я ищу способ пройти через клетки, которые имеют изображение.

Я не в read_only режим, и не хочу быть, так как я делаю изменения в рабочих листах.

Что-то вроде этого было бы наиболее полезным для меня:

if cell is image:
    pass

1 ответ

Решение

В документации четко указано, что это произойдет:

Предупреждение
В настоящее время openpyxl не читает все возможные элементы в файле Excel, поэтому изображения и диаграммы будут потеряны из существующих файлов, если они будут открыты и сохранены с тем же именем.

[Акцент мой]

Это связано с тем, что изображения и диаграммы не являются обычным содержимым ячеек и хранятся в отдельной части файла. Функциональность для записи изображений есть, но не для их чтения.

Вы можете подождать, пока разработчики реализуют эту функцию, использовать другую библиотеку или сами добавить патч.

Более реалистичным вариантом может быть запись внесенных вами изменений в другой файл, а затем вручную скопировать части без изображения обратно в оригинал.

В идеале, и это, кажется, верно в вашем случае, у вас будут изображения, доступные за пределами электронной таблицы. В этом случае вы можете вставить их обратно при записи файла.

Еще один потенциальный обходной путь - открыть исходный файл в виде zip-файла и извлечь из него изображения (вручную или программно).

https://pypi.org/project/openpyxl-image-loader/

from openpyxl import load_workbook
from openpyxl_image_loader import SheetImageLoader

# Load your workbook and sheet as you want, for example
wb = load_workbook('path_to_file.xlsx')
sheet = wb['required_sheet']

# Put your sheet in the loader
image_loader = SheetImageLoader(sheet)

# And get image from specified cell
image = image_loader.get('A3')

# Image now is a Pillow image, so you can do the following
image.show()

# Ask if there's an image in a cell
if image_loader.image_in('A4):
    print("Got it!")
Другие вопросы по тегам