Zarządzanie seriami danych wykresu w prezentacjach w .NET
Przegląd
Wykres przechowuje wyświetlane dane w skoroszycie danych wykresu. Interfejs IChartSeries reprezentuje jeden zestaw powiązanych wartości, a każdy IChartDataPoint w serii odnosi się do jednej lub więcej komórek skoroszytu. Obiekty IChartCategory dostarczają etykiety lub wartości grupujące współdzielone przez serie. Nazwa serii, kategorie i wartości punktów są więc połączone z obiektami IChartDataCell zamiast być przechowywane wyłącznie jako tekst wyświetlany.
W typowym wykresie kategorii domyślny skoroszyt używa wiersza 0 dla nazw serii, kolumny 0 dla nazw kategorii oraz pozostałych komórek dla wartości serii. Indeksy arkusza, wiersza i kolumny przekazywane do IChartDataWorkbook.GetCell są zerowe. Ten układ jest przydatny przy tworzeniu wykresu z danymi domyślnymi, ale nie należy zakładać, że każdy istniejący wykres go stosuje. W załadowanej prezentacji przed zmianą wartości w skoroszycie należy sprawdzić komórki odwoływane przez serie, kategorie i punkty danych.
Ustawienia wykresu mają trzy różne zakresy:
- Ustawienia na poziomie serii, takie jak IChartSeries.Format, określają domyślny wygląd wszystkich punktów w jednej serii.
- Ustawienia punktu danych, takie jak IChartDataPoint.Format, zastępują wygląd serii dla jednego punktu.
- Ustawienia grupy mają zastosowanie do kompatybilnych serii należących do tej samej IChartSeriesGroup. Dostęp do grupy uzyskuje się przez IChartSeries.ParentSeriesGroup, gdy trzeba ustawić opcje takie jak nakładanie lub szerokość luki.
Gdy nie jest ustawione żadne wyraźne wypełnienie punktu lub serii, styl i motyw wykresu określają automatyczny wygląd. Gdy istnieje zarówno formatowanie serii, jak i punktu, formatowanie punktu ma pierwszeństwo dla tego punktu.

Ustaw Nakładanie Serii Wykresu
IChartSeries.Overlap określa, jak bardzo słupki lub kolumny nakładają się w wykresie 2D, w przedziale od -100 do 100 procent. Jest to odczytywana wartość z ustawienia w grupie seryjnej rodzica. Ustaw IChartSeriesGroup.Overlap, aby zaktualizować wszystkie kompatybilne serie w tej grupie. Opcja dotyczy typów wykresów wyświetlających grupowane słupki lub kolumny; nie wpływa na niepowiązane grupy serii w wykresie kombinowanym.
Poniższy przykład ustawia nakładanie dla grupy zawierającej pierwszą serię:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const sbyte overlapPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
// Nowy wykres zawiera przykładowe serie, kategorie i wartości.
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.Overlap = overlapPercent;
presentation.Save("series_overlap.pptx", SaveFormat.Pptx);
Wynik:

Zmień Kolor Wypełnienia Serii
Użyj IChartSeries.Format, aby ustawić domyślne wypełnienie dla całej serii. Jeśli punkt już ma wyraźne wypełnienie, jego ustawienie IChartDataPoint.Format zastępuje wypełnienie serii dla tego punktu.
Poniższy przykład stosuje jednorodne niebieskie wypełnienie do pierwszej serii:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = Color.Blue;
presentation.Save("series_color.pptx", SaveFormat.Pptx);
Wynik:

Zmień Nazwę Serii
Nazwa serii jest przechowywana w skoroszycie danych wykresu i zazwyczaj wyświetlana w legendzie. W domyślnym skoroszycie utworzonym dla wykresu kolumn grupowanych komórka B1 znajduje się w wierszu 0, kolumnie 1 i zawiera nazwę pierwszej serii. Stałe nazwane w poniższym przykładzie czynią tę strukturę explicite:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int seriesNameRowIndex = 0;
const int firstSeriesColumnIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var workbook = chart.ChartData.ChartDataWorkbook;
var seriesNameCell = workbook.GetCell(worksheetIndex, seriesNameRowIndex, firstSeriesColumnIndex);
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Można także zaktualizować komórkę już odwoływaną przez IChartSeries.Name. Takie podejście unika zakładania konkretnego wiersza i kolumny w istniejącym wykresie:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int firstNameCellIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var seriesNameCell = series.Name.AsCells[firstNameCellIndex];
seriesNameCell.Value = "Revenue";
presentation.Save("series_name.pptx", SaveFormat.Pptx);
Wynik:

Utwórz serię z nazwą z wielu komórek
Złożona nazwa serii jest przydatna, gdy nazwa produktu i okres sprawozdawczy są przechowywane w osobnych komórkach skoroszytu. Na przykład można połączyć Product A w B1 i 2026 w C1 w jedną nazwę serii, zachowując jednocześnie powiązania obu części z ich komórkami źródłowymi.
Użyj IChartDataWorkbook.GetCellCollection, aby pobrać zakres nazw, a następnie przekaż tę kolekcję do IChartSeriesCollection.Add. Argument skipHiddenCells kontroluje, czy ukryte komórki są uwzględniane: true je wyklucza, false — włącza. Ten przykład używa false, aby włączyć każdą komórkę w zakresie nazw.
Poniższy przykład tworzy prezentację z jedną serią i dwoma punktami danych. Komórki B1:C1 dostarczają wyłącznie nazwę serii; A2:A3 dostarczają etykiety kategorii, a B2:B3 dostarczają wartości liczbowe.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 50, 620, 180);
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();
chart.HasLegend = true;
var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);
// Te dwie komórki dostarczają nazwę serii.
workbook.GetCell(0, 0, 1, "Product A");
workbook.GetCell(0, 0, 2, "2026");
var nameCells = workbook.GetCellCollection("Sheet1!$B$1:$C$1", skipHiddenCells: false);
var series = chart.ChartData.Series.Add(nameCells, ChartType.ClusteredColumn);
// Oddzielne komórki dostarczają kategorie i numeryczne punkty danych.
var northCategory = workbook.GetCell(0, 1, 0, "North");
var southCategory = workbook.GetCell(0, 2, 0, "South");
chart.ChartData.Categories.Add(northCategory);
chart.ChartData.Categories.Add(southCategory);
var northValue = workbook.GetCell(0, 1, 1, 120);
var southValue = workbook.GetCell(0, 2, 1, 150);
series.DataPoints.AddDataPointForBarSeries(northValue);
series.DataPoints.AddDataPointForBarSeries(southValue);
presentation.Save("composite_series_name.pptx", SaveFormat.Pptx);
Wynikowa nazwa serii to Product A 2026, z odstępem między dwoma wartościami komórek. Legenda wyświetla to jako jedną pozycję dla obu kolumn. Poniższy obraz został wygenerowany z zapisanej prezentacji:

Pobierz Automatyczny Kolor Wypełnienia Serii
IChartSeries.GetAutomaticSeriesColor zwraca kolor obliczony na podstawie indeksu serii i stylu wykresu. Jest to kolor używany, gdy wypełnienie serii nie zostało jawnie określone. Wywołanie metody odczytuje obliczony kolor; nie przypisuje nowego wypełnienia.
Poniższy przykład wypisuje automatyczny kolor każdej serii domyślnej:
using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
const int firstSlideIndex = 0;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var seriesCount = chart.ChartData.Series.Count;
for (var seriesIndex = 0; seriesIndex < seriesCount; seriesIndex++)
{
var series = chart.ChartData.Series[seriesIndex];
var automaticColor = series.GetAutomaticSeriesColor();
Console.WriteLine($"Series {seriesIndex}: {automaticColor.Name}");
}
Przykładowy wynik dla domyślnego stylu wykresu:
Series 0: ff4f81bd
Series 1: ffc0504d
Series 2: ff9bbb59
Dokładne kolory zależą od stylu i motywu wykresu.
Ustaw Odwrócony Kolor Wypełnienia dla Serii Wykresu
Dla serii słupkowych, kolumnowych i bąbelkowych można użyć IChartSeries.InvertIfNegative, aby wyświetlać wartości ujemne innym wypełnieniem. Ustaw zwykłe wypełnienie serii na jednolite, włącz odwracanie i przypisz kolor wartości ujemnej przez IChartSeries.InvertedSolidFillColor. Negatywne liczby pozostają niezmienione w skoroszycie; zmienia się jedynie ich kolor wyświetlania.
Poniższy przykład zastępuje domyślne dane wykresu jedną serią. Wiersz 0 arkusza zawiera nazwę serii, kolumna 0 nazwy kategorii, a kolumna 1 wartości:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int worksheetIndex = 0;
const int headerRowIndex = 0;
const int categoryColumnIndex = 0;
const int firstSeriesColumnIndex = 1;
const int firstDataRowIndex = 1;
var categoryNames = new[] { "Category 1", "Category 2", "Category 3" };
var seriesValues = new[] { -20, 50, -30 };
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(worksheetIndex, headerRowIndex, firstSeriesColumnIndex, "Series 1");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
for (var categoryIndex = 0; categoryIndex < categoryNames.Length; categoryIndex++)
{
var dataRowIndex = firstDataRowIndex + categoryIndex;
var categoryName = categoryNames[categoryIndex];
var seriesValue = seriesValues[categoryIndex];
var categoryCell = workbook.GetCell(worksheetIndex, dataRowIndex, categoryColumnIndex, categoryName);
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(worksheetIndex, dataRowIndex, firstSeriesColumnIndex, seriesValue);
series.DataPoints.AddDataPointForBarSeries(valueCell);
}
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertIfNegative = true;
series.InvertedSolidFillColor.Color = Color.Red;
presentation.Save("inverted_solid_fill_color.pptx", SaveFormat.Pptx);
Wynik:

Możesz włączyć odwracanie dla jednego punktu przez IChartDataPoint.InvertIfNegative. W poniższym przykładzie odwracanie jest wyłączone dla serii i włączone tylko dla wybranego punktu. Punkt otrzymuje także wartość ujemną, aby efekt był widoczny:
using System.Drawing;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 2;
const int negativeValue = -30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var automaticSeriesColor = series.GetAutomaticSeriesColor();
series.Format.Fill.FillType = FillType.Solid;
series.Format.Fill.SolidFillColor.Color = automaticSeriesColor;
series.InvertedSolidFillColor.Color = Color.Red;
series.InvertIfNegative = false;
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = negativeValue;
dataPoint.InvertIfNegative = true;
presentation.Save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx);
Wyczyść Konkretne Wartości Punktu Danych
Aby usunąć jeden punkt bez usuwania pozostałych, ustaw powiązaną komórkę skoroszytu na null. W wykresie kolumnowym wartość jest dostępna przez IChartDataPoint.YValue. Punkt pozostaje w tej samej pozycji kategorii, ale wykres traktuje jego wartość jako pustą zgodnie z ustawieniami pustych wartości wykresu.
Poniższy przykład czyści tylko drugi punkt w pierwszej serii:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int targetDataPointIndex = 1;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
var dataPoint = series.DataPoints[targetDataPointIndex];
dataPoint.YValue.AsCell.Value = null;
presentation.Save("clear_data_point_value.pptx", SaveFormat.Pptx);
Wykresy rozproszenia używają osobnych komórek X i Y, a wykresy bąbelkowe dodatkowo komórki rozmiaru. Wyczyść tylko komórkę reprezentującą wartość, którą chcesz usunąć. Nie wywołuj IChartDataPointCollection.Clear, gdy chcesz zachować pozostałe punkty, ponieważ ta metoda usuwa wszystkie punkty z kolekcji.
Kontroluj Wyświetlanie Pustych Komórek
Ukryte komórki zawierające wartości to inny przypadek niż puste komórki. Aby uwzględnić lub wykluczyć dane z ukrytych wierszy i kolumn arkusza, zobacz Include Data from Hidden Rows and Columns.
Pusta komórka skoroszytu oznacza brak danych; komórka zawierająca 0 oznacza znaną wartość liczbową. Ustaw IChartDataCell.Value na null, aby uczynić komórkę pustą. Zero liczbowe pozostaje zerem niezależnie od ustawienia pustej komórki.
Użyj IChart.DisplayBlanksAs, aby wybrać, jak wykres wyświetla puste komórki. To ustawienie dotyczy całego wykresu. Zmienia sposób rysowania pustych miejsc, nie wypełniając pustej komórki zerem ani interpolowaną wartością.
Poniższy samodzielny przykład tworzy wykres liniowy z jedną serią, czyści wartość dla Dnia 3 i zapisuje wykres w każdym trybie. Nie wymaga pliku wejściowego. IChartDataWorkbook używa arkusza 0, kolumny 0 dla etykiet kategorii i kolumny 1 dla wartości; wiersz 0 przechowuje nazwę serii. Końcowe dane to 10, 20, empty, 30, 40.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using var presentation = new Presentation();
var slide = presentation.Slides[0];
var chart = slide.Shapes.AddChart(ChartType.LineWithMarkers, 40, 40, 640, 400);
var chartData = chart.ChartData;
var workbook = chartData.ChartDataWorkbook;
chartData.Series.Clear();
chartData.Categories.Clear();
var seriesNameCell = workbook.GetCell(0, 0, 1, "Measurements");
var series = chartData.Series.Add(seriesNameCell, chart.Type);
var values = new[] { 10, 20, 25, 30, 40 };
for (var i = 0; i < values.Length; i++)
{
var categoryCell = workbook.GetCell(0, i + 1, 0, $"Day {i + 1}");
chartData.Categories.Add(categoryCell);
var valueCell = workbook.GetCell(0, i + 1, 1, values[i]);
series.DataPoints.AddDataPointForLineSeries(valueCell);
}
// Leave Day 3 genuinely empty, while retaining its category and data point.
workbook.GetCell(0, 3, 1).Value = null;
var modes = new[] { DisplayBlanksAsType.Gap, DisplayBlanksAsType.Zero, DisplayBlanksAsType.Span };
foreach (var mode in modes)
{
chart.DisplayBlanksAs = mode;
presentation.Save($"empty_cells_{mode}.pptx", SaveFormat.Pptx);
}
Każdy plik wyjściowy przechowuje tryb przypisany przed zapisem: empty_cells_Gap.pptx, empty_cells_Zero.pptx i empty_cells_Span.pptx. Aby zapisać tylko jedną wersję, ustaw żądany tryb i zapisz prezentację raz zamiast iterować po trybach.
Poniższe porównanie pokazuje te same dane we wszystkich trzech plikach. Dzień 3 jest pusty w skoroszycie w każdym przypadku:

Widoczny efekt zależy od typu wykresu. Wykres liniowy ułatwia porównanie wszystkich trzech trybów. Wykresy słupkowe i kolumnowe nie mają linii łączącej brakującą kategorię, więc Span nie może wygenerować połączenia pokazanego powyżej; brakująca kolumna i kolumna o wysokości zero mogą wyglądać podobnie. Podobnie wykres rozproszenia z samymi markerami nie ma linii łączącej. Nie oczekuj trzech odrębnych wyników dla każdego rodzaju wykresu; sprawdź wynik dla używanego typu.
Ustaw Szerokość Luki Serii
Szerokość luki to odstęp między sąsiadującymi grupami słupków lub kolumn, wyrażony jako procent szerokości słupka lub kolumny. Podobnie jak nakładanie, należy ją ustawić w grupie seryjnej rodzica, a nie w jednej serii. Ustaw IChartSeriesGroup.GapWidth raz dla grupy. Większa wartość tworzy większy odstęp między grupami; mniejsza wartość sprawia, że są one gęstsze.
Poniższy przykład zmienia szerokość luki i zapisuje tylko finalną prezentację:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
const int firstSlideIndex = 0;
const int firstSeriesIndex = 0;
const int gapWidthPercent = 30;
using var presentation = new Presentation();
var slide = presentation.Slides[firstSlideIndex];
var chart = slide.Shapes.AddChart(ChartType.StackedColumn, 20, 20, 500, 200);
var series = chart.ChartData.Series[firstSeriesIndex];
series.ParentSeriesGroup.GapWidth = gapWidthPercent;
presentation.Save("gap_width_30.pptx", SaveFormat.Pptx);
Wynik:

FAQ
Które typy wykresów obsługują serie danych?
Wszystkie typy wykresów reprezentowane przez wyliczenie ChartType używają danych wykresu, ale ich serie nie zawsze mają taką samą strukturę wartości lub ustawienia. Na przykład wykresy kategoriowe używają kategorii i wartości, wykresy rozproszenia X i Y, a wykresy bąbelkowe dodatkowo rozmiar bąbelka. Użyj metody tworzenia punktu danych pasującej do typu serii. Opcje takie jak nakładanie i szerokość luki mają zastosowanie tylko do kompatybilnych grup słupków lub kolumn.
Czym jest grupa serii wykresu?
IChartSeriesGroup zawiera kompatybilne serie, które współdzielą ustawienia grupowe wykresu. Wykres kombinowany może zawierać więcej niż jedną grupę, więc zmiana grupy uzyskanej przez jedną serię nie musi wpływać na wszystkie serie w wykresie.
Czy nowo utworzony wykres zawiera domyślne dane?
Tak. Domyślnie IShapeCollection.AddChart tworzy przykładowe serie, kategorie i wartości. Możesz edytować te komórki lub wyczyścić zarówno kolekcje serii, jak i kategorii przed dodaniem własnego zestawu danych. Przeciążenie może także utworzyć wykres bez danych domyślnych.
Jak obiekty wykresu są powiązane z komórkami skoroszytu?
Nazwy serii, etykiety kategorii i wartości punktów danych odwołują się do komórek w IChartDataWorkbook. Zmiana odwołanej komórki aktualizuje odpowiedni element wykresu. Tworząc własne dane, utrzymuj wiersze kategorii i wiersze wartości serii wyrównane, aby każdy punkt był rysowany pod właściwą kategorią.
Jak wyczyścić jeden punkt zamiast całej serii?
Ustaw odpowiednią komórkę wartości na null, aby zachować pozycję kategorii punktu jako pustą. Używaj IChartDataPointCollection.Clear tylko wtedy, gdy chcesz usunąć wszystkie punkty z tej serii. Jeśli usuwasz także kategorie, zaktualizuj wszystkie serie, aby ich wartości pozostały wyrównane z kolekcją kategorii.
Jak wyświetlane są puste punkty?
Wynik zależy od typu wykresu i IChart.DisplayBlanksAs. Obsługiwane wykresy mogą wyświetlać puste miejsca jako przerwy, jako wartości zero lub łącząc sąsiednie punkty. Wybierz ustawienie odpowiadające znaczeniu brakujących danych w prezentacji. Zobacz Kontroluj Wyświetlanie Pustych Komórek po pełny przykład i porównanie wizualne.
Jak formatowane są wartości ujemne?
Dla obsługiwanych serii słupkowych, kolumnowych i bąbelkowych włącz IChartSeries.InvertIfNegative i ustaw IChartSeries.InvertedSolidFillColor. Zachowanie można nadpisać dla pojedynczego punktu przy pomocy IChartDataPoint.InvertIfNegative. Te właściwości wpływają na formatowanie, a nie na przechowywane wartości liczbowe.
Które formatowanie ma pierwszeństwo, gdy zarówno seria, jak i punkt są sformatowane?
Jawne formatowanie punktu danych ma pierwszeństwo dla tego punktu. Pozostałe punkty nadal używają jawnego formatu serii lub, gdy format serii nie jest zdefiniowany, automatycznego stylu i motywu wykresu. Właściwości grupowe, takie jak nakładanie i szerokość luki, kontrolują układ i nie są nadpisaniami formatowania punktowego.
Czy istnieje limit liczby serii w wykresie?
Aspose.Slides nie narzuca osobnego stałego limitu liczby serii. W praktyce ograniczenia pliku prezentacji, dostępna pamięć, czas renderowania i czytelność wykresu określają praktyczny limit.
Co zmienić, gdy kolumny są zbyt blisko siebie lub zbyt daleko od siebie?
Ustaw IChartSeriesGroup.GapWidth w odpowiedniej grupie serii nadrzędnej. Zwiększ wartość, aby poszerzyć odstęp między grupami, lub zmniejsz ją, aby przyciągnąć grupy bliżej siebie.