Diagrammunkafüzetek kezelése a prezentációkban Java használatával

Áttekintés

Ez a cikk ismerteti, hogyan kell dolgozni diagrammunkafüzettel az Aspose.Slides-ben. Bemutatja, hogyan kell olvasni és írni diagramadatokat munkafüzet‑folyamokon keresztül, hogyan kell a munkafüzetcellákat diagramadatcímkékként használni, hogyan lehet a munkalap‑gyűjteményekhez hozzáférni, valamint hogyan kell megadni az adatforrás‑típust a diagramértékekhez.

A külső munkafüzetek diagramadat‑forrásként való használatát is tárgyalja. A példák bemutatják, hogyan lehet létrehozni és hozzárendelni egy külső munkafüzetet, hogyan lehet lekérdezni egy diagramhoz kapcsolt külső munkafüzet útvonalát, valamint hogyan lehet szerkeszteni a diagramadatokat, ha a munkafüzet elérhető.

Diagramadatok olvasása és írása munkafüzetből

Aspose.Slides a ReadWorkbookStream és a WriteWorkbookStream metódusokat biztosítja, amelyek lehetővé teszik diagramadat‑munkafüzetek (az Aspose.Cells‑szel szerkesztett diagramadatokkal) olvasását és írását. Megjegyzés: a diagramadatoknak ugyanúgy kell felépítve lennie, vagy hasonló szerkezettel kell rendelkezniük, mint a forrásnak.

Ez a Java‑kód egy mintaműveletet mutat be:

import com.aspose.slides.*;

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();
}

Diagramelrendezés ellenőrzése a munkafüzet módosítása után

Ha egy beágyazott munkafüzetet egy módosítottra cserél, a diagram megtartja eredeti sorozat‑ és kategória‑gyűjteményeit. Ez az inkonzisztencia a IChart.validateChartLayout hívását ArgumentOutOfRangeException‑hez (paraméter: index) vezetheti. A kivétel elkerülése érdekében törölje a meglévő sorozatokat és kategóriákat előtt, mielőtt a frissített munkafüzetet visszaírná a diagramba.

// A munkafüzetfolyam módosítása után (pl. az Aspose.Cells használatával)
byte[] updatedWorkbook = baos.toByteArray();

// Törölje a meglévő adatreferenciákat.
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();

chart.getChartData().writeWorkbookStream(updatedWorkbook);

chart.validateChartLayout();

A gyűjtemények törlése biztosítja, hogy a diagram adatstruktúrája illeszkedjen az új munkafüzethez, ezáltal a validateChartLayout hiba nélkül befejeződik.

Munkafüzetcellát beállítása diagramadatcímkeként

  1. Hozzon létre egy példányt a Presentation osztályból.
  2. Szerezze meg egy dia hivatkozását az indexe alapján.
  3. Adjon hozzá egy buborékdiagramot némi adattal.
  4. Érje el a diagram sorozatait.
  5. Állítsa be a munkafüzetcellát adatcímkeként.
  6. Mentse a prezentációt.

Ez a Java‑kód megmutatja, hogyan kell beállítani egy munkafüzetcellát diagramadatcímkeként:

import com.aspose.slides.*;

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

// Létrehozza a prezentációt reprezentáló osztály egy példányát, amely egy prezentációs fájlt képvisel
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();
}

Munkalapok kezelése

Ez a Java‑kód egy olyan műveletet mutat be, amelyben a IChartDataWorkbook.Worksheets metódus segítségével egy munkalap‑gyűjteményhez férünk hozzá:

import com.aspose.slides.*;

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();
}

Adatforrás‑típus meghatározása

Ez a Java‑kód megmutatja, hogyan kell egy típus megadását egy adatforrás számára:

import com.aspose.slides.*;

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();
}

Nem támogatott beágyazott munkafüzetformátumok észlelése

Az Aspose.Slides nem támogatja az Excel bináris munkafüzet (.xlsb) formátumát, amely néhány diagramba beágyazható. A getEmbeddedWorkbookType metódust az IChartData mellett a WorkbookType felsorolással használva felismerheti a nem támogatott formátumokat, és kihagyhatja azokat a diagramoknál.

import com.aspose.slides.*;

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) {
            // A beágyazott munkafüzet .xlsb formátumban van, ami nem támogatott.
            continue;
        }

        // Itt olvassa vagy módosítsa a diagram munkafüzet adatait.
    }
} finally {
    presentation.dispose();
}

Külső munkafüzet

Külső munkafüzet létrehozása

A readWorkbookStream és setExternalWorkbook metódusok használatával létrehozhat egy külső munkafüzetet a semmiből, vagy egy belső munkafüzetet külsővé tehet.

Ez a Java‑kód bemutatja a külső munkafüzet létrehozási folyamatát:

import com.aspose.slides.*;
import java.io.FileOutputStream;
import java.io.IOException;

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();
}

Külső munkafüzet beállítása

A setExternalWorkbook metódus segítségével egy külső munkafüzetet rendelhet a diagram adatforrásaként. Ez a metódus használható a külső munkafüzet útvonalának frissítésére is (ha az át lett helyezve).

Bár a távoli helyeken vagy erőforrásokban tárolt munkafüzetek adatát közvetlenül nem szerkesztheti, továbbra is használhatja ezeket külső adatforrásként. Ha megad egy relatív útvonalat a külső munkafüzethez, az automatikusan teljes útvonallá konvertálódik.

Ez a Java‑kód megmutatja, hogyan kell beállítani egy külső munkafüzetet:

import com.aspose.slides.*;

// Létrehozza a Presentation osztály egy példányát
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();
}

A setExternalWorkbook metódus második (boolean) paramétere határozza meg, hogy az Excel‑munkafüzet betöltődjön‑e vagy sem.

  • Ha értéke false, csak a munkafüzet útvonala frissül – a diagram adatai nem lesznek betöltve vagy frissítve a cél‑munkafüzetből. Ezt a beállítást akkor használja, ha a cél‑munkafüzet nem létezik vagy nem érhető el.
  • Ha értéke true, a diagram adatai frissülnek a cél‑munkafüzetből.
import com.aspose.slides.*;

// Létrehozza a Presentation osztály egy példányát
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();
}

Diagram külső adatforrás munkafüzet útvonalának lekérése

  1. Hozzon létre egy példányt a Presentation osztályból.
  2. Szerezze meg egy dia hivatkozását az indexe alapján.
  3. Hozzon létre egy objektumot a diagram alakzathoz.
  4. Hozzon létre egy objektumot a forrást (ChartDataSourceType) reprezentáló típushoz, amely a diagram adatforrását jelöli.
  5. Adja meg a megfelelő feltételt a forrástípus alapján, amely egyezik a külső munkafüzet adatforrás‑típusával.

Ez a Java‑kód bemutatja a műveletet:

import com.aspose.slides.*;

// Létrehozza a Presentation osztály egy példányát
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();
    }
	
	// Elmenti a prezentációt
    pres.save("result.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Diagramadatok szerkesztése

Külső munkafüzetelek adatainak szerkesztése ugyanúgy történik, mint a belső munkafüzetelek tartalmának módosítása. Ha egy külső munkafüzet nem tölthető be, kivétel keletkezik.

Ez a Java‑kód a leírt folyamat megvalósítását mutatja:

import com.aspose.slides.*;

// Létrehozza a Presentation osztály egy példányát
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();
}

Munkafüzet helyreállítása a diagram gyorsítótárából

Ha egy diagram olyan külső munkafüzetet használ, amely hiányzik vagy nem érhető el, az Aspose.Slides képes a diagram munkafüzetet a prezentációban tárolt gyorsítótárazott adatból rekonstruálni. Hozzon létre egy LoadOptions objektumot, konfigurálja egy SpreadsheetOptions példánnyal, és a megnyitás előtt hívja meg a ISpreadsheetOptions.setRecoverWorkbookFromChartCache metódust true értékkel.

Az alábbi Java‑példa megnyit egy prezentációt, amelynek diagramja egy nem elérhető külső munkafüzetre hivatkozik, és a helyreállított adatokat az IChart.getChartData valamint az IChartData.getChartDataWorkbook segítségével érheti el:

SpreadsheetOptions spreadsheetOptions = new SpreadsheetOptions();
spreadsheetOptions.setRecoverWorkbookFromChartCache(true);

LoadOptions loadOptions = new LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);

Presentation presentation = new Presentation("presentation.pptx", loadOptions);
try {
    IChart chart = (IChart)presentation.getSlides().get_Item(0).getShapes().get_Item(0);
    IChartDataWorkbook recoveredWorkbook = chart.getChartData().getChartDataWorkbook();

    // Itt olvassa vagy módosítsa a helyreállított munkafüzet adatait.
} finally {
    presentation.dispose();
}

Ha a külső munkafüzet nem elérhető és a helyreállítás le van tiltva, az Aspose.Slides kivételt dob. A helyreállítást csak akkor engedélyezze, ha a gyorsítótárazott diagramadatok használata elfogadható tartalék, mivel a gyorsítótár nem feltétlenül tartalmazza a külső munkafüzetben a prezentáció legutóbbi mentése óta történt változásokat.

GYIK

Meg tudom határozni, hogy egy adott diagram külső vagy beágyazott munkafüzethez van kapcsolva?
Igen. A diagram rendelkezik egy data source type és egy path to an external workbook attribútummal; ha a forrás külső munkafüzet, akkor leolvashatja a teljes útvonalat, hogy megbizonyosodjon a külső fájl használatáról.

Támogatottak a relatív útvonalak külső munkafüzetekhez, és hogyan tárolódnak?
Igen. Ha relatív útvonalat ad meg, az automatikusan átalakul abszolút útvonallá. Ez kényelmes a projekt hordozhatósága miatt; azonban a prezentáció az abszolút útvonalat tárolja a PPTX‑fájlban.

Használhatók hálózati erőforrásokon/megosztott helyeken lévő munkafüzetek?
Igen, az ilyen munkafüzetek használhatók külső adatforrásként. A távoli munkafüzetelek közvetlen szerkesztése az Aspose.Slides‑kel nem támogatott – csak forrásként használhatók.

Az Aspose.Slides felülírja-e a külső XLSX‑et a prezentáció mentésekor?
Nem. A prezentáció egy link to the external file tárol, és ezt használja az adatok olvasásához. A külső fájl maga nem módosul a mentés során.

Mit tegyek, ha a külső fájl jelszóval védett?
Az Aspose.Slides nem fogad el jelszót a kapcsolódáskor. Általános megoldás, hogy előre eltávolítja a védelmet, vagy egy dekódolt másolatot készít (például a Aspose.Cells használatával), majd ahhoz kapcsolódik.

Több diagram hivatkozhat ugyanarra a külső munkafüzetre?
Igen. Minden diagram saját linket tárol. Ha mindegyik ugyanarra a fájlra mutat, a fájl frissítése minden diagramon megjelenik a következő adatbetöltéskor.