Hantera diagramdataserier i presentationer på Android
Översikt
Ett diagram lagrar sina plottade data i en diagramdatabok. En IChartSeries representerar en uppsättning relaterade värden, och varje IChartDataPoint i serien hänvisar till en eller flera celler i arbetsboken. IChartCategory-objekt tillhandahåller etiketter eller gruppvärden som delas av serierna. Serienamnet, kategorierna och punktvärdena är därför kopplade till IChartDataCell-objekt snarare än att endast lagras som visningstext.
För ett typiskt kategoridiagram använder standardarbetsboken rad 0 för serienamn, kolumn 0 för kategorinamnen och de återstående cellerna för serievärdena. Arbetsblad, rad- och kolumnindex som skickas till IChartDataWorkbook.getCell är nollbaserade. Denna layout är användbar när du skapar ett diagram med standarddata, men anta inte att varje befintligt diagram använder den. För en inläst presentation, inspektera de celler som refereras av serierna, kategorierna och datapunkterna innan du ändrar arbetsbokens värden.
Diagraminställningar har tre olika omfattningar:
- Inställningar på serienivå, såsom IChartSeries.getFormat ger standardutseendet för alla punkter i en serie.
- Inställningar på datapunktnivå, såsom IChartDataPoint.getFormat åsidosätter serieutseendet för en punkt.
- Gruppinställningar gäller för kompatibla serier som tillhör samma IChartSeriesGroup. Åtkomst till gruppen sker via IChartSeries.getParentSeriesGroup när du behöver ange alternativ som överlappning eller glappbredd.
När ingen explicit punkt- eller seriefyllning är inställd bestämmer diagramstilen och temat det automatiska utseendet. När både serie- och punktformatering finns, har punktformateringen företräde för den punkten.

Ställ in diagramseriens överlappning
IChartSeries.getOverlap rapporterar hur mycket staplar eller kolumner överlappar i ett 2D‑diagram, från -100 till 100 procent. Det är en skrivskyddad projektion av inställningen på den överordnade serieggruppen. Använd IChartSeriesGroup.setOverlap för att uppdatera varje kompatibel serie i den gruppen. Detta alternativ gäller för diagramtyper som visar grupperade staplar eller kolumner; det påverkar inte orelaterade serieggrupper i ett kombinationsdiagram.
Följande exempel ställer in överlappning för den grupp som innehåller den första serien:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final byte overlapPercent = 30;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
// Det nya diagrammet innehåller exempelserier, kategorier och värden.
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
series.getParentSeriesGroup().setOverlap(overlapPercent);
presentation.save("series_overlap.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Resultatet:

Ändra seriefyllningsfärgen
Använd IChartSeries.getFormat för att ange standardfyllning för en hel serie. Om en punkt redan har en explicit fyllning åsidosätter dess IChartDataPoint.getFormat‑inställning seriefyllningen för den punkten.
Följande exempel tillämpar en solid blå fyllning på den första serien:
import com.aspose.slides.*;
import android.graphics.Color;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
series.getFormat().getFill().setFillType(FillType.Solid);
series.getFormat().getFill().getSolidFillColor().setColor(Color.BLUE);
presentation.save("series_color.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Resultatet:

Ändra seriens namn
Ett serienamn lagras i diagramdataboken och visas normalt i förklaringen. I standardarbetsboken som skapas för ett grupperat stapeldiagram ligger cell B1 på rad 0, kolumn 1 och innehåller namnet på den första serien. De namngivna konstanterna i följande exempel gör den strukturen tydlig:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
final int worksheetIndex = 0;
final int seriesNameRowIndex = 0;
final int firstSeriesColumnIndex = 1;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, seriesNameRowIndex, firstSeriesColumnIndex);
seriesNameCell.setValue("Revenue");
presentation.save("series_name.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Du kan också uppdatera den cell som redan refereras av IChartSeries.getName. Detta tillvägagångssätt undviker att anta en särskild rad och kolumn i ett befintligt diagram:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int firstNameCellIndex = 0;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
IChartDataCell seriesNameCell = series.getName().getAsCells().get_Item(firstNameCellIndex);
seriesNameCell.setValue("Revenue");
presentation.save("series_name.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Resultatet:

Skapa en serie med ett namn från flera celler
Ett sammansatt serienamn är användbart när ett produktnamn och en rapportperiod lagras i separata celler i arbetsboken. Till exempel kan du kombinera Product A i B1 och 2026 i C1 till ett enda serienamn samtidigt som båda delarna förblir länkade till sina källceller.
Använd IChartDataWorkbook.getCellCollection för att hämta namnintervallet, och skicka sedan den samlingen till IChartSeriesCollection.add. Argumentet skipHiddenCells styr om dolda celler inkluderas: true exkluderar dem, medan false inkluderar dem. Detta exempel använder false för att inkludera alla celler i namnintervallet.
Följande exempel skapar en presentation med en serie och två datapunkter. Cellerna B1:C1 tillhandahåller endast serienamnet; A2:A3 tillhandahåller kategorietiketter, och B2:B3 tillhandahåller de numeriska värdena.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 620, 180);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
chart.setLegend(true);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
// Dessa två celler anger serienamnet.
workbook.getCell(0, 0, 1, "Product A");
workbook.getCell(0, 0, 2, "2026");
IChartCellCollection nameCells = workbook.getCellCollection("Sheet1!$B$1:$C$1", false);
IChartSeries series = chart.getChartData().getSeries().add(nameCells, ChartType.ClusteredColumn);
// Separata celler anger kategorierna och numeriska datapunkter.
IChartDataCell northCategory = workbook.getCell(0, 1, 0, "North");
IChartDataCell southCategory = workbook.getCell(0, 2, 0, "South");
chart.getChartData().getCategories().add(northCategory);
chart.getChartData().getCategories().add(southCategory);
IChartDataCell northValue = workbook.getCell(0, 1, 1, 120);
IChartDataCell southValue = workbook.getCell(0, 2, 1, 150);
series.getDataPoints().addDataPointForBarSeries(northValue);
series.getDataPoints().addDataPointForBarSeries(southValue);
presentation.save("composite_series_name.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Det resulterande serienamnet blir Product A 2026, med ett mellanslag mellan de två cellvärdena. Förklaringen visar detta som en post för båda kolumnerna. Bilden nedan illustrerar resultatet:

Hämta den automatiska seriefyllningsfärgen
IChartSeries.getAutomaticSeriesColor returnerar färgen som beräknas från serie‑indexet och diagramstilen som ett Android ARGB‑färginteger. Detta är färgen som används när seriefyllningen inte har definierats explicit. Att anropa metoden läser den beräknade färgen; den tilldelar ingen ny fyllning.
Följande exempel skriver ut den automatiska färgen som heltal för varje standardserie:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
int seriesCount = chart.getChartData().getSeries().size();
for (int seriesIndex = 0; seriesIndex < seriesCount; seriesIndex++) {
IChartSeries series = chart.getChartData().getSeries().get_Item(seriesIndex);
int automaticColor = series.getAutomaticSeriesColor();
System.out.println("Series " + seriesIndex + ": " + automaticColor);
}
} finally {
presentation.dispose();
}
De exakta heltalsvärdena beror på diagramstilen och temat.
Ställ in inverterad fyllningsfärg för en diagramserie
För stapel-, kolumn- och bubbelserier kan IChartSeries.setInvertIfNegative visa negativa värden med en annan fyllning. Ställ in den vanliga seriefyllningen till solid, aktivera inversion och tilldela den negativa värdefärgen via IChartSeries.getInvertedSolidFillColor. Negativa tal förblir oförändrade i arbetsboken; endast deras visningsfärg ändras.
Följande exempel ersätter standarddiagramdata med en serie. Arbetsbladsrad 0 innehåller serienamnet, kolumn 0 innehåller kategorinamnen och kolumn 1 innehåller värdena:
import com.aspose.slides.*;
import android.graphics.Color;
final int firstSlideIndex = 0;
final int worksheetIndex = 0;
final int headerRowIndex = 0;
final int categoryColumnIndex = 0;
final int firstSeriesColumnIndex = 1;
final int firstDataRowIndex = 1;
String[] categoryNames = { "Category 1", "Category 2", "Category 3" };
int[] seriesValues = { -20, 50, -30 };
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartData chartData = chart.getChartData();
IChartDataWorkbook workbook = chartData.getChartDataWorkbook();
chartData.getSeries().clear();
chartData.getCategories().clear();
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, headerRowIndex, firstSeriesColumnIndex, "Series 1");
int chartType = chart.getType();
IChartSeries series = chartData.getSeries().add(seriesNameCell, chartType);
for (int categoryIndex = 0; categoryIndex < categoryNames.length; categoryIndex++) {
int dataRowIndex = firstDataRowIndex + categoryIndex;
String categoryName = categoryNames[categoryIndex];
int seriesValue = seriesValues[categoryIndex];
IChartDataCell categoryCell = workbook.getCell(worksheetIndex, dataRowIndex, categoryColumnIndex, categoryName);
chartData.getCategories().add(categoryCell);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, dataRowIndex, firstSeriesColumnIndex, seriesValue);
series.getDataPoints().addDataPointForBarSeries(valueCell);
}
int automaticSeriesColor = series.getAutomaticSeriesColor();
series.getFormat().getFill().setFillType(FillType.Solid);
series.getFormat().getFill().getSolidFillColor().setColor(automaticSeriesColor);
series.setInvertIfNegative(true);
series.getInvertedSolidFillColor().setColor(Color.RED);
presentation.save("inverted_solid_fill_color.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Resultatet:

Du kan aktivera inversion för en enskild punkt via IChartDataPoint.setInvertIfNegative. I följande exempel är inversion inaktiverad för serien och endast aktiverad för den valda punkten. Punkten tilldelas också ett negativt värde så att effekten blir synlig:
import com.aspose.slides.*;
import android.graphics.Color;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int targetDataPointIndex = 2;
final int negativeValue = -30;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
int automaticSeriesColor = series.getAutomaticSeriesColor();
series.getFormat().getFill().setFillType(FillType.Solid);
series.getFormat().getFill().getSolidFillColor().setColor(automaticSeriesColor);
series.getInvertedSolidFillColor().setColor(Color.RED);
series.setInvertIfNegative(false);
IChartDataPoint dataPoint = series.getDataPoints().get_Item(targetDataPointIndex);
dataPoint.getValue().getAsCell().setValue(negativeValue);
dataPoint.setInvertIfNegative(true);
presentation.save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Rensa ett specifikt datapunktvärde
För att göra en punkt tom utan att ta bort de andra punkterna, sätt dess underliggande arbetsbokscell till null. För ett stapeldiagram är det plottade värdet tillgängligt via IChartDataPoint.getValue. Datapunkten behåller samma kategoriposition, men diagrammet behandlar dess värde som blankt enligt diagrammets inställningar för tomma värden.
Följande exempel rensar endast den andra punkten i den första serien:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int targetDataPointIndex = 1;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
IChartDataPoint dataPoint = series.getDataPoints().get_Item(targetDataPointIndex);
dataPoint.getValue().getAsCell().setValue(null);
presentation.save("clear_data_point_value.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Spridningsdiagram använder separata X‑ och Y‑celler, och bubbeldiagram använder också en storlekscell. Rensa endast den cell som representerar det värde du vill ta bort. Anropa inte IChartDataPointCollection.clear när du vill behålla de andra punkterna, eftersom den metoden tar bort alla datapunkter från samlingen.
Styr visning av tomma celler
Dolda celler som innehåller värden är ett separat fall från tomma celler. För att inkludera eller exkludera data från dolda arbetsbladsrader och -kolumner, se Include Data from Hidden Rows and Columns.
En tom cell i arbetsboken representerar saknad data; en cell som innehåller 0 representerar ett känt numeriskt värde. Anropa IChartDataCell.setValue med null för att göra en cell tom. En numerisk nolla förblir en nolla oavsett inställning för tomma celler.
Använd IChart.setDisplayBlanksAs för att välja hur diagrammet visar tomma celler. Denna inställning gäller för hela diagrammet. Den ändrar hur tomrum plottas, utan att fylla den tomma arbetsboks-cellen med noll eller ett interpolerat värde.
Följande fristående exempel skapar ett linjediagram med en serie, rensar värdet för Dag 3 och sparar samma diagram i varje läge. Ingen indatafil krävs. IChartDataWorkbook använder arbetsblad 0, kolumn 0 för kategorietiketter och kolumn 1 för värden; rad 0 innehåller serienamnet. Slutdata är 10, 20, empty, 30, 40.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.LineWithMarkers, 40, 40, 640, 400);
IChartData chartData = chart.getChartData();
IChartDataWorkbook workbook = chartData.getChartDataWorkbook();
chartData.getSeries().clear();
chartData.getCategories().clear();
IChartDataCell seriesNameCell = workbook.getCell(0, 0, 1, "Measurements");
IChartSeries series = chartData.getSeries().add(seriesNameCell, chart.getType());
int[] values = { 10, 20, 25, 30, 40 };
for (int i = 0; i < values.length; i++) {
IChartDataCell categoryCell = workbook.getCell(0, i + 1, 0, "Day " + (i + 1));
chartData.getCategories().add(categoryCell);
IChartDataCell valueCell = workbook.getCell(0, i + 1, 1, values[i]);
series.getDataPoints().addDataPointForLineSeries(valueCell);
}
// Lämna dag 3 verkligen tom, samtidigt som du behåller dess kategori och datapunkt.
workbook.getCell(0, 3, 1).setValue(null);
int[] modes = { DisplayBlanksAsType.Gap, DisplayBlanksAsType.Zero, DisplayBlanksAsType.Span };
String[] modeNames = { "Gap", "Zero", "Span" };
for (int i = 0; i < modes.length; i++) {
chart.setDisplayBlanksAs(modes[i]);
presentation.save("empty_cells_" + modeNames[i] + ".pptx", SaveFormat.Pptx);
}
} finally {
presentation.dispose();
}
Varje utskriftsfil lagrar det läge som tilldelats innan sparning: empty_cells_Gap.pptx, empty_cells_Zero.pptx och empty_cells_Span.pptx. För att spara bara en version, tilldela önskat läge och spara presentationen en gång istället för att iterera över lägena.
Jämförelsen nedan visar samma data i alla tre filerna. Dag 3 är tom i arbetsboken i varje fall:

Den synliga effekten beror på diagramtypen. Ett linjediagram gör alla tre lägen lätta att jämföra. Stapel- och kolumndiagram har ingen linje att koppla över en saknad kategori, så Span kan inte skapa den anslutande segmentet som visas ovan; en saknad kolumn och en nollhöjdskolumn kan också se lika ut. På samma sätt har ett spridningsdiagram med enbart markörer ingen anslutande linje. Förvänta dig inte tre distinkta resultat för varje diagramtyp; kontrollera resultatet för den typ du använder.
Ställ in seriegapbredden
Gapbredd är avståndet mellan intilliggande stapel‑ eller kolumnkluster, uttryckt som en procentandel av stapel‑ eller kolumnbredden. Liksom överlappning tillhör den den överordnade serieggruppen snarare än en enskild serie. Anropa IChartSeriesGroup.setGapWidth en gång för gruppen. Ett större värde skapar mer utrymme mellan klustren; ett mindre värde gör dem tätare.
Följande exempel ändrar gapbredden och sparar bara den slutgiltiga presentationen:
import com.aspose.slides.*;
final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int gapWidthPercent = 30;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);
IChart chart = slide.getShapes().addChart(ChartType.StackedColumn, 20, 20, 500, 200);
IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
series.getParentSeriesGroup().setGapWidth(gapWidthPercent);
presentation.save("gap_width_30.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Resultatet:

Vanliga frågor
Vilka diagramtyper stödjer dataserier?
Alla diagramtyper som representeras av ChartType‑enumerationen använder diagramdata, men deras serier har inte alla samma värdestruktur eller inställningar. Till exempel använder kategoridiagram kategorier och värden, spridningsdiagram använder X‑ och Y‑värden, och bubbeldiagram lägger till bubbeltstorlekar. Använd den datapunkt‑skapande metoden som matchar serietypen. Alternativ som överlappning och gapbredd gäller endast för kompatibla stapel‑ eller kolumngrupper.
Vad är en diagramserieggrupp?
Ett IChartSeriesGroup innehåller kompatibla serier som delar gruppnivåinställningar för plottning. Ett kombinationsdiagram kan innehålla mer än en grupp, så att ändra gruppen som nås via en serie inte nödvändigtvis ändrar varje serie i diagrammet.
Innehåller ett nyskapat diagram standarddata?
Ja. Som standard skapar IShapeCollection.addChart exempelserier, kategorier och värden. Du kan redigera dessa celler eller rensa både serie‑ och kategorisamlingarna innan du lägger till en helt anpassad datamängd. En overload kan också skapa ett diagram utan standarddata.
Hur är diagramobjekt kopplade till arbetsboks-celler?
Serienamn, kategorietiketter och datapunktvärden refererar till celler i en IChartDataWorkbook. Att ändra en refererad cell uppdaterar motsvarande diagramelement. När du bygger anpassad data, håll kategorirader och serie‑värdesrader i linje så att varje punkt plottas under den avsedda kategorin.
Hur rensar jag en punkt istället för hela serien?
Sätt den relevanta värdecellen till null för att behålla punktens kategoriposition som en tom punkt. Använd IChartDataPointCollection.clear endast när du avser att ta bort alla punkter från den serien. Om du också tar bort kategorier, uppdatera varje serie så att deras värden förblir i linje med kategorisamlingen.
Hur visas tomma punkter?
Resultatet beror på diagramtypen och det värde som konfigurerats via IChart.setDisplayBlanksAs. Stödda diagram kan visa tomrum som gap, som nollvärden eller genom att ansluta intilliggande punkter. Välj den inställning som matchar betydelsen av saknad data i din presentation. Se Control the Display of Empty Cells för ett komplett exempel och visuell jämförelse.
Hur formateras negativa värden?
För stödda stapel-, kolumn- och bubbelserier, anropa IChartSeries.setInvertIfNegative och ange färgen som returneras av IChartSeries.getInvertedSolidFillColor. Du kan åsidosätta beteendet för en enskild punkt med IChartDataPoint.setInvertIfNegative. Dessa metoder påverkar formatering, inte de lagrade numeriska värdena.
Vilken formatering gäller när både en serie och en punkt är formaterade?
Explicit datapunktformatering har företräde för den punkten. Övriga punkter fortsätter att använda den explicita serieformatet eller, när serieformatet inte är definierat, den automatiska diagramstilen och temat. Gruppinställningar såsom överlappning och gapbredd styr layout och är inte formateringsöverskrivningar på punktnivå.
Finns det någon gräns för hur många serier ett diagram kan innehålla?
Aspose.Slides inför ingen separat fast gräns för antalet serier. I praktiken bestäms en användbar gräns av presentationsfilens begränsningar, tillgängligt minne, renderingstid och diagramläsbarhet.
Vad bör jag ändra när kolumner är för nära varandra eller för långt ifrån varandra?
Anropa IChartSeriesGroup.setGapWidth på lämplig föräldraserieggrupp. Öka värdet för att bredda avståndet mellan klustren, eller minska det för att föra klustren närmare varandra.