Správa OLE v prezentacích pomocí C++
Úvod
Info
OLE (Object Linking & Embedding) je technologie společnosti Microsoft, která umožňuje umístit data a objekty vytvořené v jedné aplikaci do jiné aplikace pomocí propojení nebo vložení.Zvažte graf vytvořený v MS Excel. Tento graf je poté umístěn na snímek v PowerPointu. Tento Excel graf je považován za OLE objekt.
- OLE objekt se může zobrazit jako ikona. V takovém případě po dvojitém kliknutí na ikonu se graf otevře v přidružené aplikaci (Excel) nebo budete vyzváni k výběru aplikace pro otevření nebo úpravu objektu.
- OLE objekt může zobrazovat svůj skutečný obsah, například obsah grafu. V tomto případě je graf aktivován v PowerPointu, načte se rozhraní grafu a můžete upravovat data grafu přímo v PowerPointu.
Aspose.Slides for C++ umožňuje vkládat OLE objekty do snímků jako rámy OLE objektů (OleObjectFrame).
Přidání rámců OLE objektů do snímků
Předpokládejme, že jste již vytvořili graf v Microsoft Excel a chcete jej vložit do snímku jako rámec OLE objektu pomocí Aspose.Slides for C++. Můžete tak učinit následovně:
- Vytvořte instanci třídy Presentation .
- Získejte odkaz na snímek podle jeho indexu.
- Přečtěte soubor Excelu jako pole bajtů.
- Přidejte OleObjectFrame na snímek, který obsahuje pole bajtů a další informace o OLE objektu.
- Uložte upravenou prezentaci jako soubor PPTX.
V ukázce níže jsme přidali graf ze souboru Excel do snímku jako OleObjectFrame pomocí Aspose.Slides for C++.
Poznámka že konstruktor OleEmbeddedDataInfo přijímá rozšíření vložitelného objektu jako druhý parametr. Toto rozšíření umožňuje PowerPointu správně interpretovat typ souboru a vybrat správnou aplikaci pro otevření tohoto OLE objektu.
auto presentation = MakeObject<Presentation>();
auto slideSize = presentation->get_SlideSize()->get_Size();
auto slide = presentation->get_Slide(0);
// Připravte data pro OLE objekt.
auto fileData = File::ReadAllBytes(u"book.xlsx");
auto dataInfo = MakeObject<OleEmbeddedDataInfo>(fileData, u"xlsx");
// Přidejte rámec OLE objektu do snímku.
slide->get_Shapes()->AddOleObjectFrame(0, 0, slideSize.get_Width(), slideSize.get_Height(), dataInfo);
presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();
Přidání propojených rámců OLE objektů
Aspose.Slides for C++ umožňuje přidat OleObjectFrame bez vložení dat, pouze s odkazem na soubor.
Tento C++ kód ukazuje, jak přidat OleObjectFrame s odkazem na Excel soubor do snímku:
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
// Přidejte rámec OLE objektu s propojeným souborem Excel.
slide->get_Shapes()->AddOleObjectFrame(20, 20, 200, 150, u"Excel.Sheet.12", u"book.xlsx");
presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();
Přístup k rámcům OLE objektů
Pokud je OLE objekt již vložený ve snímku, můžete jej snadno najít nebo získat takto:
- Načtěte prezentaci s vloženým OLE objektem vytvořením instance třídy Presentation .
- Získejte odkaz na snímek pomocí jeho indexu.
- Získejte tvar OleObjectFrame. V našem příkladu jsme použili dříve vytvořený PPTX, který má na prvním snímku jediný tvar. Poté jsme tento objekt přetypovali na IOleObjectFrame. To byl požadovaný rámec OLE objektu, ke kterému jsme chtěli přistupovat.
- Jakmile je rámec OLE objektu získán, můžete na něm provádět libovolné operace.
V příkladu níže jsou získány rámec OLE objektu (graf Excel vložený do snímku) a data souboru.
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
auto shape = slide->get_Shape(0);
if (ObjectExt::Is<IOleObjectFrame>(shape))
{
auto oleFrame = ExplicitCast<IOleObjectFrame>(shape);
// Získat data vloženého souboru.
auto fileData = oleFrame->get_EmbeddedData()->get_EmbeddedFileData();
// Získat příponu vloženého souboru.
auto fileExtension = oleFrame->get_EmbeddedData()->get_EmbeddedFileExtension();
// ...
}
Přístup k vlastnostem propojeného rámce OLE objektu
Aspose.Slides umožňuje přistupovat k vlastnostem propojených rámců OLE objektu.
Tento C++ kód ukazuje, jak zkontrolovat, zda je OLE objekt propojený, a následně získat cestu k propojenému souboru:
auto presentation = MakeObject<Presentation>(u"sample.ppt");
auto slide = presentation->get_Slide(0);
auto shape = slide->get_Shape(0);
if (ObjectExt::Is<IOleObjectFrame>(shape))
{
auto oleFrame = ExplicitCast<IOleObjectFrame>(shape);
// Zkontrolujte, zda je OLE objekt propojen.
if (oleFrame->get_IsObjectLink())
{
// Vytiskněte úplnou cestu k propojenému souboru.
std::wcout << L"OLE object frame is linked to: " << oleFrame->get_LinkPathLong() << std::endl;
// Vytiskněte relativní cestu k propojenému souboru, pokud existuje.
// Pouze prezentace PPT mohou obsahovat relativní cestu.
if (!String::IsNullOrEmpty(oleFrame->get_LinkPathRelative()))
{
std::wcout << L"OLE object frame relative path: " << oleFrame->get_LinkPathRelative() << std::endl;
}
}
}
Změna dat OLE objektu
Pokud je OLE objekt již vložený ve snímku, můžete k tomuto objektu snadno přistoupit a upravit jeho data takto:
- Načtěte prezentaci s vloženým OLE objektem vytvořením instance třídy Presentation .
- Získejte odkaz na snímek podle jeho indexu.
- Získejte tvar OLEObjectFrame. V našem příkladu jsme použili dříve vytvořený PPTX, který má na prvním snímku jediný tvar. Poté jsme tento objekt přetypovali na IOleObjectFrame. To byl požadovaný rámec OLE objektu, ke kterému jsme chtěli přistupovat.
- Jakmile je rámec OLE objektu získán, můžete na něm provádět libovolné operace.
- Vytvořte objekt
Workbooka získejte OLE data. - Získejte požadovaný
Worksheeta upravte data. - Uložte aktualizovaný
Workbookdo proudu. - Změňte data OLE objektu z proudu.
V příkladu níže je získán rámec OLE objektu (graf Excel vložený do snímku) a jeho souborová data jsou upravena tak, aby aktualizovala data grafu.
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
// Získat první tvar jako rámec OLE objektu.
auto oleFrame = AsCast<IOleObjectFrame>(slide->get_Shape(0));
if (oleFrame != nullptr)
{
auto oleStream = MakeObject<MemoryStream>(oleFrame->get_EmbeddedData()->get_EmbeddedFileData());
// Načíst data OLE objektu jako objekt Workbook.
auto oleArray = oleStream->ToArray();
std::vector<uint8_t> workbookData(oleArray->data().begin(), oleArray->data().end());
Aspose::Cells::Workbook workbook(Aspose::Cells::Vector<uint8_t>(workbookData.data(), workbookData.size()));
// Upravit data workbooku.
auto worksheet = workbook.GetWorksheets().Get(0);
worksheet.GetCells().Get(0, 4).PutValue(Aspose::Cells::U16String("E"));
worksheet.GetCells().Get(1, 4).PutValue(12);
worksheet.GetCells().Get(2, 4).PutValue(14);
worksheet.GetCells().Get(3, 4).PutValue(15);
Aspose::Cells::OoxmlSaveOptions fileOptions(Aspose::Cells::SaveFormat::Xlsx);
auto newWorkbookData = workbook.Save(fileOptions);
auto newOleStream = MakeObject<MemoryStream>();
newOleStream->Write(
MakeArray<uint8_t>(std::vector<uint8_t>(newWorkbookData.GetData(), newWorkbookData.GetData() + newWorkbookData.GetLength())),
0, newWorkbookData.GetLength());
// Změnit data objektu OLE rámce.
auto newData = MakeObject<OleEmbeddedDataInfo>(newOleStream->ToArray(), oleFrame->get_EmbeddedData()->get_EmbeddedFileExtension());
oleFrame->SetEmbeddedData(newData);
}
presentation->Save(u"output.pptx", SaveFormat::Pptx);
Vložení jiných typů souborů do snímků
Kromě grafů Excelu Aspose.Slides for C++ umožňuje vložit do snímků i další typy souborů. Například můžete vložit HTML, PDF a ZIP soubory jako objekty. Když uživatel dvojklikne na vložený objekt, automaticky se otevře v odpovídajícím programu nebo je uživatel vyzván k výběru vhodného programu pro otevření.
Tento C++ kód ukazuje, jak vložit HTML a ZIP do snímku:
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto htmlData = File::ReadAllBytes(u"sample.html");
auto htmlDataInfo = MakeObject<OleEmbeddedDataInfo>(htmlData, u"html");
auto htmlOleFrame = slide->get_Shapes()->AddOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame->set_IsObjectIcon(true);
auto zipData = File::ReadAllBytes(u"sample.zip");
auto zipDataInfo = MakeObject<OleEmbeddedDataInfo>(zipData, u"zip");
auto zipOleFrame = slide->get_Shapes()->AddOleObjectFrame(150, 220, 50, 50, zipDataInfo);
zipOleFrame->set_IsObjectIcon(true);
presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();
Nastavení typů souborů pro vložené objekty
Při práci s prezentacemi můžete potřebovat nahradit staré OLE objekty novými nebo nahradit nepodporovaný OLE objekt podporovaným. Aspose.Slides for C++ umožňuje nastavit typ souboru pro vložený objekt, což vám umožní aktualizovat data rámce OLE nebo jeho rozšíření.
Tento C++ kód ukazuje, jak nastavit typ souboru pro vložený OLE objekt na zip:
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
auto oleFrame = ExplicitCast<IOleObjectFrame>(slide->get_Shape(0));
auto fileExtension = oleFrame->get_EmbeddedData()->get_EmbeddedFileExtension();
auto fileData = oleFrame->get_EmbeddedData()->get_EmbeddedFileData();
std::wcout << L"Current embedded file extension is: " << fileExtension << std::endl;
// Změnit typ souboru na ZIP.
oleFrame->SetEmbeddedData(MakeObject<OleEmbeddedDataInfo>(fileData, u"zip"));
presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();
Nastavení ikonových obrázků a titulů pro vložené objekty
Po vložení OLE objektu se automaticky přidá náhled sestávající z ikony. Tento náhled je to, co uživatelé vidí před přístupem nebo otevřením OLE objektu. Pokud chcete použít konkrétní obrázek a text jako součást náhledu, můžete pomocí Aspose.Slides for C++ nastavit ikonu a titulek.
Tento C++ kód ukazuje, jak nastavit ikonu a titulek pro vložený objekt:
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
auto oleFrame = ExplicitCast<IOleObjectFrame>(slide->get_Shape(0));
// Přidat obrázek do zdrojů prezentace.
auto imageData = File::ReadAllBytes(u"image.png");
auto oleImage = presentation->get_Images()->AddImage(imageData);
// Nastavit titulek a obrázek pro náhled OLE.
oleFrame->set_SubstitutePictureTitle(u"My title");
oleFrame->get_SubstitutePictureFormat()->get_Picture()->set_Image(oleImage);
oleFrame->set_IsObjectIcon(true);
presentation->Save(u"output.pptx", SaveFormat::Pptx);
presentation->Dispose();
Zabránění změně velikosti a pozicování rámce OLE objektu
Po přidání propojeného OLE objektu do snímku prezentace se při otevření prezentace v PowerPointu může zobrazit výzva k aktualizaci odkazů. Kliknutí na tlačítko „Update Links“ může změnit velikost a umístění rámce OLE objektu, protože PowerPoint aktualizuje data z propojeného OLE objektu a obnoví náhled objektu. Aby PowerPoint nevyzýval k aktualizaci dat objektu, nastavte metodě set_UpdateAutomatic rozhraní IOleObjectFrame hodnotu false:
oleFrame->set_UpdateAutomatic(false);
Extrahování vložených souborů
Aspose.Slides for C++ umožňuje extrahovat soubory vložené do snímků jako OLE objekty tímto způsobem:
- Vytvořte instanci třídy Presentation obsahující OLE objekty, které chcete extrahovat.
- Projděte všechny tvary v prezentaci a získávejte tvary OLEObjectFrame.
- Získejte data vložených souborů z rámců OLE objektu a zapište je na disk.
Tento C++ kód ukazuje, jak extrahovat soubory vložené do snímku jako OLE objekty:
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
for (int index = 0; index < slide->get_Shapes()->get_Count(); index++)
{
auto shape = slide->get_Shape(index);
if (ObjectExt::Is<IOleObjectFrame>(shape))
{
auto oleFrame = ExplicitCast<IOleObjectFrame>(shape);
auto fileData = oleFrame->get_EmbeddedData()->get_EmbeddedFileData();
auto fileExtension = oleFrame->get_EmbeddedData()->get_EmbeddedFileExtension();
auto fileName = String::Format(u"OLE_object_{0}{1}", index, fileExtension);
File::WriteAllBytes(fileName, fileData);
}
}
presentation->Dispose();
Často kladené otázky
Bude OLE obsah vykreslen při exportu snímků do PDF/obrázků?
To, co je na snímku viditelné, je vykresleno – ikona/náhradní obrázek (náhled). „Živý“ OLE obsah se během renderování neprovádí. V případě potřeby nastavte vlastní obrázek náhledu, aby se zajistil očekávaný vzhled v exportovaném PDF.
Jak mohu uzamknout OLE objekt na snímku, aby jej uživatelé nemohli v PowerPointu přesouvat/upravovat?
Uzamkněte tvar: Aspose.Slides poskytuje shape-level locks. Nejde o šifrování, ale účinně zabraňuje nechtěným úpravám a přesunu.
Proč se propojený Excel objekt „posune“ nebo změní velikost, když otevřu prezentaci?
PowerPoint může obnovit náhled propojeného OLE objektu. Pro stabilní vzhled postupujte podle Working Solution for Worksheet Resizing – buď přizpůsobte rámec rozsahu, nebo škálujte rozsah do pevného rámce a nastavte vhodný náhradní obrázek.
Zůstanou v PPTX formátu zachovány relativní cesty k propojeným OLE objektům?
V PPTX není informace o „relativní cestě“ dostupná – pouze úplná cesta. Relativní cesty jsou k dispozici ve starším formátu PPT. Pro přenositelnost upřednostňujte spolehlivé absolutní cesty/přístupné URI nebo vložení.