A diagram átméretezésének munkaközeli megoldása PPTX-ben

Háttér

Megfigyeltük, hogy az Aspose komponenseken keresztül PowerPoint‑prezentációba beágyazott OLE objektumként szereplő Excel‑diagramok az első aktiválás után egy nem meghatározott skálára vannak átméretezve. 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.

Az előző cikkben elmagyaráztuk, hogyan hozhatunk létre egy Excel‑diagramot az Aspose.Cells for Java segítségével, és ágyazhatjuk be egy PowerPoint‑prezentációba az Aspose.Slides for Java segítségével. A objektum előnézeti problémájának megoldásához a diagram képét hozzárendeltük a diagram OLE objektumkeretéhez. A kimeneti prezentációban, ha duplán kattintunk az OLE objektumkeretre, amely a diagramképet mutatja, az Excel‑diagram aktiválódik. A végfelhasználók a mögöttes Excel‑munkafüzetben tetszőleges módosításokat végezhetnek, 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 tényező 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 a beágyazási folyamat részeként a helyes arányokat fenntartják. Az Excel‑ablakméret és az OLE objektumkeret mérete vagy pozíciója közti különbségek alapján történik az átméretezés.

Működő megoldás

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

Scenario 1: Létrehozni egy prezentációt egy meglévő sablon alapján.

Scenario 2: Létrehozni egy prezentációt a semmiből.

Az 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 a megoldás két megközelítését vesszük sorra.

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, hogy az egyezzen a PowerPoint‑dia OLE objektumkeretének méretével.

Scenario 1

Tegyük fel, hogy definiáltunk egy sablont, és szeretnénk belőle prezentációkat készíteni. Tegyük fel, hogy a sablonban a 2. indexű alakzat helyén OLE‑keretet szeretnénk elhelyezni, amely egy beágyazott Excel‑munkafüzetet 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. Ahhoz, hogy a munkafüzet ablakméretét az alakzat méretével egyeztesse, csak be kell állítanunk azt. A következő kódrészlet ezt a célt szolgálja:

import com.aspose.slides.*;
import java.io.ByteArrayOutputStream;

// Állítsa be a munkafüzet ablak szélességét hüvelykben (osztva 72-vel, mivel a PowerPoint hüvelykenként 72 pontot használ).
workbook.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth() / 72f);
 
// Állítsa be a munkafüzet ablak magasságát hüvelykben.
workbook.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight() / 72f);
 
// Mentse a munkafüzetet memóriafolyamba.
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.
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(workbookStream.toByteArray(), "xls");
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(),
    dataInfo);

Scenario 2

Tegyük fel, hogy a semmiből szeretnénk prezentációt létrehozni, és bármilyen méretű OLE objektumkeretet szeretnénk a beágyazott Excel‑munkafüzettel. A következő kódrészletben egy 4 hüvelyk magas és 9,5 hüvelyk széles OLE objektumkeretet hozunk létre a diáron x = 0,5 hüvelyk és y = 1 hüvelyk helyen. Ezután az Excel‑munkafüzet ablakát ugyanolyan méretűre állítjuk – 4 hüvelyk magas és 9,5 hüvelyk széles.

import com.aspose.slides.*;
import java.io.ByteArrayOutputStream;

// 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)
 
// Állítsa be a diagram méretét egy ablakban.
chart.setSizeWithWindow(true);
 
// Állítsa be a munkafüzet ablak szélességét hüvelykben (osztva 72-vel, mivel a PowerPoint hüvelykenként 72 pontot használ).
workbook.getSettings().setWindowWidthInch(desiredWidth / 72f);
 
// Állítsa be a munkafüzet ablak magasságát hüvelykben.
workbook.getSettings().setWindowHeightInch(desiredHeight / 72f);
 
// Mentse a munkafüzetet memóriafolyamba.
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.
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(workbookStream.toByteArray(), "xls");
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    36,  // x = 0,5 hüvelyk (0.5 * 72)
    72,  // y = 1 hüvelyk (1 * 72)
    desiredWidth,
    desiredHeight,
    dataInfo);

Második megközelítés

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

Scenario 1

Tegyük fel, hogy definiáltunk egy sablont, és szeretnénk belőle prezentációkat készíteni. Tegyük fel, hogy a sablonban a 2. indexű alakzat helyén OLE‑keretet akarunk elhelyezni, amely egy beágyazott Excel‑munkafüzetet tartalmaz. Ebben a forgatókönyvben az OLE keret mérete előre meghatározott – egyezik a sablon 2. indexű alakzatának méretével. Ahhoz, hogy a diagram méretét a munkafüzetben az alakzat méretével egyeztesse, csak be kell állítanunk azt. A következő kódrészlet ezt a célt szolgálja:

import com.aspose.slides.*;
import java.io.ByteArrayOutputStream;

// 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(com.aspose.cells.PrintSizeType.CUSTOM);
 
// Mentse a munkafüzetet memóriafolyamba.
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.
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(workbookStream.toByteArray(), "xls");
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(),
    dataInfo);

Scenario 2

Tegyük fel, hogy a semmiből szeretnénk prezentációt készíteni, és bármilyen méretű OLE objektumkeretet szeretnénk a beágyazott Excel‑munkafüzettel. A következő kódrészletben egy 4 hüvelyk magas és 9,5 hüvelyk széles OLE objektumkeretet hozunk létre a diáron x = 0,5 hüvelyk és y = 1 hüvelyk helyen. A diagram méretét is ugyanarra a méretre állítjuk: 4 hüvelyk magasság és 9,5 hüvelyk szélesség.

import com.aspose.slides.*;
import java.io.ByteArrayOutputStream;

// 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 (osztva 72-vel a hüvelykekhez, szorozva 96-tal, mivel az Excel hüvelykenként 96 pixelt használ).
chart.getChartObject().setWidth((int)((desiredWidth / 72f) * 96f));
 
// Állítsa be a diagram magasságát pixelben.
chart.getChartObject().setHeight((int)((desiredHeight / 72f) * 96f));
 
// Mentse a munkafüzetet memóriafolyamba.
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.
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(workbookStream.toByteArray(), "xls");
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
    36,  // x = 0,5 hüvelyk (0.5 * 72)
    72,  // y = 1 hüvelyk (1 * 72)
    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álasztás 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 sablonból vagy a semmiből készülnek. Emellett ebben a megoldásban nincs korlátozás az OLE objektumkeret méretére.

GYIK

Miért változik a beágyazott Excel‑diagram mérete a PowerPoint‑ban történő aktiválás után?

Ez azért fordul elő, 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 objektumkeretnek saját méretei vannak. A PowerPoint és az Excel egyeztetik a méretet az arányok megtartása érdekében, ami átméretezést okozhat.

Lehetséges-e teljesen elkerülni ezt az átméretezési problémát?

Igen. Ha az Excel‑munkafüzet ablakméretét vagy a diagram méretét a beágyazás előtt az OLE objektumkeret méretéhez igazítjuk, a diagram mérete konzisztens marad.

Melyik megközelítést válasszam, az ablakméret beállítását vagy a diagramméretet?

Használja a 1. megközelítést (ablakméret), ha a munkafüzet arányait szeretné megtartani, és esetleg később szeretne átméretezni.
Használja a 2. megközelítést (diagramméret), ha a diagram méretei előre rögzítettek és nem fognak változni a beágyazás után.

Működnek-e ezek a módszerek sablon‑alapú és új prezentációk esetén egyaránt?

Igen. Mindkét megközelítés egyformán működik sablonból és a semmiből készült prezentációk esetén.

Van-e korlátozás az OLE objektumkeret méretére?

Nincs. Az OLE keretet bármilyen méretre beállíthatja, amíg megfelelően méretezhető a munkafüzet vagy a diagram.

Használhatók-e ezek a módszerek más táblázatkezelő programokban létrehozott diagramokkal?

A példák az Aspose.Cells‑szel készült Excel‑diagramokra vonatkoznak, de az elv ugyanúgy alkalmazható más OLE‑kompatibilis táblázatkezelő programokra, amennyiben azok támogatják a hasonló méretezési beállításokat.

Kapcsolódó szakaszok