Formater les graphiques de présentation en PHP
Vue d’ensemble
Cet article explique comment formater les graphiques dans les présentations PowerPoint en utilisant Aspose.Slides. Il montre comment personnaliser les éléments clés d’un graphique tels que les axes, les lignes de grille, les titres, les légendes, la zone de tracé et les remplissages des murs afin d’améliorer l’apparence et la lisibilité des données du graphique.
Il démontre également comment définir les propriétés de police pour le texte du graphique, appliquer des formats numériques prédéfinis aux données du graphique et activer les coins arrondis pour la zone du graphique. Ensemble, ces exemples montrent comment contrôler à la fois le style visuel et la présentation des données d’un graphique dans une présentation.
Formater les entités du graphique
Utilisez Chart pour formater les titres de graphique, les axes, les lignes de grille, les légendes et la zone de tracé. Cet exemple crée un graphique en courbes avec des marqueurs et des données par défaut, puis applique des styles de texte et de ligne distincts à ses axes de valeurs et de catégories. Les tailles de police et les épaisseurs de ligne sont spécifiées en points ; les libellés de catégorie sont pivotés de 45 degrés.
L’axe des valeurs utilise setNumberFormat indépendamment des cellules source. Son échelle s’étend de -2 à 15, avec des intervalles majeurs de 2 et des intervalles mineurs de 0,5. L’exemple combine également le format de pourcentage avec setDisplayUnit réglé sur des milliers, adaptez donc ces paramètres à la signification et à l’ampleur de vos données. La légende reste à l’extérieur de la zone de tracé car setOverlay est appelé avec false. Les remplissages du mur arrière et du sol sont configurés via getBackWall et getFloor, mais ces surfaces ne sont visibles que dans les graphiques 3D.
use aspose\slides\ChartType;
use aspose\slides\DisplayUnitType;
use aspose\slides\FillType;
use aspose\slides\FontData;
use aspose\slides\LineDashStyle;
use aspose\slides\NullableBool;
use aspose\slides\Presentation;
use aspose\slides\PresetColor;
use aspose\slides\SaveFormat;
use aspose\slides\TickLabelPositionType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::LineWithMarkers, 50, 50, 500, 400);
$chart->setTitle(true);
$chart->getChartTitle()->addTextFrameForOverriding("");
$chartTitle = $chart->getChartTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$chartTitle->setText("Sample Chart");
$chartTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$chartTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$chartTitle->getPortionFormat()->setFontHeight(20);
$chartTitle->getPortionFormat()->setFontBold(NullableBool::True);
$chartTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->setWidth(5);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->setDashStyle(LineDashStyle::DashDot);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->setWidth(3);
$chart->getAxes()->getVerticalAxis()->setNumberFormatLinkedToSource(false);
$chart->getAxes()->getVerticalAxis()->setDisplayUnit(DisplayUnitType::Thousands);
$chart->getAxes()->getVerticalAxis()->setNumberFormat("0.0%");
$chart->getAxes()->getVerticalAxis()->setAutomaticMajorUnit(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMaxValue(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMinorUnit(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMinValue(false);
$chart->getAxes()->getVerticalAxis()->setMaxValue(15);
$chart->getAxes()->getVerticalAxis()->setMinValue(-2);
$chart->getAxes()->getVerticalAxis()->setMinorUnit(0.5);
$chart->getAxes()->getVerticalAxis()->setMajorUnit(2.0);
$valueAxisText = $chart->getAxes()->getVerticalAxis()->getTextFormat()->getPortionFormat();
$valueAxisText->setFontBold(NullableBool::True);
$valueAxisText->setFontHeight(16);
$valueAxisText->setFontItalic(NullableBool::True);
$valueAxisText->getFillFormat()->setFillType(FillType::Solid);
$valueAxisText->getFillFormat()->getSolidFillColor()->setPresetColor(PresetColor::DarkGreen);
$valueAxisText->setLatinFont(new FontData("Times New Roman"));
$chart->getAxes()->getVerticalAxis()->setTitle(true);
$chart->getAxes()->getVerticalAxis()->getTitle()->addTextFrameForOverriding("");
$valueAxisTitle = $chart->getAxes()->getVerticalAxis()->getTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$valueAxisTitle->setText("Primary Axis");
$valueAxisTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$valueAxisTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$valueAxisTitle->getPortionFormat()->setFontHeight(20);
$valueAxisTitle->getPortionFormat()->setFontBold(NullableBool::True);
$valueAxisTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(new Java("java.awt.Color", 0, 128, 0));
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->setWidth(5);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->YELLOW);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->setWidth(3);
$categoryAxisText = $chart->getAxes()->getHorizontalAxis()->getTextFormat()->getPortionFormat();
$categoryAxisText->setFontBold(NullableBool::True);
$categoryAxisText->setFontHeight(16);
$categoryAxisText->setFontItalic(NullableBool::True);
$categoryAxisText->getFillFormat()->setFillType(FillType::Solid);
$categoryAxisText->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$categoryAxisText->setLatinFont(new FontData("Arial"));
$chart->getAxes()->getHorizontalAxis()->setTitle(true);
$chart->getAxes()->getHorizontalAxis()->getTitle()->addTextFrameForOverriding("");
$categoryAxisTitle = $chart->getAxes()->getHorizontalAxis()->getTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$categoryAxisTitle->setText("Sample Category");
$categoryAxisTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$categoryAxisTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$categoryAxisTitle->getPortionFormat()->setFontHeight(20);
$categoryAxisTitle->getPortionFormat()->setFontBold(NullableBool::True);
$categoryAxisTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getHorizontalAxis()->setTickLabelPosition(TickLabelPositionType::Low);
$chart->getAxes()->getHorizontalAxis()->setTickLabelRotationAngle(45);
$legendText = $chart->getLegend()->getTextFormat()->getPortionFormat();
$legendText->setFontBold(NullableBool::True);
$legendText->setFontHeight(16);
$legendText->setFontItalic(NullableBool::True);
$legendText->getFillFormat()->setFillType(FillType::Solid);
$legendText->getFillFormat()->getSolidFillColor()->setPresetColor(PresetColor::DarkRed);
$chart->getLegend()->setOverlay(false);
$chart->getBackWall()->setThickness(1);
$chart->getBackWall()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getBackWall()->getFormat()->getFill()->getSolidFillColor()->setColor(new Java("java.awt.Color", 255, 165, 0));
$chart->getFloor()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getFloor()->getFormat()->getFill()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$chart->getPlotArea()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getPlotArea()->getFormat()->getFill()->getSolidFillColor()->setPresetColor(PresetColor::LightCyan);
$presentation->save("FormattedChart_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Définir les propriétés de police pour un graphique
Définissez la taille de police par défaut pour le texte du graphique via Chart::getTextFormat. L’exemple crée un graphique à colonnes groupées avec une police de 20 points et active les libellés de valeur pour la première série via setShowValue. Les éléments de texte disposant de leurs propres paramètres de police explicites peuvent remplacer la valeur par défaut du graphique.
use aspose\slides\ChartType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 100, 100, 500, 400);
$chart->getTextFormat()->getPortionFormat()->setFontHeight(20);
$chart->getChartData()->getSeries()->get_Item(0)->getLabels()->getDefaultDataLabelFormat()->setShowValue(true);
$presentation->save("FontPropertiesForChart.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Définir le format numérique
Utilisez ChartDataCell::setPresetNumberFormat pour appliquer un format numérique intégré aux cellules du classeur du graphique. Cet exemple crée un graphique à colonnes groupées avec des données par défaut, soutenues par des cellules, et applique l’indice de format 10 (0.00%) à chaque cellule de valeur de série. Cela modifie la façon dont les valeurs sont affichées dans le classeur sans changer les nombres sous‑jacent ; par exemple, 0,25 s’affiche comme 25,00 %. Les formats d’axe et d’étiquette de données peuvent être configurés séparément.
use aspose\slides\ChartType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 400);
$series = $chart->getChartData()->getSeries();
for ($i = 0; $i < java_values($series->size()); $i++) {
$chartSeries = $series->get_Item($i);
$dataPoints = $chartSeries->getDataPoints();
for ($j = 0; $j < java_values($dataPoints->size()); $j++) {
$dataPoint = $dataPoints->get_Item($j);
$dataPoint->getValue()->getAsCell()->setPresetNumberFormat(10); // 0,00%
}
}
$presentation->save("PresetNumberFormat_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Le tableau suivant répertorie les indices de format numérique intégrés avec des formats Excel représentatifs pour la locale anglais (États‑Unis). Les chaînes de format exactes et leur affichage peuvent varier selon l’application et la locale, notamment pour les monnaies et les dates. Certains formats Excel diffèrent également des valeurs par défaut de la norme OOXML, comme décrit dans les notes d’implémentation du format numérique de Microsoft.
| Index | Format |
|---|---|
| 0 | General |
| 1 | 0 |
| 2 | 0.00 |
| 3 | #,##0 |
| 4 | #,##0.00 |
| 5 | "$"#,##0_);("$"#,##0) |
| 6 | "$"#,##0_);[Red]("$"#,##0) |
| 7 | "$"#,##0.00_);("$"#,##0.00) |
| 8 | "$"#,##0.00_);[Red]("$"#,##0.00) |
| 9 | 0% |
| 10 | 0.00% |
| 11 | 0.00E+00 |
| 12 | # ?/? |
| 13 | # ??/?? |
| 14 | m/d/yyyy |
| 15 | d-mmm-yy |
| 16 | d-mmm |
| 17 | mmm-yy |
| 18 | h:mm AM/PM |
| 19 | h:mm:ss AM/PM |
| 20 | h:mm |
| 21 | h:mm:ss |
| 22 | m/d/yyyy h:mm |
| 37 | #,##0_);(#,##0) |
| 38 | #,##0_);[Red](#,##0) |
| 39 | #,##0.00_);(#,##0.00) |
| 40 | #,##0.00_);[Red](#,##0.00) |
| 41 | _(* #,##0_);_(* (#,##0);_(* "-"_);_(@_) |
| 42 | _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_) |
| 43 | _(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_) |
| 44 | _("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_) |
| 45 | mm:ss |
| 46 | [h]:mm:ss |
| 47 | mm:ss.0 |
| 48 | ##0.0E+0 |
| 49 | @ |
Définir les bordures arrondies de la zone du graphique
Appelez Chart::setRoundedCorners avec true pour arrondir les coins de la zone du graphique. L’exemple crée un graphique à colonnes groupées et utilise getLineFormat pour donner à son contour une couleur grise solide et un style de ligne simple avant d’enregistrer la présentation.
use aspose\slides\ChartType;
use aspose\slides\FillType;
use aspose\slides\LineStyle;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 20, 100, 600, 400);
$chart->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$chart->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$chart->getLineFormat()->setStyle(LineStyle::Single);
$chart->setRoundedCorners(true);
$presentation->save("out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Modifier les annotations de graphique existantes
Un graphique peut contenir des formes personnalisées, comme une annotation texte expliquant l’état d’un rapport. Accédez à ces formes via Chart::getUserShapes. La collection renvoyée par getShapes comprend les formes appartenant au graphique.
Une zone de texte ordinaire placée sur un graphique appartient à la diapositive, même si elle ressemble à une partie du graphique. Parcourir Slide::getShapes trouve le graphique ainsi que les formes de diapositive ordinaires, mais n’énumère pas les formes individuelles à l’intérieur du graphique. Les titres de graphique et les étiquettes de données sont des éléments de graphique séparés, pas des annotations personnalisées dans cette collection.
Téléchargez chart-annotations.pptx et placez‑le dans le répertoire de travail de l’application. Sa première diapositive contient un graphique avec une annotation non groupée affichant « Preliminary results », une ligne appartenant au graphique et une zone de texte de diapositive ordinaire affichant « Slide overlay ». L’exemple trouve le premier graphique de cette diapositive et change l’annotation en « Final results » lorsque le rapport est prêt à être publié. Il vérifie qu’une collection n’est pas vide et ne modifie qu’un AutoShape dont le cadre texte retourné par getTextFrame n’est pas nul et dont le texte correspond à l’attendu.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("chart-annotations.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$chartType = new JavaClass("com.aspose.slides.IChart");
$autoShapeType = new JavaClass("com.aspose.slides.IAutoShape");
$chart = null;
for ($i = 0; $i < java_values($slide->getShapes()->size()); $i++) {
$shape = $slide->getShapes()->get_Item($i);
if (java_instanceof($shape, $chartType)) {
$chart = $shape;
break;
}
}
if ($chart === null || java_values($chart->getUserShapes()->getShapes()->size()) == 0) {
echo "No chart or chart-owned shapes found." . PHP_EOL;
return;
}
$updated = false;
$userShapes = $chart->getUserShapes()->getShapes();
for ($i = 0; $i < java_values($userShapes->size()); $i++) {
$shape = $userShapes->get_Item($i);
if (java_instanceof($shape, $autoShapeType)) {
$annotation = $shape;
if (!java_is_null($annotation->getTextFrame()) && java_values($annotation->getTextFrame()->getText()) === "Preliminary results") {
$annotation->getTextFrame()->setText("Final results");
$updated = true;
break;
}
}
}
if ($updated) {
$presentation->save("chart-annotations-updated.pptx", SaveFormat::Pptx);
} else {
echo "No matching text annotation found." . PHP_EOL;
}
} finally {
$presentation->dispose();
}
La ligne et la zone de texte de la diapositive restent inchangées. Les images suivantes montrent l’entrée et le résultat enregistré, puis rouvert :
| Avant modification | Après modification |
|---|---|
![]() |
![]() |
Note
L’exemple n’inspecte que les formes appartenant directement au graphique de niveau supérieur. Si une annotation se trouve à l’intérieur d’un GroupShape, inspectez également la collection getShapes de ce groupe. Répétez cette procédure de façon récursive pour les groupes imbriqués, en appliquant les mêmes vérifications de texte à leurs formes enfants. Un groupe lui‑même est un conteneur ; ne le traitez pas comme une zone de texte.FAQ
Puis‑je définir des remplissages semi‑transparents pour les colonnes/aires tout en gardant le contour opaque ?
Oui. La transparence du remplissage et le contour sont configurés séparément. Cela est utile pour améliorer la lisibilité de la grille et des données dans des visualisations denses.
Comment gérer les étiquettes de données lorsqu’elles se chevauchent ?
Réduisez la taille de la police, désactivez les composants d’étiquette non essentiels (par exemple, les catégories), ajustez la position de l’étiquette, n’affichez les étiquettes que pour les points sélectionnés si nécessaire, ou passez au format « valeur + légende ».
Puis‑je appliquer des remplissages en dégradé ou en motif aux séries ?
Oui. Les séries prennent en charge les remplissages solides, en dégradé et en motif. En pratique, utilisez les dégradés avec parcimonie et évitez les combinaisons qui réduisent le contraste avec la grille et le texte.

