Камера Excel в Aspose.Cells for Java

Камера Excel — это объект рабочего листа, который отображает живое изображение диапазона ячеек и располагается на слое рисунков как обычное изображение. Aspose.Cells поддерживает два режима создания: динамическое изображение, которое автоматически обновляется при изменении исходных данных, и статическое изображение, которое захватывает однократный снимок диапазона. В этой статье рассматриваются оба подхода, чтобы вы могли выбрать тот, который подходит для вашего макета.

Что такое камера Excel?

Камера Excel по сути является объектом изображения, привязанным к определённой строке и столбцу на слое рисунков рабочего листа. В отличие от обычного вставленного изображения, камера связана с исходным диапазоном через формулу в стиле A1, например "A1:F10". При изменении любой ячейки внутри этого диапазона изображение камеры автоматически обновляется, отражая новое содержимое. Камера сохраняет полное форматирование исходной области — границы, цвета фона, шрифты и числовые форматы — так что всё, что видно внутри ячеек, появляется также в изображении камеры. Это делает камеру особенно полезной для информационных панелей, сводок, боковых панелей и макетов отчётов, где требуется видимый предварительный просмотр удалённой области без прокрутки или повторения данных. Есть два важных замечания: необходимо вызвать updateSelectedValue() перед сохранением рабочей книги, и файл будет экспортирован в HTML или PDF, поскольку эти форматы полагаются на встроенные данные изображения, а не на живой пересчёт.

Метод 1 — Добавление динамического изображения камеры

Динамическая камера — наиболее распространённый подход, который наиболее точно соответствует встроенному инструменту «Камера» в Excel. Он работает путём добавления изображения без начального содержимого, а затем присвоения ему Formula, ссылающейся на исходный диапазон. После присвоения формулы вызов updateSelectedValue() обновляет встроенные данные изображения, чтобы они были синхронизированы с отражаемыми ячейками. Камера реализуется не через выделенный класс — она построена целиком на стандартном типе Picture. Ключевые API:

  • PictureCollection.add(int upperLeftRow, int upperLeftColumn, InputStream stream) — добавляет изображение, привязанное к указанной строке и столбцу. Передача null в параметр stream создаёт пустое изображение, выступающее в качестве заполнителя для динамической камеры. Метод возвращает индекс нового изображения.
  • worksheet.getPictures().get(index) — индексированный доступ для получения конкретного Picture из коллекции.
  • Picture.setFormula(String value) — задаёт ссылку в стиле A1 на исходный диапазон, который отражает камера, например "A1:F10".
  • Picture.updateSelectedValue() — метод без возвращаемого значения, который обновляет встроенные данные изображения на основе ячеек, на которые ссылается Formula.

Следующий код создаёт рабочую книгу, добавляет пустое изображение, привязанное к строке 10 столбцу 6, связывает его с исходным диапазоном A1:F10 через setFormula, обновляет встроенные данные изображения и сохраняет рабочую книгу.

import java.io.InputStream;
import com.aspose.cells.PictureCollection;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.getWorksheets().get(0);
worksheet.setName("CameraDemo");
// Динамическая камера: добавить пустое изображение, связать его через формулу с A1:F10, затем обновить
PictureCollection pictures = worksheet.getPictures();
int index = pictures.add(10, 6, (InputStream) null);
pictures.get(index).setFormula("A1:F10");
pictures.get(index).updateSelectedValue();
workbook.save("output_dynamic.xlsx", SaveFormat.XLSX);

Метод 2 — Добавление статического изображения камеры

Статическая камера по сути является однократно отрендеренным предварительным просмотром диапазона ячеек. Вместо поддержания живой связи вы однократно рендерите диапазон в байты изображения, оборачиваете эти байты в ByteArrayInputStream и добавляете их как обычное изображение. Содержимое изображения фиксируется в момент создания и не обновляется автоматически при изменении исходных ячеек. Ключевые API:

  • Cells.createRange(String address) — создаёт объект Range из адреса в стиле A1, например "A1:F10".
  • Range.toImage(ImageOrPrintOptions options) — рендерит диапазон в байты изображения. Передача null использует параметры рендеринга по умолчанию; существуют перегрузки для более тонкого управления выводом.
  • new ByteArrayInputStream(byte[] buffer) — оборачивает байты отрендеренного изображения в ByteArrayInputStream, который может быть передан в PictureCollection.add.
  • PictureCollection.add(int upperLeftRow, int upperLeftColumn, InputStream stream) — добавляет изображение, привязанное к указанной строке и столбцу, в этот раз передавая ByteArrayInputStream, полученный при рендеринге. Следующий код создаёт рабочую книгу, строит Range для A1:F10, рендерит его в байты изображения через Range.toImage(null), оборачивает байты в ByteArrayInputStream, добавляет изображение, привязанное к строке 10 столбцу 6, и сохраняет рабочую книгу.
import java.io.ByteArrayInputStream;
import com.aspose.cells.PictureCollection;
import com.aspose.cells.Range;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.getWorksheets().get(0);
worksheet.setName("CameraDemo");
// Static Camera: build Range, render to bytes, wrap in ByteArrayInputStream, add as picture
Range range = worksheet.getCells().createRange("A1:F10");
PictureCollection pictures = worksheet.getPictures();
pictures.add(10, 6, new ByteArrayInputStream(range.toImage(null)));
workbook.save("output_static.xlsx", SaveFormat.XLSX);

Выбор между динамической и статической камерой

  • Динамическая камера: обновляется при каждом пересчёте, поддерживает экспорт в HTML и PDF после updateSelectedValue() и сохраняет поведение живой связи на протяжении всего срока жизни файла.
  • Статическая камера: однократный рендер, который никогда не обновляется; полезен, когда требуется фиксированный визуальный снимок, встроенный во время сборки, а не живое отражение данных. Aspose.Cells поддерживает как динамическую, автоматически обновляемую камеру, построенную на Picture.Formula и updateSelectedValue(), так и статическую, однократную камеру, построенную на Range.toImage и ByteArrayInputStream. Выбирайте динамический подход, когда ваш вывод должен оставаться синхронизированным с исходными ячейками, и выбирайте статический подход, когда вам нужен только фиксированный визуальный снимок во время сборки.

Связанные статьи