Excel Camera в Aspose.Cells for .NET

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

Что такое Excel Camera?

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

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

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

  • PictureCollection.Add(int upperLeftRow, int upperLeftColumn, Stream stream) — добавляет изображение, привязанное к заданной строке и столбцу. Передача null для параметра stream создаёт пустое изображение, которое выступает в качестве заполнительницы для динамической Camera. Метод возвращает индекс нового изображения.
  • worksheet.Pictures[index] — индексатор для получения определённого Picture из коллекции.
  • Picture.Formula — строковое свойство (get/set), содержащее ссылку в стиле A1 на исходный диапазон, который отражает Camera, например "A1:F10".
  • Picture.UpdateSelectedValue() — метод без возвращаемого значения, который обновляет встроенные данные изображения из ячеек, на которые ссылается Formula.

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

using System;
using System.IO;
using System.Drawing;
using Aspose.Cells;
using Aspose.Cells.Drawing;
var workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
worksheet.Name = "CameraDemo";
// Динамическая камера: добавляем пустое изображение, связываем его через формулу с A1:F10, затем обновляем
var pictures = worksheet.Pictures;
int index = pictures.Add(10, 6, (Stream)null);
pictures[0].Formula = "A1:F10";
pictures[0].UpdateSelectedValue();
workbook.Save("output_dynamic.xlsx", SaveFormat.Xlsx);

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

Статическая Camera — это, по сути, однократно отрендеренный предпросмотр диапазона ячеек. Вместо поддержания живой связи вы однократно рендерите диапазон в байты изображения, оборачиваете эти байты в MemoryStream и добавляете их как обычное изображение. Содержимое изображения фиксируется в момент создания и не обновляется автоматически при изменении исходных ячеек. Основные API:

  • Cells.CreateRange(string address) — создаёт объект Range из адреса в стиле A1, например "A1:F10".
  • Range.ToImage(ImageOrPrintOptions options) — рендерит диапазон в байты изображения. Передача null использует параметры рендеринга по умолчанию; существуют перегрузки для более тонкого управления выводом.
  • new MemoryStream(byte[] buffer) — оборачивает отрендеренные байты изображения в MemoryStream, который можно передать в PictureCollection.Add.
  • PictureCollection.Add(int upperLeftRow, int upperLeftColumn, Stream stream) — добавляет изображение, привязанное к заданной строке и столбцу, на этот раз передавая MemoryStream, созданный при рендеринге. Следующий код создаёт рабочую книгу, создаёт Range для A1:F10, рендерит его в байты изображения через Range.ToImage(null), оборачивает байты в MemoryStream, добавляет изображение, привязанное к строке 10 столбцу 6, и сохраняет рабочую книгу.
using System;
using System.IO;
using System.Drawing;
using Aspose.Cells;
using Aspose.Cells.Drawing;
var workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
worksheet.Name = "CameraDemo";
// Статичная камера: создать диапазон, преобразовать в байты, обернуть в MemoryStream, добавить как изображение
var range = workbook.Worksheets[0].Cells.CreateRange("A1:F10");
var pictures = worksheet.Pictures;
pictures.Add(10, 6, new MemoryStream(range.ToImage(null)));
workbook.Save("output_static.xlsx", SaveFormat.Xlsx);

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

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

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