Управление OLE объектами в презентациях на .NET
Info
OLE (Object Linking & Embedding) — это технология Microsoft, позволяющая размещать данные и объекты, созданные в одном приложении, в другом приложении посредством связывания или встраивания.Рассмотрим диаграмму, созданную в MS Excel. Затем эта диаграмма помещается в слайд PowerPoint. Такая диаграмма Excel считается OLE‑объектом.
- OLE‑объект может отображаться в виде значка. В этом случае при двойном щелчке по значку диаграмма открывается в связанном приложении (Excel) или появляется запрос выбрать приложение для открытия/редактирования объекта.
- OLE‑объект может отображать свое реальное содержимое, например содержимое диаграммы. В этом случае диаграмма активируется в PowerPoint, загружается интерфейс диаграммы, и вы можете изменять данные диаграммы прямо в PowerPoint.
Aspose.Slides for .NET позволяет вставлять OLE‑объекты в слайды как OLE‑кадры (OleObjectFrame).
Добавление OLE‑кадров в слайды
Предположим, вы уже создали диаграмму в Microsoft Excel и хотите встроить её в слайд как OLE‑кадр с помощью Aspose.Slides for .NET. Это делается так:
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Прочитайте файл Excel в виде массива байтов.
- Добавьте OleObjectFrame на слайд, передав массив байтов и другую информацию об OLE‑объекте.
- Сохраните изменённую презентацию как файл PPTX.
В примере ниже мы добавили диаграмму из файла Excel на слайд как OleObjectFrame с помощью Aspose.Slides for .NET.
Примечание: конструктор OleEmbeddedDataInfo принимает расширение встраиваемого объекта вторым параметром. Это расширение позволяет PowerPoint правильно интерпретировать тип файла и выбрать нужное приложение для открытия данного OLE‑объекта.
using (Presentation presentation = new Presentation())
{
SizeF slideSize = presentation.SlideSize.Size;
ISlide slide = presentation.Slides[0];
// Подготовьте данные для OLE‑объекта.
byte[] fileData = File.ReadAllBytes("book.xlsx");
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");
// Добавьте кадр OLE‑объекта на слайд.
slide.Shapes.AddOleObjectFrame(0, 0, slideSize.Width, slideSize.Height, dataInfo);
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Добавление связанных OLE‑кадров
Aspose.Slides for .NET позволяет добавить OleObjectFrame без встраивания данных, а только с ссылкой на файл.
Следующий код на C# показывает, как добавить OleObjectFrame со связанным файлом Excel на слайд:
using (Presentation presentation = new Presentation())
{
ISlide slide = presentation.Slides[0];
// Добавьте кадр OLE‑объекта со связанным файлом Excel.
slide.Shapes.AddOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Доступ к OLE‑кадрам
Если OLE‑объект уже встроен в слайд, вы можете легко найти или получить к нему доступ следующим образом:
- Загрузите презентацию с встроенным OLE‑объектом, создав экземпляр класса Presentation.
- Получите ссылку на слайд, используя его индекс.
- Доступ к фигуре OleObjectFrame.
В нашем примере мы использовали ранее созданный PPTX, содержащий единственную фигуру на первом слайде. Затем мы привели этот объект к типу IOleObjectFrame. Это был нужный OLE‑кадр для доступа. - После получения доступа к OLE‑кадру вы можете выполнять любые операции с ним.
В примере ниже демонстрируется доступ к OLE‑кадру (встроенному объекту Excel‑диаграммы) и его файловым данным.
using (Presentation presentation = new Presentation("sample.pptx"))
{
ISlide slide = presentation.Slides[0];
// Получить первую форму как кадр OLE‑объекта.
IOleObjectFrame oleFrame = slide.Shapes[0] as IOleObjectFrame;
if (oleFrame != null)
{
// Получить встроенные данные файла.
byte[] fileData = oleFrame.EmbeddedData.EmbeddedFileData;
// Получить расширение встроенного файла.
string fileExtension = oleFrame.EmbeddedData.EmbeddedFileExtension;
// ...
}
}
Доступ к свойствам связанных OLE‑кадров
Aspose.Slides позволяет получать свойства связанных OLE‑кадров.
Следующий код на C# показывает, как проверить, является ли OLE‑объект связанным, и затем получить путь к связанному файлу:
using (Presentation presentation = new Presentation("sample.ppt"))
{
ISlide slide = presentation.Slides[0];
// Получить первую форму как кадр OLE‑объекта.
IOleObjectFrame oleFrame = slide.Shapes[0] as IOleObjectFrame;
// Проверить, связан ли объект OLE.
if (oleFrame != null && oleFrame.IsObjectLink)
{
// Вывести полный путь к связанному файлу.
Console.WriteLine("OLE object frame is linked to: " + oleFrame.LinkPathLong);
// Вывести относительный путь к связанному файлу, если он присутствует.
// Только презентации PPT могут содержать относительный путь.
if (!string.IsNullOrEmpty(oleFrame.LinkPathRelative))
{
Console.WriteLine("OLE object frame relative path: " + oleFrame.LinkPathRelative);
}
}
}
Изменение данных OLE‑объекта
Если OLE‑объект уже встроен в слайд, вы можете легко получить к нему доступ и изменить его данные следующим образом:
- Загрузите презентацию с встроенным OLE‑объектом, создав экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Доступ к фигуре OLEObjectFrame.
В нашем примере мы использовали ранее созданный PPTX, содержащий одну фигуру на первом слайде. Затем мы привели этот объект к типу IOleObjectFrame. Это был нужный OLE‑кадр для доступа. - После получения доступа к OLE‑кадру вы можете выполнять любые операции с ним.
- Создайте объект
Workbookи получите доступ к OLE‑данным. - Доступ к нужному
Worksheetи изменение данных. - Сохраните обновлённый
Workbookв поток. - Измените данные OLE‑объекта из потока.
В примере ниже OLE‑кадр (встроенный объект Excel‑диаграммы) доступен, и его файловые данные изменены для обновления данных диаграммы.
using (Presentation presentation = new Presentation("sample.pptx"))
{
ISlide slide = presentation.Slides[0];
// Получить первую форму как кадр OLE‑объекта.
IOleObjectFrame oleFrame = slide.Shapes[0] as IOleObjectFrame;
if (oleFrame != null)
{
using (MemoryStream oleStream = new MemoryStream(oleFrame.EmbeddedData.EmbeddedFileData))
{
// Прочитать данные OLE‑объекта как объект Workbook.
Workbook workbook = new Workbook(oleStream);
using (MemoryStream newOleStream = new MemoryStream())
{
// Изменить данные рабочей книги.
workbook.Worksheets[0].Cells[0, 4].PutValue("E");
workbook.Worksheets[0].Cells[1, 4].PutValue(12);
workbook.Worksheets[0].Cells[2, 4].PutValue(14);
workbook.Worksheets[0].Cells[3, 4].PutValue(15);
OoxmlSaveOptions fileOptions = new OoxmlSaveOptions(Aspose.Cells.SaveFormat.Xlsx);
workbook.Save(newOleStream, fileOptions);
// Изменить данные объекта OLE‑кадра.
IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.ToArray(), oleFrame.EmbeddedData.EmbeddedFileExtension);
oleFrame.SetEmbeddedData(newData);
}
}
}
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Встраивание других типов файлов в слайды
Помимо диаграмм Excel, Aspose.Slides for .NET позволяет встраивать в слайды другие типы файлов. Например, можно вставлять HTML, PDF и ZIP‑файлы как объекты. При двойном щелчке по вставленному объекту он автоматически открывается в соответствующей программе, либо пользователю предлагается выбрать подходящую программу.
Следующий код на C# показывает, как встроить HTML и ZIP в слайд:
using (Presentation presentation = new Presentation())
{
ISlide slide = presentation.Slides[0];
byte[] htmlData = File.ReadAllBytes("sample.html");
IOleEmbeddedDataInfo htmlDataInfo = new OleEmbeddedDataInfo(htmlData, "html");
IOleObjectFrame htmlOleFrame = slide.Shapes.AddOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.IsObjectIcon = true;
byte[] zipData = File.ReadAllBytes("sample.zip");
IOleEmbeddedDataInfo zipDataInfo = new OleEmbeddedDataInfo(zipData, "zip");
IOleObjectFrame zipOleFrame = slide.Shapes.AddOleObjectFrame(150, 220, 50, 50, zipDataInfo);
zipOleFrame.IsObjectIcon = true;
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Установка типов файлов для встроенных объектов
При работе с презентациями может потребоваться заменить старые OLE‑объекты новыми или заменить неподдерживаемый OLE‑объект поддерживаемым. Aspose.Slides for .NET позволяет задать тип файла для встроенного объекта, что даёт возможность обновить данные OLE‑кадра или его расширение.
Следующий код на C# показывает, как установить тип файла встроенного OLE‑объекта в zip:
using (Presentation presentation = new Presentation("sample.pptx"))
{
ISlide slide = presentation.Slides[0];
IOleObjectFrame oleFrame = (IOleObjectFrame)slide.Shapes[0];
string fileExtension = oleFrame.EmbeddedData.EmbeddedFileExtension;
byte[] fileData = oleFrame.EmbeddedData.EmbeddedFileData;
Console.WriteLine($"Current embedded file extension is: {fileExtension}");
// Изменить тип файла на ZIP.
oleFrame.SetEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Установка изображений‑значков и заголовков для встроенных объектов
После встраивания OLE‑объекта автоматически добавляется предварительный просмотр в виде значка. Этот предварительный просмотр виден пользователям до доступа к объекту. Если необходимо использовать конкретное изображение и текст в качестве элементов предварительного просмотра, можно задать значок и заголовок с помощью Aspose.Slides for .NET.
Следующий код на C# показывает, как задать изображение‑значок и заголовок для встроенного объекта:
using (Presentation presentation = new Presentation("sample.pptx"))
{
ISlide slide = presentation.Slides[0];
IOleObjectFrame oleFrame = (IOleObjectFrame)slide.Shapes[0];
// Добавить изображение в ресурсы презентации.
byte[] imageData = File.ReadAllBytes("image.png");
IPPImage oleImage = presentation.Images.AddImage(imageData);
// Установить заголовок и изображение для предварительного просмотра OLE.
oleFrame.SubstitutePictureTitle = "My title";
oleFrame.SubstitutePictureFormat.Picture.Image = oleImage;
oleFrame.IsObjectIcon = true;
presentation.Save("output.pptx", SaveFormat.Pptx);
}
Предотвращение изменения размера и положения OLE‑кадра
После добавления связанного OLE‑объекта в слайд презентации, при открытии презентации в PowerPoint может появиться сообщение с запросом обновить ссылки. Нажатие кнопки «Update Links» может изменить размер и положение OLE‑кадра, потому что PowerPoint обновляет данные из связанного OLE‑объекта и пересчитывает предварительный просмотр. Чтобы отключить запрос PowerPoint об обновлении данных объекта, установите свойство UpdateAutomatic интерфейса IOleObjectFrame в false:
oleFrame.UpdateAutomatic = false;
Извлечение встроенных файлов
Aspose.Slides for .NET позволяет извлекать файлы, встроенные в слайды как OLE‑объекты, следующим способом:
- Создайте экземпляр класса Presentation, содержащий OLE‑объекты, которые нужно извлечь.
- Пройдитесь по всем фигурам в презентации и получите доступ к фигурам OLEObjectFrame.
- Доступ к данным встроенных файлов из OLE‑кадров и запись их на диск.
Следующий код на C# показывает, как извлечь файлы, встроенные в слайд как OLE‑объекты:
using (Presentation presentation = new Presentation("sample.pptx"))
{
ISlide slide = presentation.Slides[0];
for (int index = 0; index < slide.Shapes.Count; index++)
{
IShape shape = slide.Shapes[index];
IOleObjectFrame oleFrame = shape as IOleObjectFrame;
if (oleFrame != null)
{
byte[] fileData = oleFrame.EmbeddedData.EmbeddedFileData;
string fileExtension = oleFrame.EmbeddedData.EmbeddedFileExtension;
string filePath = $"OLE_object_{index}{fileExtension}";
File.WriteAllBytes(filePath, fileData);
}
}
}
FAQ
Будут ли OLE‑данные отображаться при экспорте слайдов в PDF/изображения?
Отображается то, что видно на слайде — значок/замещающее изображение (превью). «Живой» OLE‑контент не выполняется при рендеринге. При необходимости задайте собственное изображение‑превью, чтобы обеспечить ожидаемый вид в экспортированном PDF.
Как заблокировать OLE‑объект на слайде, чтобы пользователи не могли перемещать/редактировать его в PowerPoint?
Заблокируйте фигуру: Aspose.Slides предоставляет блокировки на уровне фигур. Это не шифрование, но эффективно предотвращает случайные изменения и перемещения.
Почему связанный объект Excel «перепрыгивает» или меняет размер при открытии презентации?
PowerPoint может обновлять превью связанного OLE‑объекта. Для стабильного внешнего вида используйте рекомендации из Рабочего решения для изменения размера листа — либо подгоните кадр под диапазон, либо масштабируйте диапазон до фиксированного кадра и задайте подходящее замещающее изображение.
Сохраняются ли относительные пути для связанных OLE‑объектов в формате PPTX?
В PPTX информация о «относительном пути» не хранится — сохраняется только полный путь. Относительные пути присутствуют в старом формате PPT. Для переносимости предпочтительнее использовать надёжные абсолютные пути/доступные URI или встраивание.