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

Háttér

Megfigyeltük, hogy az Aspose komponenseken keresztül egy PowerPoint‑prezentációba beágyazott OLE‑objektumként megjelenő Excel‑diagramok az első aktiválásuk után meghatározatlan méretarányra változnak. Ez a viselkedés észrevehető vizuális különbséget okoz a prezentációban a diagram aktiválás előtti és utáni állapota között. Az Aspose csapata részletesen kivizsgá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.

A előző cikk-ben elmagyaráztuk, hogyan hozhatunk létre Excel‑diagramot az Aspose.Cells for Java segítségével, és hogyan ágyazhatjuk be azt egy PowerPoint‑prezentációba az Aspose.Slides for Java használatával. Az objektum előnézet probléma kezelésére a diagram képét rendeltük a diagram OLE‑objektumkeretéhez. A kimeneti prezentációban, ha duplán rákattintunk a diagram képet megjelenítő OLE‑objektumkeretre, az Excel‑diagram aktiválódik. A végfelhasználók tetszőleges módosításokat végezhetnek a háttér‑Excel‑munkafüzetben, majd a aktivált munkafüzeten kívülre 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 keret és a beágyazott Excel‑munkafüzet eredeti méretei alapján változik.

Az átméretezés oka

Mivel az Excel‑munkafüzetnek saját ablakmérete van, az első aktiváláskor megpróbálja megtartani 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 a beá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 különbségek függvényében történik az átméretezés.

Működő megoldás

Két lehetséges forgatókönyv van a PowerPoint‑prezentációk létrehozására az Aspose.Slides for Java használatával.

1. forgatókönyv: Létrehozni egy prezentációt meglévő sablon alapján.
2. forgatókönyv: Létrehozni egy prezentációt a semmiből.

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

Első megközelítés

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

1. forgatókönyv

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 szeretnénk egy OLE‑keretet elhelyezni, amely beágyazott Excel‑munkafüzettel tartalmaz. Ebben a forgatókönyvben az OLE‑objektumkeret mérete előre meghatározott – egyezik a sablon 2. indexű alakzatának méretével. Csak annyit kell tennünk, hogy a munkafüzet ablakméretét ennek az alakzatnak a méretével állítjuk egyenlővé. A következő kódrészlet ezt a célt szolgálja:

// Állítsa be a munkafüzet ablakának szélességét hüvelykben (osztva 576-tal, mivel a PowerPoint 576 képpontot használ hüvelykenként).
workbook.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth() / 72f);
 
// Állítsa be a munkafüzet ablakának magasságát hüvelykben.
workbook.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight() / 72f);
 
// Mentse a munkafüzetet egy memóriafolyamra.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    slide.getShapes().get_Item(2).getX(),
    slide.getShapes().get_Item (2).getY(),
    slide.getShapes().get_Item (2).getWidth(),
    slide.getShapes().get_Item (2).getHeight(),
    "Excel.Sheet.8",
    workbookStream.toByteArray());

2. forgatókönyv

Tegyük fel, hogy a semmiből szeretnénk prezentációt létrehozni, és tetszőleges méretű OLE‑objektumkeretet szeretnénk beágyazott Excel‑munkafüzettel ellátni. Az alábbi kódrészletben egy OLE‑objektumkeretet hozunk létre, amely 4 hüvelyk magas és 9,5 hüvelyk széles, x = 0,5 hüvelyk, y = 1 hüvelyk helyen a dián. Ezután a Excel‑munkafüzet ablakát ugyanarra a méretre állítjuk – 4 hüvelyk magas és 9,5 hüvelyk széles.

// A kívánt magasságunk.
int desiredHeight = 288; // 4 hüvelyk (4 * 72)
 
// A kívánt szélességünk.
int 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 ablakának szélességét hüvelykben (osztva 576-tal, mivel a PowerPoint 576 képpontot használ hüvelykenként).
workbook.getSettings().setWindowWidthInch(desiredHeight / 72f);
 
// Állítsa be a munkafüzet ablakának magasságát hüvelykben.
workbook.getSettings().setWindowHeightInch(desiredWidth / 72f);
 
// Mentse a munkafüzetet egy memóriafolyamra.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    288,
    576,
    desiredWidth,
    desiredHeight,
    "Excel.Sheet.8",
    workbookStream.toByteArray());

Második megközelítés

Ebben a megközelítésben megtanuljuk, hogyan állítható be a beágyazott Excel‑munkafüzetben lévő diagram mérete ú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 nem fog változni.

1. forgatókönyv

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 egy OLE‑keretet akarunk elhelyezni, amely beágyazott Excel‑munkafüzettel rendelkezik. Ebben a forgatókönyvben az OLE‑keret mérete előre meghatározott – egyezik a sablon 2. indexű alakzatának méretével. Csak annyit kell tennünk, hogy a diagram méretét a munkafüzetben az alakzat méretével egyenlővé állítjuk. A következő kódrészlet ezt a célt szolgálja:

// 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 (szorozza 96-tal, mivel az Excel hüvelykenként 96 pixelt használ).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f));
 
// Állítsa be a diagram magasságát pixelben.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f));
 
// Határozza meg a diagram nyomtatási méretét.
chart.setPrintSize(PrintSizeType.CUSTOM);
 
// Mentse a munkafüzetet egy memóriafolyamra.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    slide.getShapes().get_Item(2).getX(),
    slide.getShapes().get_Item (2).getY(),
    slide.getShapes().get_Item (2).getWidth(),
    slide.getShapes().get_Item (2).getHeight(),
    "Excel.Sheet.8",
    workbookStream.toByteArray());

2. forgatókönyv

Tegyük fel, hogy a semmiből szeretnénk prezentációt létrehozni, és tetszőleges méretű OLE‑objektumkeretet szeretnénk beágyazott Excel‑munkafüzettel ellátni. Az alábbi kódrészletben egy OLE‑objektumkeretet hozunk létre, amelynek magassága 4 hüvelyk, szélessége 9,5 hüvelyk, x = 0,5 hüvelyk, y = 1 hüvelyk helyen a dián. A megfelelő diagram méretét is ugyanarra a méretre állítjuk: magasság 4 hüvelyk, szélesség 9,5 hüvelyk.

// A kívánt magasságunk.
int desiredHeight = 288; // 4 hüvelyk (4 * 72)
 
// A kívánt szélességünk.
int desiredWidth = 684; // 9,5 hüvelyk (9,5 * 72)
 
// 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 (szorozza 96-tal, mivel az Excel hüvelykenként 96 pixelt használ).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f));
 
// Állítsa be a diagram magasságát pixelben.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f));
 
// Mentse a munkafüzetet egy memóriafolyamra.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
 
// Hozzon létre egy OLE objektumkeretet a beágyazott Excel adatokkal.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    288,
    576,
    desiredWidth,
    desiredHeight,
    "Excel.Sheet.8",
    workbookStream.toByteArray());

Következtetés

Két megközelítés létezik a diagram-átméretezési probléma megoldására. A megközelítés választása a követelményektől és a felhasználási esettől függ. Mindkét megközelítés ugyanúgy működik, függetlenül attól, hogy a prezentációk sablon alapján vagy a semmiből készülnek. 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 PowerPointban 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éretet, míg a PowerPoint OLE‑objektumkerete saját dimenziókkal rendelkezik. A PowerPoint és az Excel egyeztetik a méretet a képarány megőrzése érdekében, ami az átméretezést okozhat.

Lehetséges-e teljesen megakadályozni ezt az átméretezési problémát?
Igen. Ha a beágyazás előtt az Excel‑munkafüzet ablakméretét vagy a diagram méretét az OLE‑objektumkeret méretéhez igazítjuk, a diagramméretek konzisztens maradnak.

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é tartani a munkafüzet képarányát, és később lehetővé szeretné tenni az átmé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 fognak változni.

Működnek-e ezek a módszerek mind sablon‑alapú, mind új prezentációk esetén?
Igen. Mindkét megközelítés ugyanúgy működik a sablonból létrehozott és a semmiből készült prezentációk esetén.

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

Használhatom-e ezeket a módszereket más táblázatkezelő programokkal készített diagramokkal?
A példák Excel-diagramokra vonatkoznak, amelyeket az Aspose.Cells segítségével hoztak létre, de az elvek más OLE‑kompatibilis táblázatkezelő programokra is alkalmazhatók, amennyiben hasonló méretezési lehetőségeket támogatnak.

Kapcsolódó szakaszok