Вставка изображения в ячейку
Введение
Точная подгонка изображения под размер одной ячейки — распространённое требование при разработке электронных таблиц, которые служат визуальными отчётами, каталогами продукции, списками сотрудников, панелями мониторинга или инвентарными списками. Вместо того чтобы растягивать изображение на множество ячеек или размещать его произвольно на рабочем листе, может потребоваться чистое изображение, привязанное к ячейке, которое остаётся выровненным с ячейкой, которой оно принадлежит.
Aspose.Cells поддерживает этот сценарий двумя взаимодополняющими способами:
- Подход 1 — размещение плавающего изображения над ячейкой. Добавьте
Pictureна рабочий лист, установите егоplacementв значениеMOVE_AND_SIZEи настройте его якори (upper_left_row,upper_left_column,lower_right_row,lower_right_column) так, чтобы изображение покрывало ровно одну ячейку. - Подход 2 — встраивание изображения непосредственно в ячейку. Присвойте байты изображения свойству
embedded_imageячейки. Изображение автоматически масштабируется, чтобы заполнить область отображения ячейки, и перемещается вместе с ячейкой.
В остальной части этой статьи рассматриваются оба подхода, объясняются соответствующие API и демонстрируется их использование в коде.
Подход 1: размещение изображения над ячейкой
Плавающее изображение — это объект Picture, который находится на слое рисования рабочего листа. Хотя он не принадлежит какой-либо одной ячейке, он привязан к диапазону ячеек. Якорные ячейки изображения — его верхний левый и нижний правый углы — определяют его визуальные границы на рабочем листе. По умолчанию только что добавленное изображение охватывает несколько ячеек.
Чтобы плавающее изображение покрывало ровно одну ячейку, необходимо:
- Добавить изображение с помощью
Worksheet.pictures.add(row, column, stream), который привязывает новое изображение к указанной ячейке. - Установить четыре свойства якоря так, чтобы ограничивающий прямоугольник изображения совпадал с целевой ячейкой.
- Установить
Picture.placementв значениеPlacementType.MOVE_AND_SIZE, чтобы изображение перемещалось и изменяло размер вместе с базовой ячейкой, когда пользователь изменяет ширину столбца или высоту строки.
Привязка изображения к одной ячейке
Якорь изображения определяется четырьмя свойствами с индексами, начинающимися с нуля:
Picture.upper_left_row— индекс строки верхнего края изображения.Picture.upper_left_column— индекс столбца левого края изображения.Picture.lower_right_row— индекс строки нижнего края изображения. Чтобы нижний край изображения оказался у нижней границы строкиr, установите это значение вr + 1.Picture.lower_right_column— индекс столбца правого края изображения. Чтобы правый край изображения оказался у правой границы столбцаc, установите это значение вc + 1.
Например, чтобы точно подогнать изображение под ячейку C6 (индекс строки 5, индекс столбца 2), установите upper_left_row = 5, upper_left_column = 2, lower_right_row = 6 и lower_right_column = 3.
Управление поведением размещения
Picture.placement — это перечисление типа PlacementType, которое управляет поведением изображения при изменении пользователем размера строки или столбца под ним. Рекомендуемое значение для изображения, занимающего одну ячейку, — PlacementType.MOVE_AND_SIZE, при котором изображение перемещается и изменяет размер вместе с базовой ячейкой, сохраняя точное соответствие.
Пошаговые инструкции
- Создайте новый
Workbook(или откройте существующий). - Получите доступ к целевому
Worksheetчерезworkbook.worksheets[0]. - Откройте файл изображения с диска в файловый поток (или в объект
BytesIO) с помощью блокаwith, чтобы поток был корректно закрыт. - Вызовите
worksheet.pictures.add(5, 2, stream), чтобы добавить изображение, привязанное к ячейке C6. Сохраните возвращённую ссылку наPicture. - Установите четыре координаты якоря так, чтобы изображение покрывало только ячейку C6:
upper_left_row = 5,upper_left_column = 2,lower_right_row = 6,lower_right_column = 3. - Установите
picture.placement = PlacementType.MOVE_AND_SIZE, чтобы изображение оставалось выровненным по C6 при изменении размера столбца или строки. - При желании добавьте пример текста в соседние ячейки, чтобы продемонстрировать, что только ячейка C6 содержит изображение.
- Сохраните рабочую книгу на диск в виде файла
.xlsx.
Следующий код демонстрирует полный подход.
import aspose.cells as ac
workbook = ac.Workbook()
worksheet = workbook.worksheets[0]
with open("logo.png", "rb") as fs:
pic_index = worksheet.pictures.add(5, 2, fs)
picture = worksheet.pictures[pic_index]
picture.upper_left_row = 5
picture.upper_left_column = 2
picture.lower_right_row = 6
picture.lower_right_column = 3
picture.placement = ac.PlacementType.MOVE_AND_SIZE
workbook.save("output.xlsx", ac.SaveFormat.XLSX)
Подход 2: встраивание изображения непосредственно в ячейку
Aspose.Cells также предоставляет более простой механизм для изображений, привязанных к ячейке: свойство Cell.embedded_image. Присвоение байтов изображения этому свойству прикрепляет изображение к самой ячейке, как если бы оно было встроенным содержимым.
Как работают встроенные изображения
- Изображение хранится как часть содержимого ячейки, а не как фигура на слое рисования.
- Изображение автоматически масштабируется, чтобы поместиться в отображаемых границах ячейки. Координаты якоря или параметры размещения не требуются.
- Ячейка остаётся обычной ячейкой с реальным адресом, на которую можно ссылаться в формулах, сортировать как часть строки или использовать в других операциях на уровне ячеек.
Это делает Cell.embedded_image наиболее лаконичным вариантом, когда ваша цель — просто «изображение, которое находится внутри этой ячейки».
Пошаговые инструкции
- Создайте новый
Workbook(или откройте существующий). - Получите доступ к целевому
Worksheetчерезworkbook.worksheets[0]. - Прочитайте файл изображения с диска в объект
bytes(например, открыв файл в двоичном режиме и вызвав.read()). - Получите ссылку на целевую ячейку — либо через
worksheet.cells["C6"], либо черезworksheet.cells[5, 2]. - Присвойте объект bytes свойству
embedded_imageячейки. - При желании настройте высоту строки и ширину столбца целевой строки и столбца, чтобы встроенное изображение выглядело более заметным.
- Сохраните рабочую книгу на диск в виде файла
.xlsx.
Следующий код демонстрирует полный подход.
import aspose.cells as ac
workbook = ac.Workbook()
worksheet = workbook.worksheets[0]
# Получить целевую ячейку C6
cell = worksheet.cells["C6"]
# Прочитать файл изображения в массив байтов
with open("logo.png", "rb") as f:
imageData = f.read()
# Встроить изображение непосредственно в ячейку
cell.embedded_image = imageData
# При необходимости настроить высоту строки и ширину столбца, чтобы встроенное изображение было лучше видно
worksheet.cells.set_column_width(2, 30) # Столбец C (индекс 2)
worksheet.cells.set_row_height(5, 100) # Строка 6 (индекс 5)
# Сохранить полученную книгу как файл .xlsx
workbook.save("output.xlsx", ac.SaveFormat.XLSX)
Выбор правильного подхода
Оба подхода дают изображение, которое помещается внутри одной ячейки, но они различаются по способу хранения изображения и его поведению:
-
Используйте плавающее изображение (подход 1), когда:
- Вам нужен более тонкий контроль над размещением, наслоением или выравниванием относительно других объектов рисования.
- Вы хотите, чтобы изображение вело себя как фигура, которую можно выделять, переупорядочивать или группировать с другими фигурами.
- Вам требуется обратная совместимость с кодом, который уже работает с коллекциями
pictures. - Вам необходимо динамически вычислять координаты якоря на основе макета рабочего листа.
-
Используйте встроенное изображение (подход 2), когда:
- Вам нужна максимально простая вставка изображения в ячейку.
- Изображение должно перемещаться вместе с ячейкой, как и любое другое содержимое ячейки.
- Вам не нужно манипулировать изображением как фигурой.
Связанные статьи
- Как вставить изображение в ячейку
- Добавление гиперссылок к изображениям
- Загрузка веб-изображения по URL в рабочий лист Excel
- Управление положением, размером и дизайнерской диаграммой