Működő megoldás a diagram átméretezésére PPTX-ben

Háttér

Megfigyelés szerint az Aspose komponenseken keresztül PowerPoint‑prezentációba OLE objektumként beágyazott Excel‑diagramok az első aktiválásuk után nem meghatározott méretarámba kerülnek. Ez a viselkedés észrevehető vizuális eltérést okoz a diagram aktiválás előtti és utáni állapota között. Az Aspose csapata részletesen vizsgálta a problémát, és megoldást talált. Ez a cikk leírja a probléma okait és a megfelelő javítást.

Az előző cikkben elmagyaráztuk, hogyan hozhatunk létre Excel‑diagramot az Aspose.Cells for C++ segítségével, és hogyan ágyazhatjuk be azt PowerPoint‑prezentációba az Aspose.Slides for C++ használatával. Az objektum előnézeti problémájának megoldásaként a diagram képét az OLE objektumkerethez rendeltük. A kimeneti prezentációban, ha duplán kattintunk a diagram képet megjelenítő OLE objektumkeretre, az Excel‑diagram aktiválódik. A végfelhasználók a háttérben lévő Excel‑munkafüzetben tetszőleges módosításokat végezhetnek, majd az aktivált munkafüzeten kívül kattintva visszatérhetnek a megfelelő diára. Az OLE objektumkeret mérete megváltozik, amikor a felhasználó visszatér a diára, és az átméretezési arány a OLE objektumkeret és a beágyazott Excel‑munkafüzet eredeti méreteitől függ.

Az átméretezés oka

Mivel az Excel‑munkafüzetnek saját ablakmérete van, az első aktiváláskor megpróbálja megtartani az eredeti méretét. Az OLE objektumkeretnek azonban saját mérete van. A Microsoft szerint, amikor az Excel‑munkafüzet aktiválódik, az Excel és a PowerPoint egyeztetik a méretet, és az ágyazási folyamat részeként megőrzik a helyes arányokat. Az Excel‑ablakméret és az OLE objektumkeret mérete vagy pozíciója közötti eltérések hatására történik az átméretezés.

Működő megoldás

Az Aspose.Slides for C++ használatával PowerPoint‑prezentációk létrehozására két lehetséges forgatókönyv létezik.

Scenario 1: Létrehozni egy prezentációt meglévő sablon alapján.
Scenario 2: Újról, semmiből létrehozni egy prezentációt.

Az itt bemutatott megoldás mindkét forgatókönyvre alkalmazható. Minden megoldási megközelítés alappillére ugyanaz: a beágyazott OLE objektum ablakméretének meg kell egyeznie a PowerPoint‑dia OLE objektumkeretével. Most a megoldás két megközelítését fogjuk bemutatni.

Első megközelítés

Ebben a megközelítésben megtanuljuk, hogyan állítsuk be a beágyazott Excel‑munkafüzet ablakméretét úgy, hogy az megegyezzen a PowerPoint‑dia OLE objektumkeretének méretével.

Scenario 1

Tegyük fel, hogy definiáltunk egy sablont, és annak alapján kívánunk prezentációkat létrehozni. Feltételezzük, hogy a sablonban a 2. indexű alakzatnál OLE‑keretet szeretnénk elhelyezni, amely beágyazott Excel‑munkafüzetet tartalmaz. Ebben a forgatókönyvben az OLE objektumkeret mérete előre meghatározott – megegyezik a sablonban a 2. indexű alakzat méretével. Csak annyi a teendő, hogy a munkafüzet ablakméretét egyenlővé tegyük ezzel az alakzattal. A következő kódrészlet erre szolgál:

System::SharedPtr<System::IO::MemoryStream> ToSlidesMemoryStream(intrusive_ptr<Aspose::Cells::Systems::IO::MemoryStream> inputStream)
{
    auto outputBuffer = System::MakeArray<uint8_t>(inputStream->GetLength(), inputStream->GetBuffer()->ArrayPoint());
    auto outputStream = System::MakeObject<System::IO::MemoryStream>(outputBuffer);

    return outputStream;
}
// Definiálja a diagram méretét egy ablakban. 
chart->SetSizeWithWindow(true);

auto shape = slide->get_Shape(2);

// Állítsa be a munkafüzet ablakszélességét hüvelykben (72-tel osztva, mivel a PowerPoint hüvelykenként 72 képpontot használ).
workbook->GetISettings()->SetWindowWidthInch(shape->get_Width() / 72.f);

// Állítsa be a munkafüzet ablakmagasságát hüvelykben.
workbook->GetISettings()->SetWindowHeightInch(shape->get_Height() / 72.f);

// Mentse a munkafüzetet egy memóriaáramra.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream3(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    shape->get_X(), 
    shape->get_Y(), 
    shape->get_Width(), 
    shape->get_Height(),
    dataInfo);

Scenario 2

Tegyük fel, hogy semmiből szeretnénk prezentációt készíteni, és tetszőleges méretű OLE objektumkeretet szeretnénk hozzáadni beágyazott Excel‑munkafüzettel. A következő kódrészletben létrehozunk egy 4 hüvelyk magas és 9,5 hüvelyk széles OLE objektumkeretet az x = 0,5 hüvelyk, y = 1 hüvelyk pozícióban a dián. Ezután az Excel‑munkafüzet ablakát ugyanarra a méretre állítjuk – 4 hüvelyk magasra és 9,5 hüvelyk szélesre.

// A kívánt magasság.
int32_t desiredHeight = 288; // 4 hüvelyk (4 * 72)

// A kívánt szélesség.
int32_t desiredWidth = 684; // 9,5 hüvelyk (9.5 * 72)

// Definiálja a diagram méretét egy ablakban. 
chart->SetSizeWithWindow(true);

// Állítsa be a munkafüzet ablakszélességét hüvelykben.
workbook->GetISettings()->SetWindowWidthInch(desiredWidth / 72.f);

// Állítsa be a munkafüzet ablakmagasságát hüvelykben.
workbook->GetISettings()->SetWindowHeightInch(desiredHeight / 72.f);

// Mentse a munkafüzetet egy memóriaáramra.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    36.0f,
    72.0f, 
    desiredWidth, 
    desiredHeight,
    dataInfo);

Második megközelítés

Ebben a megközelítésben megtanuljuk, hogyan állítsuk be a beágyazott Excel‑munkafüzetben lévő diagram méretét úgy, hogy az megegyezzen a PowerPoint‑dia OLE objektumkeretének méretével. Ez a megközelítés akkor hasznos, ha a diagram mérete előre ismert, és soha nem változik.

Scenario 1

Tegyük fel, hogy definiáltunk egy sablont, és annak alapján szeretnénk prezentációkat létrehozni. Feltételezzük, hogy a sablonban a 2. indexű alakzatnál OLE‑keretet kívánunk elhelyezni, amely beágyazott Excel‑munkafüzetet tartalmaz. Ebben a forgatókönyvben az OLE keret mérete előre meghatározott – megegyezik a 2. indexű alakzat méretével a sablonban. Csak annyi a feladat, hogy a munkafüzetben a diagram méretét ugyanolyanra állítsuk, mint az alakzat mérete. A következő kódrészlet erre szolgál:

// Határozza meg a diagram méretét ablak nélkül. 
chart->SetSizeWithWindow(false);

auto shape = slide->get_Shape(2);

// Állítsa be a diagram szélességét pixelben (szorozza 96-tal, mivel az Excel hüvelykenként 96 pixelt használ).    
chart->GetIChartObject()->SetWidth((int32_t)(shape->get_Width() / 72.f * 96.f));

// Állítsa be a diagram magasságát pixelben.
chart->GetIChartObject()->SetHeight((int32_t)(shape->get_Height() / 72.f) * 96.f);

// Határozza meg a diagram nyomtatási méretét.
chart->SetPrintSize(Aspose::Cells::PrintSizeType::PrintSizeType_Custom);

// Mentse a munkafüzetet memóriaáramra.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    shape->get_X(), 
    shape->get_Y(), 
    shape->get_Width(),
    shape->get_Height(),
    dataInfo);

Scenario 2

Tegyük fel, hogy semmiből szeretnénk prezentációt létrehozni, és tetszőleges méretű OLE objektumkeretet adunk hozzá beágyazott Excel‑munkafüzettel. A következő kódrészletben létrehozunk egy 4 hüvelyk magas és 9,5 hüvelyk széles OLE objektumkeretet a dián, ahol x = 0,5 hüvelyk, y = 1 hüvelyk. A megfelelő diagram méretét is ugyanarra a méretre állítjuk: 4 hüvelyk magasra és 9,5 hüvelyk szélesre.

// A kívánt magasság.
int32_t desiredHeight = 288; // 4 hüvelyk (4 * 576)

// A kívánt szélesség.
int32_t desiredWidth = 684; // 9,5 hüvelyk(9.5 * 576)

// Határozza meg a diagram méretét ablak nélkül. 
chart->SetSizeWithWindow(false);

// Állítsa be a diagram szélességét pixelben.    
chart->GetIChartObject()->SetWidth((int32_t)((desiredWidth / 72.f) * 96.f));

// Állítsa be a diagram magasságát pixelben.
chart->GetIChartObject()->SetHeight((int32_t)((desiredHeight / 72.f) * 96.f));

// Mentse a munkafüzetet memóriaáramra.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    36.0f, 
    72.0f, 
    desiredWidth, 
    desiredHeight,
    dataInfo);

Következtetés

Két megközelítés létezik a diagram-átméretezési probléma megoldására. A választott megközelítés a követelményektől és az esettől függ. Mindkét módszer ugyanúgy működik, függetlenül attól, hogy a prezentációt sablonból vagy semmiből hozták létre. Emellett nincs korlátozás az OLE objektumkeret méretére ebben a megoldásban.

GYIK

Miért változik méretben a beágyazott Excel‑diagram a PowerPoint‑ban történő aktiválás után?
Ez azért történik, mert az Excel az első aktiváláskor megpróbálja visszaállítani az eredeti ablakméretét, míg a PowerPoint‑ban az OLE objektumkeret saját méretekkel rendelkezik. A PowerPoint és az Excel egyeztetik a méretet, hogy megőrizzék az arányt, ami az átméretezést okozhat.

Lehetséges-e teljesen megakadályozni ezt az átméretezési problémát?
Igen. Az Excel‑munkafüzet ablakméretének vagy a diagram méretének a OLE objektumkeret méretéhez igazításával a beágyazás előtt a diagram méretei konzisztensen maradhatnak.

Melyik megközelítést válasszam, a munkafüzet ablakméretének beállítását vagy a diagram méretének beállítását?
Használja a 1. megközelítést (ablakméret), ha meg szeretné őrizni a munkafüzet arányait, és esetleg később engedélyezni a méretezést.
Használja a 2. megközelítést (diagramméret), ha a diagram méretei rögzítettek, és a beágyazás után nem változnak.

Működnek-e ezek a módszerek sablon‑alapú és új prezentációkkal egyaránt?
Igen. Mindkét megközelítés ugyanúgy működik a sablonból és a semmiből létrehozott prezentációk esetében.

Van korlátozás az OLE objektumkeret méretére?
Nincs. Az OLE keretet bármilyen méretre beállíthatja, ameddig megfelelően skálázódik a munkafüzet vagy a diagram méretéhez.

Használhatom ezeket a módszereket más táblázatkezelő programokkal létrehozott diagramokkal is?
A példák Excel‑diagramokra vonatkoznak, amelyeket az Aspose.Cells készít, de az elvek más OLE‑kompatibilis táblázatprogramokra is alkalmazhatók, ha támogatják a hasonló méretezési beállításokat.

Kapcsolódó szakaszok