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 zeszytu, 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.
W przypadku komórek zeszytu reprezentujących brakujące dane, zobacz Control the Display of Empty Cells aby poznać różnicę między pustą komórką a zerem oraz porównanie linii wykresu dostępnych trybów wyświetlania.
Odczyt i zapis danych wykresu z zeszytu
Aspose.Slides udostępnia metody ReadWorkbookStream i WriteWorkbookStream, które umożliwiają odczyt i zapis zeszytów danych wykresu (zawierających dane wykresu edytowane przy pomocy Aspose.Cells). Uwaga dane wykresu muszą być zorganizowane w ten sam sposób lub mieć strukturę podobną do źródła.
Ten kod C# demonstruje przykładową operację:
using Aspose.Slides;
using Aspose.Slides.Charts;
using (Presentation pres = new Presentation("chart.pptx"))
{
Chart chart = (Chart) pres.Slides[0].Shapes[0];
IChartData data = chart.ChartData;
MemoryStream stream = data.ReadWorkbookStream();
data.Series.Clear();
data.Categories.Clear();
stream.Position = 0;
data.WriteWorkbookStream(stream);
}
Sprawdź układ wykresu po modyfikacji zeszytu
Kiedy zamieniasz osadzony zeszyt na zmodyfikowany, wykres zachowuje swoje pierwotne kolekcje serii i kategorii. To niezgodność może spowodować, że IChart.ValidateChartLayout zakończy się niepowodzeniem z błędem indeksu poza zakresem. Wyczyść istniejące serie i kategorie przed zapisaniem zaktualizowanego zeszytu z powrotem do wykresu.
// Po modyfikacji strumienia zeszytu (np. przy użyciu Aspose.Cells)
using var updatedWorkbook = chartData.ReadWorkbookStream();
// Wyczyść istniejące odwołania do danych.
chartData.Series.Clear();
chartData.Categories.Clear();
updatedWorkbook.Position = 0;
chartData.WriteWorkbookStream(updatedWorkbook);
chart.ValidateChartLayout();
Wyczyszczenie kolekcji zapewnia, że struktura danych wykresu jest zgodna z nowym zeszytem, co pozwala funkcji ValidateChartLayout zakończyć się bez błędów.
Ustaw komórkę WorkBook jako etykietę danych wykresu
- Utwórz instancję klasy Presentation.
- Uzyskaj odniesienie do slajdu za pomocą jego indeksu.
- Dodaj wykres bąbelkowy z pewnymi danymi.
- Uzyskaj dostęp do serii wykresu.
- Ustaw komórkę zeszytu jako etykietę danych.
- Zapisz prezentację.
Ten kod C# pokazuje, jak ustawić komórkę zeszytu jako etykietę danych wykresu:
using Aspose.Slides;
using Aspose.Slides.Charts;
string lbl0 = "Label 0 cell value";
string lbl1 = "Label 1 cell value";
string lbl2 = "Label 2 cell value";
// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji
using (Presentation pres = new Presentation("chart2.pptx"))
{
ISlide slide = pres.Slides[0];
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Bubble, 50, 50, 600, 400, true);
IChartSeriesCollection series = chart.ChartData.Series;
series[0].Labels.DefaultDataLabelFormat.ShowLabelValueFromCell = true;
IChartDataWorkbook wb = chart.ChartData.ChartDataWorkbook;
series[0].Labels[0].ValueFromCell = wb.GetCell(0, "A10", lbl0);
series[0].Labels[1].ValueFromCell = wb.GetCell(0, "A11", lbl1);
series[0].Labels[2].ValueFromCell = wb.GetCell(0, "A12", lbl2);
pres.Save("resultchart.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}
Zarządzaj arkuszami
Ten kod C# demonstruje operację, w której właściwość IChartDataWorkbook.Worksheets jest używana do uzyskania dostępu do kolekcji arkuszy:
using Aspose.Slides;
using Aspose.Slides.Charts;
using (Presentation pres = new Presentation())
{
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 500);
IChartDataWorkbook wb = chart.ChartData.ChartDataWorkbook;
for (int i = 0; i < wb.Worksheets.Count; i++)
Console.WriteLine(wb.Worksheets[i].Name);
}
Określ typ źródła danych
Ten kod C# pokazuje, jak określić typ dla źródła danych:
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using (Presentation pres = new Presentation())
{
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Column3D, 50, 50, 600, 400, true);
IStringChartValue val = chart.ChartData.Series[0].Name;
val.DataSourceType = DataSourceType.StringLiterals;
val.Data = "LiteralString";
val = chart.ChartData.Series[1].Name;
val.Data = chart.ChartData.ChartDataWorkbook.GetCell(0, "B1", "NewCell");
pres.Save("pres.pptx", SaveFormat.Pptx);
}
Wykryj nieobsługiwane formaty osadzonych zeszytów
Aspose.Slides nie obsługuje formatu binarnego zeszytu Excel (.xlsb), który może być osadzony w niektórych wykresach. Możesz użyć właściwości EmbeddedWorkbookType w IChartData wraz z wyliczeniem WorkbookType, aby wykrywać nieobsługiwane formaty i pomijać takie wykresy.
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;
if (chartData.DataSourceType == ChartDataSourceType.InternalWorkbook &&
chartData.EmbeddedWorkbookType == WorkbookType.WorkbookBinaryMacro)
{
// Osadzony zeszyt jest w formacie .xlsb, który nie jest obsługiwany.
continue;
}
// Odczytaj lub zmodyfikuj tutaj dane zeszytu wykresu.
}
}
Zewnętrzny zeszyt
Aspose.Slides obsługuje używanie zewnętrznych zeszytów jako źródła danych dla wykresów.
Utwórz zewnętrzny zeszyt
Korzystając z metod ReadWorkbookStream i SetExternalWorkbook, możesz zarówno utworzyć zewnętrzny zeszyt od podstaw, jak i przekształcić wewnętrzny zeszyt w zewnętrzny.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using (Presentation pres = new Presentation())
{
const string workbookPath = "externalWorkbook1.xlsx";
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600);
using (FileStream fileStream = new FileStream(workbookPath, FileMode.Create))
{
byte[] workbookData = chart.ChartData.ReadWorkbookStream().ToArray();
fileStream.Write(workbookData, 0, workbookData.Length);
}
chart.ChartData.SetExternalWorkbook(Path.GetFullPath(workbookPath));
pres.Save("externalWorkbook.pptx", SaveFormat.Pptx);
}
Ustaw zewnętrzny zeszyt
Korzystając z metody SetExternalWorkbook, możesz przypisać zewnętrzny zeszyt do wykresu jako jego źródło danych. Metoda ta może być również użyta do zaktualizowania ścieżki do zewnętrznego zeszytu (jeśli został on przeniesiony).
Chociaż nie możesz edytować danych w zeszytach przechowywanych w zdalnych lokalizacjach lub zasobach, możesz nadal używać takich zeszytów 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ę.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
// Ścieżka do katalogu dokumentów.
using (Presentation pres = new Presentation())
{
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600, false);
IChartData chartData = chart.ChartData;
chartData.SetExternalWorkbook(Path.GetFullPath("externalWorkbook.xlsx"));
chartData.Series.Add(chartData.ChartDataWorkbook.GetCell(0, "B1"), ChartType.Pie);
chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B2"));
chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B3"));
chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B4"));
chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A2"));
chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A3"));
chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A4"));
pres.Save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
}
Parametr ChartData (w metodzie SetExternalWorkbook) jest używany do określenia, czy zeszyt Excel zostanie załadowany.
- Gdy wartość
ChartDatajest ustawiona nafalse, aktualizowana jest tylko ścieżka do zeszytu — dane wykresu nie będą ładowane ani aktualizowane z docelowego zeszytu. To ustawienie przydaje się, gdy docelowy zeszyt nie istnieje lub jest niedostępny. - Gdy wartość
ChartDatajest ustawiona natrue, dane wykresu są aktualizowane z docelowego zeszytu.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using (Presentation pres = new Presentation())
{
IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600, true);
IChartData chartData = chart.ChartData;
(chartData as ChartData).SetExternalWorkbook("http://path/doesnt/exists", false);
pres.Save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
}
Pobierz ścieżkę zewnętrznego zeszytu źródła danych wykresu
- Utwórz instancję klasy Presentation.
- Uzyskaj odniesienie do slajdu przez jego indeks.
- Utwórz obiekt dla kształtu wykresu.
- Utwórz obiekt typu źródła (
ChartDataSourceType), który reprezentuje źródło danych wykresu. - Określ odpowiedni warunek w zależności od tego, czy typ źródła jest taki sam jak typ źródła danych zewnętrznego zeszytu.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using (Presentation pres = new Presentation("pres.pptx"))
{
ISlide slide = pres.Slides[1];
IChart chart = (IChart)slide.Shapes[0];
ChartDataSourceType sourceType = chart.ChartData.DataSourceType;
if (sourceType == ChartDataSourceType.ExternalWorkbook)
{
string path = chart.ChartData.ExternalWorkbookPath;
}
// Zapisuje prezentację
pres.Save("Result.pptx", SaveFormat.Pptx);
}
Edytuj dane wykresu
Możesz edytować dane w zewnętrznych zeszytach tak samo, jak wprowadzisz zmiany w zawartości wewnętrznych zeszytów. Gdy zewnętrzny zeszyt nie może zostać załadowany, zostaje zgłoszony wyjątek.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;
using (Presentation pres = new Presentation("presentation.pptx"))
{
IChart chart = pres.Slides[0].Shapes[0] as IChart;
ChartData chartData = (ChartData)chart.ChartData;
chartData.Series[0].DataPoints[0].Value.AsCell.Value = 100;
pres.Save("presentation_out.pptx", SaveFormat.Pptx);
}
Odzyskaj zeszyt 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 zapisanych w pamięci podręcznej prezentacji. Utwórz LoadOptions, skonfiguruj jego SpreadsheetOptions i ustaw ISpreadsheetOptions.RecoverWorkbookFromChartCache na true przed otwarciem prezentacji.
Poniższy przykład C# otwiera prezentację, której wykres odwołuje się do niedostępnego zewnętrznego zeszytu i uzyskuje dostęp do odzyskanych danych za pośrednictwem IChart.ChartData oraz IChartData.ChartDataWorkbook:
using Aspose.Slides;
using Aspose.Slides.Charts;
var loadOptions = new LoadOptions
{
SpreadsheetOptions = new SpreadsheetOptions
{
RecoverWorkbookFromChartCache = true
}
};
using var presentation = new Presentation("presentation.pptx", loadOptions);
var chart = (IChart)presentation.Slides[0].Shapes[0];
var recoveredWorkbook = chart.ChartData.ChartDataWorkbook;
// Read or modify the recovered workbook data here.
Jeśli zewnętrzny zeszyt jest niedostępny i odzyskiwanie jest wyłączone, Aspose.Slides zgłasza InvalidOperationException. Włącz odzyskiwanie tylko wtedy, gdy użycie danych wykresu z pamięci podręcznej jest akceptowalnym 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 z zewnętrznym czy osadzonym zeszytem?
Tak. Wykres posiada typ źródła danych i ścieżkę do zewnętrznego zeszytu; 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 względne ścieżki do zewnętrznych zeszytów są obsługiwane i jak są przechowywane?
Tak. Jeśli podasz względną ścieżkę, zostanie ona automatycznie przekształcona na ścieżkę bezwzględną. Jest to wygodne przy przenoszeniu projektu; należy jednak pamiętać, że prezentacja zapisuje ścieżkę bezwzględną w pliku PPTX.
Czy mogę używać zeszytów znajdujących się na 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 podczas zapisywania prezentacji?
Nie. Prezentacja przechowuje link do pliku zewnętrznego i używa go do odczytu danych. Sam plik zewnętrzny nie jest modyfikowany podczas zapisywania prezentacji.
Co zrobić, jeśli zewnętrzny plik jest zabezpieczony hasłem?
Aspose.Slides nie akceptuje hasła podczas tworzenia linku. Powszechnym rozwiązaniem jest usunięcie ochrony wcześniej lub przygotowanie odszyfrowanej kopii (np. przy użyciu Aspose.Cells) i odwołanie się do tej kopii.
Czy wiele wykresów może odwoływać się do tego samego zewnętrznego zeszytu?
Tak. Każdy wykres przechowuje własny link. Jeśli wszystkie odwołują się do tego samego pliku, aktualizacja tego pliku zostanie odzwierciedlona w każdym wykresie przy następnym wczytaniu danych.