Zarządzanie zeszytami wykresów w prezentacjach w .NET

Przegląd

Ten artykuł wyjaśnia, jak pracować z zeszytami wykresów w Aspose.Slides. Pokazuje, jak odczytywać i zapisywać dane wykresu za pośrednictwem strumieni zeszytów, używać komórek zeszytu jako etykiet danych wykresu, uzyskiwać dostęp do kolekcji arkuszy oraz określać typ źródła danych dla wartości wykresu.

Omówiono także pracę z zewnętrznymi zeszytami jako źródłami danych wykresu. Przykłady demonstrują, jak utworzyć i przypisać zewnętrzny zeszyt, pobrać ścieżkę zewnętrznego zeszytu powiązanego z wykresem oraz edytować dane wykresu, gdy zeszyt jest dostępny.

Dla komórek zeszytu reprezentujących brakujące dane, zobacz Kontroluj wyświetlanie pustych komórek – różnice między pustą komórką a zerem oraz porównanie linii wykresu dostępnych trybów wyświetlania.

Uwzględnianie danych z ukrytych wierszy i kolumn

Użyj IChart.PlotVisibleCellsOnlyaby kontrolować, czy wykres uwzględnia dane z ukrytych wierszy i kolumn arkusza. Ustaw true, aby wykresem były tylko widoczne komórki, lub false, aby uwzględnić zarówno widoczne, jak i ukryte komórki. To ustawienie steruje rysowaniem wykresu; nie ukrywa ani nie odkrywa wierszy lub kolumn arkusza.

Przykładowa prezentacja zawiera wykres kolumnowy jako pierwszy kształt na pierwszym slajdzie. Osadzony arkusz, Sheet1, zawiera następujący zakres źródłowy A1:C4. Wiersz 3 i kolumna C są ukryte, ale ich komórki nadal zawierają wartości.

Wiersz arkusza A: Miesiąc B: Detal C: Hurt (ukryta kolumna)
2 Styczeń 10 30
3 (ukryty wiersz) Luty 40 60
4 Marzec 20 50

Uzyskaj dostęp do komórek źródłowych przez IChartData.ChartDataWorkbook i odczytaj IChartDataCell.IsHidden, aby sprawdzić ich status ukrycia. Właściwość jest tylko do odczytu. W tym pliku B2 jest widoczny, B3 należy do ukrytego wiersza, a C2 do ukrytej kolumny; przykład wypisuje kolejno False, True i True.

Dla tego przykładu odśwież dane wykresu po zmianie ustawienia rysowania: zachowaj osadzony zeszyt przy użyciu ReadWorkbookStream i załaduj go ponownie przy pomocy WriteWorkbookStream. Przy uwzględnianiu wszystkich komórek użyj także SetRange, aby przywrócić pełny zakres, w tym ukrytą kategorię luty. Same zmiany flagi nie odświeżą pamięci podręcznej danych i etykiet kategorii w tym przykładzie.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("hidden-source-data.pptx");
var slide = presentation.Slides[0];

if (slide.Shapes[0] is IChart chart)
{
    var workbook = chart.ChartData.ChartDataWorkbook;
    Console.WriteLine($"B2 hidden: {workbook.GetCell(0, "B2").IsHidden}");
    Console.WriteLine($"B3 hidden: {workbook.GetCell(0, "B3").IsHidden}");
    Console.WriteLine($"C2 hidden: {workbook.GetCell(0, "C2").IsHidden}");

    using var workbookStream = chart.ChartData.ReadWorkbookStream();
    foreach (var visibleOnly in new[] { true, false })
    {
        chart.PlotVisibleCellsOnly = visibleOnly;

        // Odśwież dane wykresu z osadzonego zeszytu.
        workbookStream.Position = 0;
        chart.ChartData.WriteWorkbookStream(workbookStream);
        if (!visibleOnly)
        {
            // Przywróć pełny zakres źródłowy, w tym ukryte kategorie.
            chart.ChartData.SetRange("Sheet1!$A$1:$C$4");
        }

        presentation.Save($"hidden_cells_{visibleOnly}.pptx", SaveFormat.Pptx);
    }
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

Przykład zapisuje dwie wersje prezentacji: jedną zawierającą wyłącznie widoczne wartości detaliczne (10 i 20) oraz drugą ze wszystkimi sześcioma wartościami. Pokazane poniżej obrazy zostały wygenerowane z zapisanych prezentacji po ich ponownym otwarciu; oba pliki zachowują ustawione flagi rysowania. Wiersz 3 i kolumna C pozostają ukryte w obu osadzonych zeszytach.

Tylko widoczne komórki (true) Wszystkie komórki (false)
Only visible cells: Retail values 10 and 20 for January and March. All cells: Retail and Wholesale values for January, February, and March.

Ukryta komórka zawierająca wartość różni się od pustej komórki. IChart.DisplayBlanksAs kontroluje, jak wyświetlane są brakujące wartości; nie obejmuje ani nie wyklucza ukrytych danych źródłowych. Zobacz Kontroluj wyświetlanie pustych komórek dla przykładu.

Pobieranie zakresu danych wykresu

Przed aktualizacją danych zeszytu w istniejącej prezentacji sprawdź zakresy źródłowe, aby zidentyfikować, które komórki arkusza wykorzystuje każdy wykres. Metoda IChartData.GetRange zwraca bieżący zakres danych jako formułę kwalifikowaną arkuszem, np. Sheet1!$A$1:$D$5. Tutaj Sheet1 to nazwa arkusza, ! oddziela ją od zakresu komórek, a $A$1:$D$5 identyfikuje komórki od A1 do D5 włącznie. Znaki dolara wskazują odwołania bezwzględne do wierszy i kolumn.

Metoda odczytuje bieżący zakres bez zmiany wykresu ani jego zeszytu. Jeśli wykres nie używa zeszytu jako źródła danych, zgłasza InvalidOperationException. Po więcej informacji zobacz Odwołanie API ChartData.

Ten przykład otwiera prezentację i sprawdza kształty bezpośrednio na każdym slajdzie pod kątem wykresów. Wypisuje nazwę każdego wykresu oraz jego zakres źródłowy. Jeśli wykres nie używa zeszytu, wypisuje komunikat i przechodzi do kolejnego wykresu.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation("presentation.pptx");

foreach (var slide in presentation.Slides)
{
    foreach (var shape in slide.Shapes)
    {
        if (shape is IChart chart)
        {
            try
            {
                var range = chart.ChartData.GetRange();
                Console.WriteLine($"{chart.Name}: {range}");
            }
            catch (InvalidOperationException)
            {
                Console.WriteLine($"{chart.Name}: The chart does not use a workbook as its data source.");
            }
        }
    }
}

Odczyt i zapis danych wykresu z zeszytu

Aspose.Slides dla .NET udostępnia metody ReadWorkbookStream i WriteWorkbookStream, które pozwalają odczytywać i zapisywać zeszyty danych wykresu (zawierające dane edytowane przy pomocy Aspose.Cells). Uwaga, dane wykresu muszą być zorganizowane w ten sam sposób lub mieć strukturę podobną do źródła.

Przykład używa prezentacji z wykresem jako pierwszym kształtem na pierwszym slajdzie. Odczytuje osadzony zeszyt do strumienia, czyści istniejące serie i kategorie, a następnie zapisuje ten sam zeszyt z powrotem. Zmiany pozostają w pamięci; przykład nie zapisuje prezentacji.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation("chart.pptx");
var slide = presentation.Slides[0];

var shapeCount = slide.Shapes.Count;
if (shapeCount > 0 && slide.Shapes[0] is IChart chart)
{
    var chartData = chart.ChartData;
    using var workbookStream = chartData.ReadWorkbookStream();

    chartData.Series.Clear();
    chartData.Categories.Clear();

    workbookStream.Position = 0;
    chartData.WriteWorkbookStream(workbookStream);
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

Walidacja układu wykresu po modyfikacji zeszytu

Gdy zamienisz osadzony zeszyt na zmodyfikowany, wykres zachowuje oryginalne kolekcje serii i kategorii. Ten niezgodność może spowodować niepowodzenie IChart.ValidateChartLayout z błędem indeksu poza zakresem. Wyczyść istniejące serie i kategorie przed zapisaniem zaktualizowanego zeszytu z powrotem do wykresu. Przykład używa wykresu, który jest pierwszym kształtem na pierwszym slajdzie. Komentarz zaznacza miejsce, w którym mogłaby nastąpić edycja zeszytu; działający przykład zapisuje oryginalny zeszyt z powrotem i waliduje układ w pamięci.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation("chart.pptx");
var slide = presentation.Slides[0];

var shapeCount = slide.Shapes.Count;
if (shapeCount > 0 && slide.Shapes[0] is IChart chart)
{
    var chartData = chart.ChartData;
    using var workbookStream = chartData.ReadWorkbookStream();

    // Modyfikuj strumień zeszytu tutaj, na przykład przy użyciu Aspose.Cells.

    chartData.Series.Clear();
    chartData.Categories.Clear();

    workbookStream.Position = 0;
    chartData.WriteWorkbookStream(workbookStream);
    chart.ValidateChartLayout();
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

Czyszczenie kolekcji usuwa nieaktualne odwołania przed zapisaniem zeszytu. Przed użyciem wykresu odtwórz wymagane mapowania serii i kategorii dla zaktualizowanego zeszytu.

Ustawianie własnych formatów liczbowych dla komórek zeszytu

Użyj ChartDataCell.CustomNumberFormat, aby kontrolować, jak wartości liczbowe wyświetlane są w osadzonym zeszycie wykresu. Na przykład raport może wymagać wyświetlenia współczynnika konwersji jako procentu z czterema miejscami po przecinku oraz współczynnika wyświetlanego z pięcioma miejscami po przecinku. Zachowaj oba wartości jako liczby, aby pozostały dostępne do obliczeń i rysowania wykresu.

Format liczbowy zmienia jedynie wyświetlanie, nie przechowywaną wartość. Format 0.0000% wyświetla 0.125 jako 12.5000%; nie zamienia przechowywanej liczby na 12.5. Podobnie 0.00000 wyświetla 0.1234567 jako 0.12346 bez zaokrąglania przechowywanej wartości. Jeśli własny format jest pustym ciągiem (""), używany jest PresetNumberFormat.

Poniższy przykład tworzy wykres kolumnowy i uzyskuje dostęp do jego komórek przez ChartDataWorkbook. W arkuszu 0 B2 zawiera współczynnik konwersji, a C2 współczynnik. Obie komórki dostarczają wartości wykresu. Przykład włącza także etykiety wartości powiązane z formatami źródłowymi.

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation();
presentation.SlideSize.SetSize(720, 270, SlideSizeScaleType.DoNotScale);
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.ClusteredColumn, 50, 20, 620, 210);
chart.HasTitle = false;

chart.Axes.VerticalAxis.IsNumberFormatLinkedToSource = false;
chart.Axes.VerticalAxis.NumberFormat = "0.00";
chart.Axes.VerticalAxis.IsAutomaticMinValue = false;
chart.Axes.VerticalAxis.MinValue = 0;

chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();

var workbook = chart.ChartData.ChartDataWorkbook;
workbook.Clear(0);

var categoryCell = workbook.GetCell(0, "A2", "Sample");
chart.ChartData.Categories.Add(categoryCell);

var percentageCell = workbook.GetCell(0, "B2", 0.125);
percentageCell.CustomNumberFormat = "0.0000%";
var percentageName = workbook.GetCell(0, "B1", "Conversion rate");
var percentageSeries = chart.ChartData.Series.Add(percentageName, chart.Type);
percentageSeries.DataPoints.AddDataPointForBarSeries(percentageCell);

var precisionCell = workbook.GetCell(0, "C2", 0.1234567);
precisionCell.CustomNumberFormat = "0.00000";
var precisionName = workbook.GetCell(0, "C1", "Coefficient");
var precisionSeries = chart.ChartData.Series.Add(precisionName, chart.Type);
precisionSeries.DataPoints.AddDataPointForBarSeries(precisionCell);

foreach (var series in chart.ChartData.Series)
{
    var labelFormat = series.DataPoints[0].Label.DataLabelFormat;
    labelFormat.ShowValue = true;
    labelFormat.IsNumberFormatLinkedToSource = true;
}

presentation.Save("CustomCellFormats.pptx", SaveFormat.Pptx);

Formaty komórek zeszytu są oddzielne od formatów ustawianych bezpośrednio na osiach wykresu lub etykietach danych. W tym przykładzie każda etykieta wyświetla wartość swojej komórki źródłowej, ponieważ włączono ShowValue, a flagę IsNumberFormatLinkedToSource ustawiono na true. Po zapisaniu i ponownym otwarciu prezentacji etykiety wyświetlają 12.5000% i 0.12346, jak pokazano poniżej. Oś pionowa używa własnego NumberFormat 0.00, a flagę IsNumberFormatLinkedToSource ustawiono na false.

Aby sformatować etykietę danych niezależnie, wyłącz flagę powiązania ze źródłem (false) i przypisz jej własny NumberFormat. Nie zmienia to formatu komórki zeszytu. Na przykład niezależny format etykiety 0.00 wyświetli pierwszą wartość jako 0.13, podczas gdy B2 nadal pokaże 12.5000%. Zobacz Etykiety danych wykresu w celu bezpośredniego formatowania etykiet.

Poniższy obraz został wygenerowany z zapisanej prezentacji po jej ponownym otwarciu:

Wykres kolumnowy z etykietami powiązanymi ze źródłem pokazującymi 12.5000% i 0.12346 oraz niezależnie sformatowaną osi liczbowej.

Ustawianie komórki zeszytu jako etykiety danych wykresu

Możesz używać tekstu z komórek zeszytu jako etykiet danych wykresu.

Przykład dodaje wykres bąbelkowy z danymi domyślnymi do pierwszego slajdu istniejącej prezentacji. Używa komórek A10:A12 w arkuszu 0 dla pierwszych trzech etykiet w pierwszej serii, włącza etykiety z komórek i zapisuje zaktualizowaną prezentację.

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("chart2.pptx");
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Bubble, 50, 50, 600, 400, true);
var series = chart.ChartData.Series[0];
var workbook = chart.ChartData.ChartDataWorkbook;

series.Labels.DefaultDataLabelFormat.ShowLabelValueFromCell = true;
series.Labels[0].ValueFromCell = workbook.GetCell(0, "A10", "Label 0 cell value");
series.Labels[1].ValueFromCell = workbook.GetCell(0, "A11", "Label 1 cell value");
series.Labels[2].ValueFromCell = workbook.GetCell(0, "A12", "Label 2 cell value");

presentation.Save("resultchart.pptx", SaveFormat.Pptx);

Zarządzanie arkuszami

Właściwość IChartDataWorkbook.Worksheets zapewnia dostęp do arkuszy w zeszycie wykresu. Ten przykład tworzy wykres kołowy z danymi domyślnymi i wypisuje każdą nazwę arkusza w konsoli.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation();
var slide = presentation.Slides[0];

var chart = slide.Shapes.AddChart(ChartType.Pie, 50, 50, 400, 500);
var workbook = chart.ChartData.ChartDataWorkbook;

for (var i = 0; i < workbook.Worksheets.Count; i++)
{
    Console.WriteLine(workbook.Worksheets[i].Name);
}

Określanie typu źródła danych

Wartości punktów serii mogą być również przechowywane bezpośrednio jako literały liczbowe. Zobacz Ustawianie wartości serii przy użyciu literałów liczbowych – kompletny przykład zapisu i odczytu. Typ źródła punktów jest oddzielny od wewnętrznej lub zewnętrznej konfiguracji zeszytu wykresu; używanie literałów liczbowych samo w sobie nie usuwa osadzonego zeszytu.

Przykład tworzy trójwymiarowy wykres kolumnowy z danymi domyślnymi i ustawia dwie nazwy serii przy użyciu różnych źródeł danych. Pierwsza nazwa używa literału tekstowego; druga używa komórki C1 w arkuszu 0. Enumeracja DataSourceType wybiera źródło dla każdej nazwy. Przykład zapisuje prezentację z zaktualizowanymi nazwami serii.

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.Column3D, 50, 50, 600, 400, true);
var literalName = chart.ChartData.Series[0].Name;

literalName.DataSourceType = DataSourceType.StringLiterals;
literalName.Data = "LiteralString";

var cellName = chart.ChartData.Series[1].Name;
var nameCell = chart.ChartData.ChartDataWorkbook.GetCell(0, "C1", "NewCell");
cellName.DataSourceType = DataSourceType.Worksheet;
cellName.Data = nameCell;

presentation.Save("pres.pptx", SaveFormat.Pptx);

Wykrywanie nieobsługiwanych formatów osadzonych zeszytów

Aspose.Slides nie obsługuje formatu binarnego Excela (.xlsb), który może być osadzony w niektórych wykresach. Możesz używać właściwości EmbeddedWorkbookType w interfejsie IChartData razem z enumeracją WorkbookType do wykrywania nieobsługiwanych formatów i pomijania takich wykresów. Przykład sprawdza kształty na pierwszym slajdzie istniejącej prezentacji, pomija kształty niebędące wykresami i wypisuje komunikat diagnostyczny dla każdego wykresu z osadzonym zeszytem .xlsb.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation("sample.pptx");
var slide = presentation.Slides[0];

foreach (var shape in slide.Shapes)
{
    if (shape is not IChart chart)
    {
        continue;
    }

    var chartData = chart.ChartData;
    var isInternalWorkbook = chartData.DataSourceType == ChartDataSourceType.InternalWorkbook;
    var isBinaryMacro = chartData.EmbeddedWorkbookType == WorkbookType.WorkbookBinaryMacro;

    if (isInternalWorkbook && isBinaryMacro)
    {
        Console.WriteLine("Skipping a chart with an unsupported .xlsb workbook.");
        continue;
    }

    // Odczytaj lub zmodyfikuj obsługiwane dane zeszytu wykresu tutaj.
}

Zewnętrzny zeszyt

Aspose.Slides obsługuje używanie zewnętrznych zeszytów jako źródła danych dla wykresów.

Utworzenie zewnętrznego zeszytu

Użyj ReadWorkbookStream i SetExternalWorkbook, aby wyeksportować osadzony zeszyt wykresu do pliku i powiązać wykres z tym zewnętrznym zeszytem.

Przykład tworzy wykres kołowy z danymi domyślnymi i eksportuje jego zeszyt. Zamknięcie strumienia wyjściowego następuje przed przypisaniem zewnętrznego zeszytu jako źródła danych wykresu, po czym zapisuje powiązaną prezentację.

using System.IO;
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.Pie, 50, 50, 400, 600);
var workbookPath = Path.GetFullPath("externalWorkbook1.xlsx");

using (var workbookStream = chart.ChartData.ReadWorkbookStream())
using (var fileStream = File.Create(workbookPath))
{
    workbookStream.CopyTo(fileStream);
}

chart.ChartData.SetExternalWorkbook(workbookPath);
presentation.Save("externalWorkbook.pptx", SaveFormat.Pptx);

Ustawienie zewnętrznego zeszytu

Za pomocą metody SetExternalWorkbook możesz przypisać zewnętrzny zeszyt do wykresu jako źródło danych. Metoda może być także użyta do aktualizacji ścieżki do zewnętrznego zeszytu (jeśli został przeniesiony).

Choć nie możesz edytować danych w zeszytach przechowywanych w zdalnych lokalizacjach lub zasobach, nadal możesz ich używać jako zewnętrznego źródła danych. Jeśli podano względną ścieżkę do zewnętrznego zeszytu, zostaje ona automatycznie przekształcona na pełną ścieżkę.

Przykład używa zewnętrznego zeszytu, którego arkusz o nazwie Sheet1 zawiera nazwę serii w B1, nazwy kategorii w A2:A4 oraz wartości liczbowe w B2:B4. Przykład tworzy wykres kołowy, powiązuje zeszyt i używa SetRange, aby zmapować A1:B4 na jedną serię i trzy kategorie. Zapisuje prezentację z powiązanym wykresem.

using System.IO;
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.Pie, 50, 50, 400, 600, true);
var chartData = chart.ChartData;
var workbookPath = Path.GetFullPath("externalWorkbook.xlsx");

chartData.SetExternalWorkbook(workbookPath);
chartData.SetRange("Sheet1!$A$1:$B$4");

presentation.Save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);

Parametr updateChartData metody SetExternalWorkbook steruje, czy zeszyt zostanie załadowany.

  • Gdy updateChartData jest false, aktualizowana jest tylko ścieżka zeszytu. Dane wykresu nie są ładowane ani aktualizowane z docelowego zeszytu, więc zeszyt może być niedostępny.
  • Gdy updateChartData jest true, dane wykresu są aktualizowane z docelowego zeszytu.

Poniższy przykład przypisuje adres URL jako placeholder z updateChartData ustawionym na false. Zachowuje domyślne dane wykresu kołowego i zapisuje prezentację bez ładowania niedostępnego zeszytu.

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.Pie, 50, 50, 400, 600, true);

chart.ChartData.SetExternalWorkbook("https://example.com/unavailable-workbook.xlsx", false);
presentation.Save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);

Uzyskanie ścieżki zewnętrznego źródła danych zeszytu wykresu

Aby zidentyfikować zeszyt powiązany z wykresem, sprawdź, czy wykres używa zewnętrznego źródła danych i pobierz jego ścieżkę zeszytu.

Przykład sprawdza pierwszy kształt na pierwszym slajdzie prezentacji z powiązanym zewnętrznym zeszytem. Jeśli jest to wykres powiązany z zewnętrznym zeszytem, przykład wypisuje ExternalWorkbookPath w konsoli. Następnie zapisuje kopię prezentacji.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("externalWorkbook.pptx");
var slide = presentation.Slides[0];

var shapeCount = slide.Shapes.Count;
if (shapeCount > 0 && slide.Shapes[0] is IChart chart)
{
    var chartData = chart.ChartData;
    if (chartData.DataSourceType == ChartDataSourceType.ExternalWorkbook)
    {
        Console.WriteLine(chartData.ExternalWorkbookPath);
    }
    else
    {
        Console.WriteLine("The chart does not use an external workbook.");
    }
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

presentation.Save("Result.pptx", SaveFormat.Pptx);

Edycja danych wykresu

Możesz edytować dane w zewnętrznych zeszytach tak samo, jak w wewnętrznych. Gdy zewnętrzny zeszyt nie może być załadowany, zostaje zgłoszony wyjątek.

Przykład używa wykresu, który jest pierwszym kształtem na pierwszym slajdzie i jest powiązany z dostępnym zewnętrznym zeszytem. Ustawia wartość opartą na komórce pierwszego punktu danych w pierwszej serii na 100 i zapisuje zaktualizowaną prezentację. Edycja wartości komórek może zaktualizować powiązany zewnętrzny plik XLSX, więc użyj kopii, jeśli musisz zachować oryginalny zeszyt.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("presentation.pptx");
var slide = presentation.Slides[0];

var shapeCount = slide.Shapes.Count;
if (shapeCount > 0 && slide.Shapes[0] is IChart chart)
{
    var series = chart.ChartData.Series;
    if (series.Count > 0 && series[0].DataPoints.Count > 0)
    {
        var valueCell = series[0].DataPoints[0].Value.AsCell;
        if (valueCell != null)
        {
            valueCell.Value = 100;
            presentation.Save("presentation_out.pptx", SaveFormat.Pptx);
        }
        else
        {
            Console.WriteLine("The first data point is not linked to a workbook cell.");
        }
    }
    else
    {
        Console.WriteLine("The chart has no data points to edit.");
    }
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

Odświeżanie danych wykresu ze źródłowych zeszytów

Aspose.Slides for .NET 26.11 dodaje IChartData.RefreshData dla pojedynczego wykresu oraz IPresentation.RefreshChartsData dla całej prezentacji. Używaj ich po zmianie wartości w zeszycie źródłowym. Zewnętrzne zeszyty muszą być dostępne i obsługiwane.

Mając zainstalowane Aspose.Slides for .NET 26.11 lub nowsze, ten przykład odświeża pierwszy wykres na pierwszym slajdzie pliku charts.pptx. Jego zeszyt źródłowy musi być dostępny. Zapisz wynik, aby zachować zaktualizowane dane wykresu.

using System;
using System.Linq;
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using var presentation = new Presentation("charts.pptx");
var chart = presentation.Slides[0].Shapes.OfType<IChart>().FirstOrDefault();
if (chart == null)
{
    Console.WriteLine("The first slide must contain a chart.");
    return;
}

chart.ChartData.RefreshData();
presentation.Save("refreshed-chart.pptx", SaveFormat.Pptx);

Aby odświeżyć wszystkie wykresy, użyj osobnej instancji prezentacji w następujący sposób. Przekazanie false powoduje propagację niepowodzenia odświeżenia do wywołującego; nie wycofuje wykresów już odświeżonych.

using Aspose.Slides;
using Aspose.Slides.Export;

using var presentation = new Presentation("charts.pptx");
presentation.RefreshChartsData(skipFailedCharts: false);
presentation.Save("refreshed-charts.pptx", SaveFormat.Pptx);

Parametr domyślnie ma wartość true: RefreshChartsData pomija niepowodzenia i kontynuuje z innymi wykresami. Nie zwraca wyników per wykres, więc udane wywołanie nie dowodzi, że każdy wykres został odświeżony. Użyj pojedynczych wywołań RefreshData, jeśli musisz zidentyfikować każdy nieudany wykres.

Odświeżanie wczytuje ponownie dane źródłowe. Jest to oddzielne od obliczania formuł, walidacji układu wykresu i aktualizacji podglądu OLE. Sprawdź wartości oparte na komórkach w pamięci, aby zweryfikować odświeżenie. CachedValue może nadal opisywać wcześniej zapisany wykres, dopóki nie zapiszesz i nie otworzysz ponownie prezentacji.

Odczyt zapamiętanych wartości wykresu bez zeszytu

W .NET 26.11, akcesory wartości zapamiętanych odczytują wartości przechowywane wraz z wykresem bez otwierania jego zeszytu. Są przydatne, gdy powiązany plik jest niedostępny i potrzebujesz jedynie ostatnio zapisanych danych wykresu. To różni się od odtwarzania zeszytu przy użyciu opcji odzyskiwania poniżej.

Obiekt Akcesor zapamiętanej wartości
Zwykły punkt serii CachedValue
Punkt wykresu rozrzutu lub bąbelka CachedXValue, CachedYValue
Punkt bąbelkowy CachedBubbleSize
Kategoria wykresu CachedValue

Każdy akcesor zwraca ICachedChartValue. Data udostępnia przechowywany obiekt; ToString zwraca tekst; ToDouble zwraca NaN dla brakującej lub nienumerycznej wartości. Pamięć podręczna może być brakująca lub nieaktualna, także w nowo utworzonym wykresie, który nie został zapisany. Nie zakładaj, że każde pole istnieje lub zawiera liczbę.

Ten przykład odczytuje wszystkie te pola z pliku cached-chart.pptx, zapisanej prezentacji zawierającej wykresy. Brak zewnętrznego zeszytu jest dopuszczalny, ponieważ kod nie odwołuje się do ChartDataWorkbook ani do żywych komórek zeszytu.

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

using var presentation = new Presentation("cached-chart.pptx");
foreach (var slide in presentation.Slides)
foreach (var shape in slide.Shapes)
{
    if (shape is not IChart chart)
        continue;

    foreach (var category in chart.ChartData.Categories)
        PrintCache("Category", category.CachedValue);

    foreach (var series in chart.ChartData.Series)
    foreach (var point in series.DataPoints)
    {
        PrintCache("Value", point.CachedValue);
        PrintCache("X", point.CachedXValue);
        PrintCache("Y", point.CachedYValue);
        PrintCache("Bubble size", point.CachedBubbleSize);
    }
}

static void PrintCache(string name, ICachedChartValue value)
{
    var number = value.ToDouble();
    if (value.Data == null)
        Console.WriteLine($"{name}: no cached value");
    else if (double.IsNaN(number))
        Console.WriteLine($"{name}: {value} (not numeric)");
    else
        Console.WriteLine($"{name}: {number}");
}

Używaj odświeżania, gdy potrzebujesz aktualnych danych źródłowych; używaj odczytów z pamięci podręcznej, gdy wystarcza migawka przechowywana. Pamięć podręczna nie jest pełną kopią zeszytu i nie może dostarczyć zmian dokonanych po ostatnim jej zaktualizowaniu.

Odzyskiwanie zeszytu z pamięci podręcznej wykresu

Jeśli wykres używa zewnętrznego zeszytu, który jest brakujący lub niedostępny, Aspose.Slides może odtworzyć zeszyt wykresu z danych zapamiętanych w prezentacji. Utwórz LoadOptions, skonfiguruj jego SpreadsheetOptions, i ustaw ISpreadsheetOptions.RecoverWorkbookFromChartCache na true przed otwarciem prezentacji.

Poniższy przykład C# odzyskuje dane zeszytu dla wykresu, który jest pierwszym kształtem na pierwszym slajdzie i odwołuje się do niedostępnego zewnętrznego zeszytu. Dostęp do odzyskanych danych uzyskuje przez IChart.ChartData oraz IChartData.ChartDataWorkbook:

using System;
using Aspose.Slides;
using Aspose.Slides.Charts;

var spreadsheetOptions = new SpreadsheetOptions
{
    RecoverWorkbookFromChartCache = true
};
var loadOptions = new LoadOptions
{
    SpreadsheetOptions = spreadsheetOptions
};

using var presentation = new Presentation("presentation.pptx", loadOptions);
var slide = presentation.Slides[0];

var shapeCount = slide.Shapes.Count;
if (shapeCount > 0 && slide.Shapes[0] is IChart chart)
{
    var recoveredWorkbook = chart.ChartData.ChartDataWorkbook;

    // Odczytaj lub zmodyfikuj odzyskane dane zeszytu tutaj.
}
else
{
    Console.WriteLine("The first shape is not a chart.");
}

Jeśli kod odwołuje się do zewnętrznego zeszytu, gdy jest niedostępny, a odzyskiwanie jest wyłączone, Aspose.Slides wyrzuca InvalidOperationException. Włączaj odzyskiwanie wyłącznie wtedy, gdy użycie danych zapamiętanych jest dopuszczalnym rozwiązaniem awaryjnym, ponieważ pamięć podręczna może nie zawierać zmian wprowadzonych w zewnętrznym zeszycie po ostatniej aktualizacji prezentacji.

FAQ

Czy mogę określić, czy konkretny wykres jest powiązany ze zewnętrznym czy osadzonym zeszytem?

Tak. Wykres posiada data source type oraz path to an external workbook; jeśli źródłem jest zewnętrzny zeszyt, możesz odczytać pełną ścieżkę, aby upewnić się, że używany jest plik zewnętrzny.

Czy obsługiwane są względne ścieżki do zewnętrznych zeszytów i w jaki sposób są przechowywane?

Tak. Jeśli podasz względną ścieżkę, jest ona automatycznie konwertowana na ścieżkę bezwzględną. Prezentacja przechowuje ścieżkę bezwzględną w pliku PPTX, więc przeniesienie zeszytu może wymagać aktualizacji łącza.

Czy mogę używać zeszytów znajdujących się w zasobach sieciowych/udziałach?

Tak, takie zeszyty mogą być używane jako zewnętrzne źródło danych. Jednak edytowanie zdalnych zeszytów bezpośrednio z Aspose.Slides nie jest obsługiwane – mogą być używane wyłącznie jako źródło.

Czy Aspose.Slides nadpisuje zewnętrzny plik XLSX przy zapisie prezentacji?

Prezentacja przechowuje link do pliku zewnętrznego. Edycja danych wykresu opartej na komórkach może także zaktualizować powiązany lokalny plik XLSX. Użyj kopii zeszytu, jeśli oryginał musi pozostać niezmieniony.

Co zrobić, jeśli zewnętrzny plik jest zabezpieczony hasłem?

Aspose.Slides nie akceptuje hasła przy powiązaniu. Typowe podejście to usunięcie zabezpieczenia wcześniej lub przygotowanie odszyfrowanej kopii (np. przy użyciu Aspose.Cells) i powiązanie z tą kopią.

Czy wiele wykresów może odwoływać się do tego samego zewnętrznego zeszytu?

Tak. Każdy wykres przechowuje własne łącze. Jeśli wszystkie wskazują na ten sam plik, aktualizacja tego pliku będzie odzwierciedlona w każdym wykresie przy następnym wczytaniu danych.