Управление рабочими книгами диаграмм в презентациях на .NET
Обзор
В этой статье объясняется, как работать с рабочими книгами диаграмм в Aspose.Slides. Показано, как читать и записывать данные диаграммы через потоки рабочей книги, использовать ячейки рабочей книги в качестве меток данных диаграммы, получать доступ к коллекциям листов и указывать тип источника данных для значений диаграммы.
Также рассматривается работа с внешними рабочими книгами в качестве источников данных диаграмм. В примерах демонстрируется, как создать и присвоить внешнюю рабочую книгу, получить путь к внешней рабочей книге, связанной с диаграммой, и редактировать данные диаграммы, когда рабочая книга доступна.
Для ячеек рабочей книги, представляющих отсутствующие данные, см. Управление отображением пустых ячеек для разницы между пустой ячейкой и нулём, а также сравнение вариантов отображения в линейных диаграммах.
Включать данные из скрытых строк и столбцов
Используйте IChart.PlotVisibleCellsOnly для управления тем, будет ли диаграмма строиться только из видимых ячеек листа или также из скрытых. Установите true, чтобы отображать только видимые ячейки, или false, чтобы включать как видимые, так и скрытые. Эта настройка управляет построением диаграммы; она не скрывает и не делает видимыми строки или столбцы листа.
Пример презентации содержит столбчатую диаграмму как первую форму на первом слайде. Встроенный лист Sheet1 имеет диапазон источника A1:C4. Строка 3 и столбец C скрыты, но их ячейки всё равно содержат значения.
| Строка листа | A: Месяц | B: Розничная торговля | C: Оптовая торговля (скрытый столбец) |
|---|---|---|---|
| 2 | Январь | 10 | 30 |
| 3 (скрытая строка) | Февраль | 40 | 60 |
| 4 | Март | 20 | 50 |
Получайте доступ к исходным ячейкам через IChartData.ChartDataWorkbook и читайте IChartDataCell.IsHidden для проверки их скрытого статуса. Это свойство только для чтения. В данном файле B2 видима, B3 относится к скрытой строке, а C2 — к скрытому столбцу; пример выводит False, True и True соответственно.
Для этого примера обновите данные диаграммы после изменения настройки построения: сохраните встроенную рабочую книгу с помощью ReadWorkbookStream и загрузите её заново с помощью WriteWorkbookStream. При включении всех ячеек также используйте SetRange для восстановления полного диапазона, включая скрытую категорию февраль. Простое изменение флага недостаточно для обновления кэшированных данных диаграммы и меток категорий в этом примере.
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;
// Обновить данные диаграммы из встроенной рабочей книги.
workbookStream.Position = 0;
chart.ChartData.WriteWorkbookStream(workbookStream);
if (!visibleOnly)
{
// Восстановить полный исходный диапазон, включая скрытые категории.
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.");
}
Пример сохраняет две версии презентации: одну только с видимыми значениями розничной торговли (10 и 20), и другую со всеми шестью значениями. Ниже представлены изображения, полученные из сохранённых презентаций после их повторного открытия; оба файла сохраняют установленную настройку построения. Строка 3 и столбец C остаются скрытыми в обеих встроенных рабочих книгах.
Только видимые ячейки (true) |
Все ячейки (false) |
|---|---|
![]() |
![]() |
Скрытая ячейка с значением отличается от пустой ячейки. IChart.DisplayBlanksAs управляет тем, как отображаются отсутствующие значения; он не включает и не исключает скрытые исходные данные. См. Управление отображением пустых ячеек для примера.
Получение диапазона данных диаграммы
Перед обновлением данных рабочей книги в существующей презентации проверьте диапазоны источника, чтобы определить, какие ячейки листа использует каждая диаграмма. Метод IChartData.GetRange возвращает текущий диапазон данных в виде формулы, квалифицированной листом, например Sheet1!$A$1:$D$5. Здесь Sheet1 — имя листа, ! отделяет его от диапазона ячеек, а $A$1:$D$5 обозначает ячейки от A1 до D5 включительно. Доллары указывают на абсолютные ссылки на строки и столбцы.
Метод читает текущий диапазон без изменения диаграммы или её рабочей книги. Если диаграмма не использует рабочую книгу в качестве источника данных, он бросает InvalidOperationException. Для дополнительной информации см. Ссылка API ChartData.
В этом примере открывается презентация и проверяются формы непосредственно на каждом слайде на наличие диаграмм. Выводится имя каждой диаграммы и её исходный диапазон. Если диаграмма не использует рабочую книгу, выводится сообщение и переход к следующей диаграмме.
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.");
}
}
}
}
Чтение и запись данных диаграммы из рабочей книги
Aspose.Slides for .NET предоставляет методы ReadWorkbookStream и WriteWorkbookStream, позволяющие читать и записывать рабочие книги данных диаграмм (содержащие данные, отредактированные с помощью Aspose.Cells). Примечание: данные диаграммы должны быть организованы тем же самым образом или иметь структуру, аналогичную источнику.
Этот пример использует презентацию с диаграммой как первой формой на первом слайде. Он читает встроенную рабочую книгу в поток, очищает существующие серии и категории, и записывает ту же рабочую книгу обратно. Изменения остаются в памяти; презентация не сохраняется.
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.");
}
Проверка макета диаграммы после изменения рабочей книги
При замене встроенной рабочей книги модифицированной, диаграмма сохраняет оригинальные коллекции серий и категорий. Такое несоответствие может привести к ошибке IChart.ValidateChartLayout с вышедшим за пределы индексом. Очистите существующие серии и категории перед записью обновлённой рабочей книги обратно в диаграмму. Этот пример использует диаграмму, которая является первой формой на первом слайде. Комментарий отмечает место, где должна происходить правка рабочей книги; исполняемый пример записывает оригинальную рабочую книгу обратно и проверяет макет в памяти.
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();
// Измените поток рабочей книги здесь, например, используя 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.");
}
Очистка коллекций удаляет устаревшие ссылки перед записью рабочей книги. Перед использованием диаграммы перестройте необходимые сопоставления серий и категорий для обновлённой рабочей книги.
Установка пользовательских числовых форматов для ячеек рабочей книги
Используйте ChartDataCell.CustomNumberFormat для управления тем, как числовые значения отображаются в встроенной рабочей книге диаграммы. Например, в отчёте может потребоваться отображать коэффициент конверсии в виде процента с четырьмя знаками после запятой и коэффициент умножения с пятью знаками после запятой. Оставьте оба значения числовыми, чтобы они оставались доступными для вычислений и построения диаграммы.
Числовой формат меняет только отображение, а не хранимое значение. Формат 0.0000% отображает 0.125 как 12.5000%; он не заменяет сохранённое число на 12.5. Аналогично, 0.00000 отображает 0.1234567 как 0.12346 без округления сохранённого значения. Если пользовательский формат — пустая строка (""), используется PresetNumberFormat.
В следующем примере создаётся столбчатая диаграмма и её ячейки доступны через ChartDataWorkbook. На листе 0 ячейка B2 содержит коэффициент конверсии, а C2 — коэффициент умножения. Обе ячейки поставляют значения диаграммы. Пример также включает метки значений, связанные с форматом источника.
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);
Форматы ячеек рабочей книги отделены от форматов, задаваемых напрямую на осях диаграммы или метках данных. В этом примере каждая метка отображает значение ячейки‑источника, потому что ShowValue включён, а IsNumberFormatLinkedToSource установлено в true. После сохранения и повторного открытия презентации метки показывают 12.5000% и 0.12346, как показано ниже. Вертикальная ось использует собственный NumberFormat 0.00, при этом IsNumberFormatLinkedToSource установлено в false.
Чтобы отформатировать метку независимо, сбросьте её флаг привязки к источнику (false) и задайте её NumberFormat. Это не изменит формат ячейки рабочей книги. Например, независимый формат метки 0.00 отобразит первое значение как 0.13, тогда как B2 по‑прежнему будет показывать 12.5000%. См. Метки данных диаграммы для непосредственного форматирования меток.
Ниже изображение, полученное из сохранённой презентации после её повторного открытия:

Установка ячейки рабочей книги в качестве метки данных диаграммы
Текст из ячеек рабочей книги можно использовать в качестве меток данных диаграммы.
В этом примере добавляется пузырьковая диаграмма с данными по умолчанию на первый слайд существующей презентации. Для первых трёх меток первого ряда используются ячейки A10:A12 листа 0, включаются метки из ячеек, и сохраняется обновлённая презентация.
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);
Управление листами
Свойство IChartDataWorkbook.Worksheets предоставляет доступ к листам в рабочей книге диаграммы. В этом примере создаётся круговая диаграмма с данными по умолчанию и выводятся имена всех листов в консоль.
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);
}
Указание типа источника данных
Значения точек серии также могут храниться непосредственно как числовые литералы. См. Установка значений серии с использованием числовых литералов для полного примера, который сохраняет и читает их. Тип источника значений точек отделён от внутренней или внешней конфигурации рабочей книги диаграммы; использование числовых литералов само по себе не удаляет встроенную рабочую книгу.
Этот пример создаёт 3D столбчатую диаграмму с данными по умолчанию и задаёт два имени серии, используя разные источники данных. Первое имя задаётся строковым литералом; второе — ячейкой C1 листа 0. Перечисление DataSourceType выбирает источник для каждого имени. Пример сохраняет презентацию с обновлёнными именами серий.
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);
Обнаружение неподдерживаемых форматов встроенных рабочих книг
Aspose.Slides не поддерживает формат бинарных рабочих книг Excel (.xlsb), которые могут быть встроены в некоторые диаграммы. Вы можете использовать свойство EmbeddedWorkbookType интерфейса IChartData вместе с перечислением WorkbookType для обнаружения неподдерживаемых форматов и пропуска соответствующих диаграмм. Этот пример проверяет формы на первом слайде существующей презентации, пропускает не‑диаграммные формы и выводит диагностическое сообщение для каждой диаграммы с вложенной рабочей книгой .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;
}
// Читать или изменять поддерживаемые данные рабочей книги диаграммы здесь.
}
Внешняя рабочая книга
Aspose.Slides поддерживает использование внешних рабочих книг в качестве источника данных для диаграмм.
Создание внешней рабочей книги
Используйте ReadWorkbookStream и SetExternalWorkbook для экспорта встроенной рабочей книги диаграммы в файл и привязки диаграммы к этой внешней рабочей книге.
В этом примере создаётся круговая диаграмма с данными по умолчанию и экспортируется её рабочая книга. Поток вывода закрывается перед назначением внешней рабочей книги в качестве источника данных диаграммы, после чего сохраняется связанная презентация.
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);
Назначение внешней рабочей книги
С помощью метода SetExternalWorkbook можно назначить внешнюю рабочую книгу диаграмме в качестве её источника данных. Этот же метод позволяет обновить путь к внешней рабочей книге (если она была перемещена).
Редактировать данные в рабочих книгах, хранящихся в удалённых местах или ресурсах, нельзя, но такие книги всё равно могут использоваться как внешний источник данных. Если указан относительный путь к внешней рабочей книге, он автоматически преобразуется в полный путь.
В примере используется внешняя рабочая книга, лист Sheet1 которой содержит имя серии в B1, имена категорий в A2:A4 и числовые значения в B2:B4. Пример создаёт круговую диаграмму, связывает рабочую книгу и использует SetRange для сопоставления A1:B4 с одной серией и тремя категориями. Затем сохраняется презентация со связанной диаграммой.
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);
Параметр updateChartData метода SetExternalWorkbook управляет тем, будет ли загружаться рабочая книга.
- Когда
updateChartDataравноfalse, обновляется только путь к рабочей книге. Данные диаграммы не загружаются и не обновляются из целевой книги, поэтому рабочая книга может быть недоступна. - Когда
updateChartDataравноtrue, данные диаграммы обновляются из целевой книги.
В следующем примере задаётся заполнителный URL с updateChartData, установленным в false. Диаграмма сохраняет данные по умолчанию и презентация сохраняется без загрузки недоступной рабочей книги.
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);
Получение пути к внешней рабочей книге, используемой диаграммой
Чтобы определить, к какой рабочей книге привязана диаграмма, проверьте, использует ли диаграмма внешний источник данных, и получите путь к её рабочей книге.
В примере анализируется первая форма на первом слайде презентации со связанной внешней рабочей книгой. Если это диаграмма, связанная с внешней книгой, выводится ExternalWorkbookPath в консоль. Затем сохраняется копия презентации.
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);
Редактирование данных диаграммы
Данные внешних рабочих книг можно изменять так же, как и данные внутренних книг. Если внешняя рабочая книга не может быть загружена, будет выброшено исключение.
В примере используется диаграмма, первая форма на первом слайде, связанная с доступной внешней рабочей книгой. Значение первой точки первой серии задаётся равным 100, после чего сохраняется обновлённая презентация. Изменение значений ячеек может обновить связанный внешний файл XLSX, поэтому используйте копию, если оригинал должен оставаться неизменным.
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.");
}
Обновление данных диаграмм из исходных рабочих книг
Aspose.Slides for .NET 26.11 добавляет IChartData.RefreshData для отдельной диаграммы и IPresentation.RefreshChartsData для всей презентации. Используйте их после изменения значений в исходных рабочих книгах. Внешние рабочие книги должны быть доступными и поддерживаемыми.
При установленном Aspose.Slides for .NET версии 26.11 или новее, пример обновляет первую диаграмму на первом слайде charts.pptx. Её исходная рабочая книга должна быть доступна. Сохраните результат, чтобы сохранить обновлённые данные диаграммы.
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);
Для обновления всех диаграмм используйте отдельный экземпляр презентации, как показано ниже. Передача false заставляет ошибку обновления пробрасываться вызывающему коду; уже обновлённые диаграммы не откатываются.
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);
По умолчанию параметр равен true: RefreshChartsData пропускает графики, при которых обновление завершилось неудачей, и продолжает работу с остальными. Метод не возвращает результаты по отдельным диаграммам, поэтому успешный вызов не гарантирует, что каждая диаграмма была обновлена. При необходимости идентифицировать каждую проблемную диаграмму используйте отдельные вызовы RefreshData.
Обновление перечитывает исходные данные. Это отдельный процесс от вычисления формул, проверки макета диаграммы и обновления OLE‑просмотра. Чтобы убедиться в обновлении в памяти, проверьте живые значения, основанные на ячейках. CachedValue может по‑прежнему описывать ранее сохранённую диаграмму, пока презентация не будет сохранена и заново открыта.
Чтение кэшированных значений диаграммы без рабочей книги
В .NET 26.11 кэш‑доступоры читают значения, сохранённые вместе с диаграммой, без открытия её рабочей книги. Это полезно, когда связанный файл недоступен и вам нужны только последние сохранённые данные диаграммы. Это отличается от восстановления рабочей книги с помощью опции восстановления, описанной ниже.
| Объект | Кэш‑доступор |
|---|---|
| Обычная точка данных серии | CachedValue |
| Точка данных scatter или bubble | CachedXValue, CachedYValue |
| Точка данных bubble | CachedBubbleSize |
| Категория диаграммы | CachedValue |
Каждый доступор возвращает ICachedChartValue. Свойство Data раскрывает сохранённый объект; метод ToString выводит текст; ToDouble возвращает NaN для отсутствующего или нечислового значения. Кеш может отсутствовать или быть устаревшим, в том числе в новой диаграмме, ещё не сохранённой. Не следует предполагать, что каждое поле существует или содержит число.
Этот пример читает все перечисленные поля из cached-chart.pptx — сохранённой презентации с диаграммами. Отсутствие внешней рабочей книги допустимо, поскольку код не обращается к ChartDataWorkbook или живым ячейкам книги.
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}");
}
Используйте обновление, когда нужны текущие исходные данные; используйте кэш‑чтение, когда достаточно сохранённого снимка. Кеш не является полной копией рабочей книги и не может предоставить изменения, сделанные после её последнего обновления.
Восстановление рабочей книги из кэша диаграммы
Если диаграмма использует внешнюю рабочую книгу, которая отсутствует или недоступна, Aspose.Slides может восстановить рабочую книгу диаграммы из данных, кэшированных в презентации. Создайте LoadOptions, настройте её SpreadsheetOptions, и установите ISpreadsheetOptions.RecoverWorkbookFromChartCache в true перед открытием презентации.
Следующий пример на C# восстанавливает данные рабочей книги для диаграммы, первая форма на первом слайде, которая ссылается на недоступную внешнюю рабочую книгу. Доступ к восстановленным данным осуществляется через IChart.ChartData и 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;
// Прочитать или изменить восстановленные данные рабочей книги здесь.
}
else
{
Console.WriteLine("The first shape is not a chart.");
}
Если код пытается обратиться к внешней рабочей книге, пока она недоступна, и восстановление отключено, Aspose.Slides бросает InvalidOperationException. Включайте восстановление только в том случае, когда использование кэшированных данных диаграммы является приемлемой альтернативой, поскольку кэш может не содержать изменений, сделанных во внешней книге после последнего обновления презентации.
FAQ
Можно ли определить, привязана ли конкретная диаграмма к внешней или встроенной рабочей книге?
Да. Диаграмма имеет type of data source и path to an external workbook; если источник — внешняя рабочая книга, можно прочитать полный путь, чтобы убедиться, что используется внешний файл.
Поддерживаются ли относительные пути к внешним рабочим книгам и как они хранятся?
Да. При указании относительного пути он автоматически преобразуется в абсолютный. Презентация сохраняет абсолютный путь в файле PPTX, поэтому при перемещении рабочей книги может потребоваться обновить ссылку.
Можно ли использовать рабочие книги, расположенные на сетевых ресурсах/общих папках?
Да, такие книги могут использоваться в качестве внешнего источника данных. Однако прямое редактирование удалённых книг из Aspose.Slides не поддерживается — их можно лишь использовать как источник.
Перезаписывает ли Aspose.Slides внешний XLSX при сохранении презентации?
Презентация хранит link to the external file. При редактировании данных, привязанных к ячейкам, может также обновиться связанный локальный файл XLSX. Используйте копию рабочей книги, если оригинал должен оставаться без изменений.
Что делать, если внешний файл защищён паролем?
Aspose.Slides не принимает пароль при привязке. Обычная практика — снять защиту заранее или подготовить дешифрованную копию (например, с помощью Aspose.Cells) и привязать к ней.
Могут ли несколько диаграмм ссылаться на одну и ту же внешнюю рабочую книгу?
Да. Каждая диаграмма хранит свою собственную ссылку. Если они указывают на один и тот же файл, обновление этого файла будет отражено в каждой диаграмме при следующей загрузке данных.

