Gérer les classeurs de graphiques dans les présentations sur Android

Lire et écrire des données de graphique depuis un classeur

Aspose.Slides fournit les méthodes ReadWorkbookStream et WriteWorkbookStream qui 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 avoir une structure similaire à celle de la source.

Ce code Java montre une opération d’exemple :

Presentation pres = new Presentation("chart.pptx");
try {
    Chart chart = (Chart) pres.getSlides().get_Item(0).getShapes().get_Item(0);
    IChartData data = chart.getChartData();

    byte[] stream = data.readWorkbookStream();

    data.getSeries().clear();
    data.getCategories().clear();

    data.writeWorkbookStream(stream);
} finally {
    if (pres != null) pres.dispose();
}

Définir une cellule de classeur comme libellé de données de graphique

  1. Créez une instance de la classe Presentation.
  2. Obtenez la référence d’une diapositive par son indice.
  3. Ajoutez un graphique à bulles avec quelques données.
  4. Accédez aux séries du graphique.
  5. Définissez la cellule du classeur comme libellé de données.
  6. Enregistrez la présentation.

Ce code Java montre comment définir une cellule de classeur comme libellé de données de graphique :

String lbl0 = "Label 0 cell value";
String lbl1 = "Label 1 cell value";
String lbl2 = "Label 2 cell value";

// Instancie une classe de présentation qui représente un fichier de présentation
Presentation pres = new Presentation("chart2.pptx");
try {
    ISlide slide = pres.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, true);
    IChartSeriesCollection series = chart.getChartData().getSeries();
    
    IDataLabelCollection dataLabelCollection = series.get_Item(0).getLabels();
    dataLabelCollection.getDefaultDataLabelFormat().setShowLabelValueFromCell(true);

    IChartDataWorkbook 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 (pres != null) pres.dispose();
}

Gérer les feuilles de calcul

Ce code Java montre une opération où la méthode IChartDataWorkbook.Worksheets est utilisée pour accéder à la collection de feuilles de calcul :

Presentation pres = new Presentation();
try {
    IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 500);
    IChartDataWorkbook wb =  chart.getChartData().getChartDataWorkbook();
    for (int i = 0; i < wb.getWorksheets().size(); i++)
        System.out.println(wb.getWorksheets().get_Item(i).getName());
} finally {
    if (pres != null) pres.dispose();
}

Spécifier le type de source de données

Ce code Java montre comment spécifier un type pour une source de données :

Presentation pres = new Presentation();
try {
    IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, true);
    IStringChartValue 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 (pres != null) pres.dispose();
}

Détecter les formats de classeur incorporés 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 IChartData avec l’énumération WorkbookType pour détecter les formats non pris en charge et ignorer ces graphiques.

Presentation presentation = new Presentation("sample.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    for (IShape shape : slide.getShapes()) {
        if (!(shape instanceof IChart)) continue;

        IChart chart = (IChart)shape;
        IChartData chartData = chart.getChartData();

        if (chartData.getDataSourceType() == ChartDataSourceType.InternalWorkbook &&
                chartData.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro) {
            // Le classeur incorporé est au format .xlsb, qui n'est pas pris en charge.
            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 Java montre le processus de création d’un classeur externe :

Presentation pres = new Presentation();
try {
    final String workbookPath = "externalWorkbook1.xlsx";

    IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600);
    FileOutputStream fileStream = new FileOutputStream(workbookPath);
    try {
        byte[] workbookData = chart.getChartData().readWorkbookStream();
        fileStream.write(workbookData, 0, workbookData.length);
    } finally {
        if (fileStream != null) fileStream.close();
    }

    chart.getChartData().setExternalWorkbook(workbookPath);

    pres.save("externalWorkbook.pptx", SaveFormat.Pptx);
} catch (IOException e) {    
} finally {
    if (pres != null) pres.dispose();
}

Définir un classeur externe

En utilisant la méthode setExternalWorkbook, vous pouvez associer 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 dans des emplacements ou des ressources distants, vous pouvez toujours les utiliser comme source de données externe. Si un chemin relatif vers un classeur externe est fourni, il est automatiquement converti en chemin complet.

Ce code Java montre comment définir un classeur externe :

// Crée une instance de la classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
    IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, false);
    IChartData 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 (pres != null) pres.dispose();
}

Le paramètre ChartData (dans la méthode setExternalWorkbook) indique si un classeur Excel doit être chargé ou non.

  • Lorsque la valeur de ChartData est false, seul le chemin du classeur est mis à jour — les données du graphique ne sont pas chargées ni mises à jour depuis le classeur cible. Utilisez ce paramètre lorsque le classeur cible est inexistant ou indisponible.
  • Lorsque la valeur de ChartData est true, les données du graphique sont mises à jour depuis le classeur cible.
// Crée une instance de la classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
    IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
    IChartData chartData = chart.getChartData();

    ((ChartData)chartData).setExternalWorkbook("http://path/doesnt/exists", false);

    pres.save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Obtenir le chemin du classeur source de données externe d’un graphique

  1. Créez une instance de la classe Presentation.
  2. Obtenez la référence d’une diapositive par son indice.
  3. Créez un objet pour la forme de graphique.
  4. Créez un objet pour le type source (ChartDataSourceType) qui représente la source de données du graphique.
  5. Spécifiez la condition pertinente en fonction du type source étant identique au type de source de classeur externe.

Ce code Java montre l’opération :

// Crée une instance de la classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
    ISlide slide = pres.getSlides().get_Item(1);
    IChart chart = (IChart)slide.getShapes().get_Item(0);
    int sourceType = chart.getChartData().getDataSourceType();
    
    if (sourceType == ChartDataSourceType.ExternalWorkbook)
    {
        String path = chart.getChartData().getExternalWorkbookPath();
    }
	
	// Enregistre la présentation
    pres.save("result.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Modifier les données du graphique

Vous pouvez modifier les données des classeurs externes de la même façon que vous modifiez le contenu des classeurs internes. Lorsqu’un classeur externe ne peut pas être chargé, une exception est levée.

Ce code Java implémente le processus décrit :

// Crée une instance de la classe Presentation
Presentation pres = new Presentation("chart.pptx");
try {
    IChart chart = (IChart)pres.getSlides().get_Item(0).getShapes().get_Item(0);
    ChartData chartData = (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 (pres != null) pres.dispose();
}

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 vérifier 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 facilite la portabilité du projet ; toutefois, la présentation stocke 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 lecture comme 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 uniquement pour lire les données. Le fichier externe n’est pas modifié lors de l’enregistrement de la présentation.

Que faire si le fichier externe est protégé par mot de passe ?

Aspose.Slides n’accepte pas de mot de passe lors de la liaison. Une approche courante consiste à retirer la protection à l’avance ou à préparer une copie décryptée (par exemple avec Aspose.Cells) et à la lier.

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.