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
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg egy dia hivatkozását az indexe alapján.
- Adjon hozzá egy buborékdiagramot némi adattal.
- Érje el a diagram sorozatait.
- Állítsa be a munkafüzetcellát adatcímkeként.
- 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
- Hozzon létre egy példányt a Presentation osztályból.
- Szerezze meg egy dia hivatkozását az indexe alapján.
- Hozzon létre egy objektumot a diagram alakzathoz.
- Hozzon létre egy objektumot a forrást (
ChartDataSourceType) reprezentáló típushoz, amely a diagram adatforrását jelöli. - 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.