Solution Fonctionnelle pour le Redimensionnement de Graphiques dans PPTX
Contexte
Dans l’article précédent, nous avons expliqué comment créer un graphique Excel à l’aide d’Aspose.Cells pour Java et l’intégrer ensuite dans une présentation PowerPoint à l’aide d’Aspose.Slides pour PHP via Java. Afin de résoudre le problème de changement d’objet, nous avons attribué l’image du graphique au cadre de l’objet OLE du graphique. Dans la présentation de sortie, lorsque nous double-cliquons sur le cadre d’objet OLE montrant l’image du graphique, le graphique Excel est activé. Les utilisateurs finaux peuvent apporter les modifications souhaitées dans le classeur Excel réel, puis revenir à la diapositive concernée en cliquant en dehors du classeur Excel activé. La taille du cadre de l’objet OLE changera lorsque l’utilisateur reviendra à la diapositive. Le facteur de redimensionnement sera différent pour différentes tailles de cadre d’objet OLE et de classeur Excel intégré.
Cause du Redimensionnement
Étant donné que le classeur Excel a sa propre taille de fenêtre, il essaie de conserver sa taille d’origine lors de la première activation. D’autre part, le cadre d’objet OLE aura sa propre taille. Selon Microsoft, lors de l’activation du classeur Excel, Excel et PowerPoint négocient la taille et s’assurent qu’elle est dans les bonnes proportions dans le cadre de l’opération d’intégration. En fonction des différences de taille de fenêtres Excel et de taille / position du cadre d’objet OLE, le redimensionnement est effectué.
Solution Fonctionnelle
Il existe deux scénarios possibles pour la création des présentations PowerPoint à l’aide d’Aspose.Slides pour PHP via Java. Scénario 1 : Créer la présentation à partir d’un modèle existant Scénario 2 : Créer la présentation depuis le début. La solution que nous allons fournir ici sera valide pour les deux scénarios. La base de toutes les approches de solution sera la même. C’est-à-dire : La taille de la fenêtre de l’objet OLE intégré doit être la même que celle du cadre d’objet OLE dans la diapositive PowerPoint. Nous allons maintenant discuter des deux approches de la solution.
Première Approche
Dans cette approche, nous allons apprendre comment définir la taille de la fenêtre du classeur Excel intégré équivalente à la taille du cadre d’objet OLE dans la diapositive PowerPoint. Scénario 1 Supposons que nous avons défini un modèle et que nous souhaitons créer les présentations basées sur ce modèle. Disons qu’il y a une forme à l’index 2 dans le modèle où nous voulons placer un cadre OLE portant un classeur Excel intégré. Dans ce scénario, la taille du cadre d’objet OLE sera considérée comme pré-définie (qui est la taille de la forme à l’index 2 dans le modèle). Tout ce que nous avons à faire : définir la taille de la fenêtre du classeur égale à la taille de la forme. Le code suivant servira cet objectif :
try { | |
//set window width of the workbook in inches (divided by 576 as PowerPoint uses | |
//576 pixels / inch) | |
wb.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth()/72f); | |
//set window height of the workbook in inches | |
wb.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight()/72f); | |
//Save Workbook to Stream | |
ByteArrayOutputStream wbStream=new ByteArrayOutputStream(); | |
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Create an OLE Object Frame with embedded Excel | |
IOleObjectFrame oof = 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", wbStream.toByteArray()); | |
} catch (Exception e) { | |
} | |
Scénario 2 Disons que nous voulons créer une présentation depuis le début et souhaitons un cadre d’objet OLE de n’importe quelle taille avec un classeur Excel intégré. Dans le code suivant, nous avons créé un cadre d’objet OLE avec une hauteur de 4 pouces et une largeur de 9,5 pouces dans la diapositive à x = 0,5 pouce et y = 1 pouce. De plus, nous avons défini la taille de fenêtre équivalente du classeur Excel, c’est-à-dire : hauteur de 4 pouces et largeur de 9,5 pouces.
try { | |
//Our desired height | |
int desiredHeight = 288;////4 inch (4 * 72) | |
//Our desired width | |
int desiredWidth = 684;////9.5 inch (9.5 * 72) | |
//define chart size with window | |
chart.setSizeWithWindow(true); | |
//set window width of the workbook in inches (divided by 576 as PowerPoint uses | |
//576 pixels / inch) | |
wb.getSettings().setWindowWidthInch(desiredHeight/72f); | |
//set window height of the workbook in inches | |
wb.getSettings().setWindowHeightInch(desiredWidth/72f); | |
//Save Workbook to Stream | |
ByteArrayOutputStream wbStream=new ByteArrayOutputStream(); | |
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Create an OLE Object Frame with embedded Excel | |
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame( | |
288, | |
576, | |
desiredWidth, | |
desiredHeight, "Excel.Sheet.8", wbStream.toByteArray()); | |
} catch (Exception e) { | |
} |
Deuxième Approche
Dans cette approche, nous allons apprendre comment définir la taille du graphique présent dans le classeur Excel intégré équivalente à la taille du cadre d’objet OLE dans la diapositive PowerPoint. Cette approche est utile lorsque la taille du graphique à l’avance est connue et ne changera jamais. Scénario 1 Supposons que nous avons défini un modèle et que nous souhaitons créer les présentations basées sur ce modèle. Disons qu’il y a une forme à l’index 2 dans le modèle où nous voulons placer un cadre OLE portant un classeur Excel intégré. Dans ce scénario, la taille du cadre OLE sera considérée comme pré-définie (qui est la taille de la forme à l’index 2 dans le modèle). Tout ce que nous avons à faire : définir la taille du graphique dans le classeur égale à la taille de la forme. Le code suivant servira cet objectif :
try { | |
//define chart size with window | |
chart.setSizeWithWindow(false); | |
//set chart width in pixels (Multiply by 96 as Excel uses 96 pixels per inch) | |
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f)); | |
//set chart height in pixels | |
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f)); | |
//Define chart print size | |
chart.setPrintSize(PrintSizeType.CUSTOM); | |
//Save Workbook to Stream | |
ByteArrayOutputStream wbStream=new ByteArrayOutputStream(); | |
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Create an OLE Object Frame with embedded Excel | |
IOleObjectFrame oof = 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", wbStream.toByteArray()); | |
} catch (Exception e) { | |
} | |
Scénario 2 : Disons que nous voulons créer une présentation depuis le début et souhaitons un cadre d’objet OLE de n’importe quelle taille avec un classeur Excel intégré. Dans le code suivant, nous avons créé un cadre d’objet OLE avec une hauteur de 4 pouces et une largeur de 9,5 pouces dans la diapositive à x = 0,5 pouce et y = 1 pouce. De plus, nous avons défini la taille équivalente du graphique, c’est-à-dire : hauteur de 4 pouces et largeur de 9,5 pouces.
try { | |
//Our desired height | |
int desiredHeight = 288;////4 inch (4 * 72) | |
//Our desired width | |
int desiredWidth = 684;////9.5 inch (9.5 * 72) | |
//define chart size with window | |
chart.setSizeWithWindow(false); | |
//set chart width in pixels (Multiply by 96 as Excel uses 96 pixels per inch) | |
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f)); | |
//set chart height in pixels | |
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f)); | |
//Save Workbook to Stream | |
ByteArrayOutputStream wbStream=new ByteArrayOutputStream(); | |
wb.save(wbStream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Create an OLE Object Frame with embedded Excel | |
IOleObjectFrame oof = slide.getShapes().addOleObjectFrame( | |
288, | |
576, | |
desiredWidth, | |
desiredHeight, "Excel.Sheet.8", wbStream.toByteArray()); | |
} catch (Exception e) { | |
} | |