Gérer les classeurs de graphiques dans les présentations avec PHP
Vue d’ensemble
Cet article explique comment travailler avec les classeurs de graphiques dans Aspose.Slides. Il montre comment lire et écrire les données de graphique via des flux de classeur, utiliser les cellules du classeur comme étiquettes de données de graphique, accéder aux collections de feuilles de calcul et spécifier le type de source de données pour les valeurs du graphique.
Il couvre également le travail avec des classeurs externes comme sources de données de graphique. Les exemples montrent comment créer et assigner un classeur externe, récupérer le chemin d’un classeur externe lié à un graphique, et modifier les données du graphique lorsque le classeur est disponible.
Lire et écrire des données de graphique depuis un classeur
Aspose.Slides fournit les méthodes readWorkbookStream et writeWorkbookStream qui vous permettent de lire et d’écrire des classeurs de données de graphique (contenant des données de graphique modifiées avec Aspose.Cells). Remarque les données du graphique doivent être organisées de la même manière ou posséder une structure similaire à la source.
Ce code PHP montre une opération d’exemple :
$pres = new Presentation("chart.pptx");
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$data = $chart->getChartData();
$stream = $data->readWorkbookStream();
$data->getSeries()->clear();
$data->getCategories()->clear();
$data->writeWorkbookStream($stream);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Valider la mise en page du graphique après modification du classeur
Lorsque vous remplacez un classeur incorporé par un classeur modifié, le graphique conserve ses collections de séries et de catégories d’origine. Cette incohérence peut provoquer l’échec de Chart::validateChartLayout avec une erreur d’indice hors limites. Effacez les séries et catégories existantes avant d’écrire le classeur mis à jour dans le graphique.
// Après avoir modifié le flux du classeur (par exemple, en utilisant Aspose.Cells)
$updatedWorkbook = $chartData->readWorkbookStream();
// Effacer les références de données existantes.
$chartData->getSeries()->clear();
$chartData->getCategories()->clear();
$chartData->writeWorkbookStream($updatedWorkbook);
$chart->validateChartLayout();
Effacer les collections garantit que la structure des données du graphique est cohérente avec le nouveau classeur, permettant à validateChartLayout de s’exécuter sans erreurs.
Définir une cellule de classeur comme étiquette de données de graphique
- Créer une instance de la classe Presentation.
- Obtenir la référence d’une diapositive via son index.
- Ajouter un graphique à bulles avec quelques données.
- Accéder aux séries du graphique.
- Définir la cellule du classeur comme étiquette de données.
- Enregistrer la présentation.
Ce code PHP montre comment définir une cellule de classeur comme étiquette de données de graphique :
$lbl0 = "Label 0 cell value";
$lbl1 = "Label 1 cell value";
$lbl2 = "Label 2 cell value";
# Instancie une classe Presentation qui représente un fichier de présentation
$pres = new Presentation("chart2.pptx");
try {
$slide = $pres->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::Bubble, 50, 50, 600, 400, true);
$series = $chart->getChartData()->getSeries();
$dataLabelCollection = $series->get_Item(0)->getLabels();
$dataLabelCollection->getDefaultDataLabelFormat()->setShowLabelValueFromCell(true);
$wb = $chart->getChartData()->getChartDataWorkbook();
$dataLabelCollection->get_Item(0)->setValueFromCell($wb->getCell(0, "A10", $lbl0));
$dataLabelCollection->get_Item(1)->setValueFromCell($wb->getCell(0, "A11", $lbl1));
$dataLabelCollection->get_Item(2)->setValueFromCell($wb->getCell(0, "A12", $lbl2));
$pres->save("resultchart.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Gérer les feuilles de calcul
Ce code PHP montre une opération où la méthode ChartDataWorkbook::getWorksheets est utilisée pour accéder à une collection de feuilles de calcul :
$pres = new Presentation();
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 500);
$wb = $chart->getChartData()->getChartDataWorkbook();
for($i = 0; $i < java_values($wb->getWorksheets()->size()) ; $i++) {
echo($wb->getWorksheets()->get_Item($i)->getName());
}
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Spécifier le type de source de données
Ce code PHP montre comment spécifier un type pour une source de données :
$pres = new Presentation();
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Column3D, 50, 50, 600, 400, true);
$val = $chart->getChartData()->getSeries()->get_Item(0)->getName();
$val->setDataSourceType(DataSourceType::StringLiterals);
$val->setData("LiteralString");
$val = $chart->getChartData()->getSeries()->get_Item(1)->getName();
$val->setData($chart->getChartData()->getChartDataWorkbook()->getCell(0, "B1", "NewCell"));
$pres->save("pres.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Détecter les formats de classeur incorporé non pris en charge
Aspose.Slides ne prend pas en charge le format de classeur Excel binaire (.xlsb) qui peut être incorporé dans certains graphiques. Vous pouvez utiliser la méthode getEmbeddedWorkbookType sur ChartData ainsi que l’enumération WorkbookType pour détecter les formats non pris en charge et ignorer ces graphiques.
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shapes = $slide->getShapes();
for ($shapeIndex = 0; $shapeIndex < java_values($shapes->size()); $shapeIndex++) {
$shape = $shapes->get_Item($shapeIndex);
if (!java_instanceof($shape, new JavaClass("com.aspose.slides.IChart"))) {
continue;
}
$chart = $shape;
$chartData = $chart->getChartData();
if (java_values($chartData->getDataSourceType()) == ChartDataSourceType::InternalWorkbook &&
java_values($chartData->getEmbeddedWorkbookType()) == WorkbookType::WorkbookBinaryMacro) {
# Le classeur incorporé est au format .xlsb, qui n'est pas supporté.
continue;
}
# Lire ou modifier les données du classeur du graphique ici.
}
} finally {
$presentation->dispose();
}
Classeur externe
Aspose.Slides prend en charge les classeurs externes comme source de données pour les graphiques.
Créer un classeur externe
En utilisant les méthodes readWorkbookStream et setExternalWorkbook, vous pouvez soit créer un classeur externe à partir de zéro, soit rendre un classeur interne externe.
Ce code PHP montre le processus de création du classeur externe :
$pres = new Presentation();
$Array = new java_class("java.lang.reflect.Array");
try {
$workbookPath = "externalWorkbook1.xlsx";
$chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600);
$fileStream = new Java("java.io.FileOutputStream", $workbookPath);
$Array = new java_class("java.lang.reflect.Array");
try {
$workbookData = $chart->getChartData()->readWorkbookStream();
$fileStream->write($workbookData, 0, $Array->getLength($workbookData));
} finally {
if (!java_is_null($fileStream)) {
$fileStream->close();
}
}
$chart->getChartData()->setExternalWorkbook($workbookPath);
$pres->save("externalWorkbook.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Attribuer un classeur externe
En utilisant la méthode setExternalWorkbook, vous pouvez assigner un classeur externe à un graphique comme source de données. Cette méthode peut également être utilisée pour mettre à jour le chemin du classeur externe (si ce dernier a été déplacé).
Bien que vous ne puissiez pas modifier les données des classeurs stockés à distance ou dans des ressources, vous pouvez toujours les utiliser comme source de données externe. Si le chemin relatif d’un classeur externe est fourni, il est automatiquement converti en chemin complet.
Ce code PHP montre comment attribuer un classeur externe :
# Crée une instance de la classe Presentation
$pres = new Presentation("chart.pptx");
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600, false);
$chartData = $chart->getChartData();
$chartData->setExternalWorkbook("externalWorkbook.xlsx");
$chartData->getSeries()->add($chartData->getChartDataWorkbook()->getCell(0, "B1"), ChartType::Pie);
$chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B2"));
$chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B3"));
$chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B4"));
$chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A2"));
$chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A3"));
$chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A4"));
$pres->save("Presentation_with_externalWorkbook.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Le paramètre ChartData (dans la méthode setExternalWorkbook) sert à spécifier si un classeur Excel sera chargé ou non.
- Lorsque la valeur de
ChartDataestfalse, seul le chemin du classeur est mis à jour — les données du graphique ne seront pas chargées ou mises à jour à partir du classeur cible. Vous pouvez utiliser ce paramètre lorsqu’il n’y a pas de classeur cible ou qu’il n’est pas disponible. - Lorsque la valeur de
ChartDataesttrue, les données du graphique sont mises à jour à partir du classeur cible.
# Crée une instance de la classe Presentation
$pres = new Presentation("chart.pptx");
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600, true);
$chartData = $chart->getChartData();
$chartData->setExternalWorkbook("http://path/doesnt/exists", false);
$pres->save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Obtenir le chemin du classeur source de données externe d’un graphique
- Créer une instance de la classe Presentation.
- Obtenir la référence d’une diapositive via son index.
- Créer un objet pour la forme du graphique.
- Créer un objet pour le type source (
ChartDataSourceType) qui représente la source de données du graphique. - Spécifier la condition pertinente en fonction du fait que le type de source corresponde au type de source de données du classeur externe.
Ce code PHP montre l’opération :
# Crée une instance de la classe Presentation
$pres = new Presentation("chart.pptx");
try {
$slide = $pres->getSlides()->get_Item(1);
$chart = $slide->getShapes()->get_Item(0);
$sourceType = $chart->getChartData()->getDataSourceType();
if ($sourceType == ChartDataSourceType::ExternalWorkbook) {
$path = $chart->getChartData()->getExternalWorkbookPath();
}
# Enregistre la présentation
$pres->save("result.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Modifier les données du graphique
Vous pouvez modifier les données des classeurs externes de la même manière que vous modifiez le contenu des classeurs internes. Lorsqu’un classeur externe ne peut pas être chargé, une exception est levée.
Ce code PHP implémente le processus décrit :
# Crée une instance de la classe Presentation
$pres = new Presentation("chart.pptx");
try {
$chart = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$chartData = $chart->getChartData();
$chartData->getSeries()->get_Item(0)->getDataPoints()->get_Item(0)->getValue()->getAsCell()->setValue(100);
$pres->save("presentation_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Récupérer un classeur depuis le cache du graphique
Si un graphique utilise un classeur externe manquant ou indisponible, Aspose.Slides peut reconstruire le classeur du graphique à partir des données mises en cache dans la présentation. Créez LoadOptions, configurez-le avec SpreadsheetOptions, et appelez SpreadsheetOptions::setRecoverWorkbookFromChartCache avec true avant d’ouvrir la présentation.
L’exemple PHP suivant ouvre une présentation dont le graphique référence un classeur externe indisponible et accède aux données récupérées via Chart::getChartData et ChartData::getChartDataWorkbook:
$spreadsheetOptions = new SpreadsheetOptions();
$spreadsheetOptions->setRecoverWorkbookFromChartCache(true);
$loadOptions = new LoadOptions();
$loadOptions->setSpreadsheetOptions($spreadsheetOptions);
$presentation = new Presentation("presentation.pptx", $loadOptions);
try {
$chart = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
$recoveredWorkbook = $chart->getChartData()->getChartDataWorkbook();
# Lire ou modifier les données du classeur récupéré ici.
} finally {
$presentation->dispose();
}
Si le classeur externe est indisponible et que la récupération est désactivée, Aspose.Slides lève une exception. Activez la récupération uniquement lorsque l’utilisation des données de graphique mises en cache est une solution de secours acceptable, car le cache peut ne pas contenir les modifications apportées au classeur externe après la dernière mise à jour de la présentation.
FAQ
Puis-je déterminer si un graphique spécifique est lié à un classeur externe ou incorporé ?
Oui. Un graphique possède un type de source de données et un chemin vers un classeur externe; si la source est un classeur externe, vous pouvez lire le chemin complet pour vous assurer qu’un fichier externe est utilisé.
Les chemins relatifs vers les classeurs externes sont-ils pris en charge, et comment sont-ils stockés ?
Oui. Si vous spécifiez un chemin relatif, il est automatiquement converti en chemin absolu. Cela est pratique pour la portabilité du projet ; toutefois, sachez que la présentation stockera le chemin absolu dans le fichier PPTX.
Puis-je utiliser des classeurs situés sur des ressources ou partages réseau ?
Oui, ces classeurs peuvent être utilisés comme source de données externe. Cependant, la modification directe de classeurs distants depuis Aspose.Slides n’est pas prise en charge — ils ne peuvent être utilisés qu’en tant que source.
Aspose.Slides écrase-t-il le fichier XLSX externe lors de l’enregistrement de la présentation ?
Non. La présentation stocke un lien vers le fichier externe et l’utilise pour lire les données. Le fichier externe lui‑même n’est pas modifié lors de l’enregistrement de la présentation.
Que faire si le fichier externe est protégé par un mot de passe ?
Aspose.Slides n’accepte pas de mot de passe lors de la liaison. Une approche courante consiste à enlever la protection à l’avance ou à préparer une copie déchiffrée (par exemple, en utilisant Aspose.Cells) et à créer le lien vers cette copie.
Plusieurs graphiques peuvent-ils référencer le même classeur externe ?
Oui. Chaque graphique stocke son propre lien. S’ils pointent tous vers le même fichier, la mise à jour de ce fichier sera reflétée dans chaque graphique lors du prochain chargement des données.