Управление рабочими книгами диаграмм в презентациях на .NET
Обзор
В этой статье объясняется, как работать с рабочими книгами диаграмм в Aspose.Slides. Показывается, как читать и записывать данные диаграммы через потоки рабочей книги, использовать ячейки рабочей книги в качестве подписей данных диаграммы, получать доступ к коллекциям листов и указывать тип источника данных для значений диаграммы.
Также рассматривается работа с внешними рабочими книгами в качестве источников данных диаграммы. Примеры демонстрируют, как создать и присвоить внешнюю рабочую книгу, получить путь к внешней рабочей книге, связанной с диаграммой, и редактировать данные диаграммы, когда рабочая книга доступна.
Для ячеек рабочей книги, представляющих отсутствующие данные, см. Control the Display of Empty Cells — различия между пустой ячейкой и нулём, а также сравнение режимов отображения на линейной диаграмме.
Включить данные из скрытых строк и столбцов
Используйте 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 определяет, как отображать недостающие значения; он не включает и не исключает скрытые исходные данные. См. Control the Display of Empty Cells для примера.
Получить диапазон данных диаграммы
Перед обновлением данных рабочей книги в существующей презентации проверьте исходные диапазоны, чтобы понять, какие ячейки листа использует каждая диаграмма. Метод IChartData.GetRange возвращает текущий диапазон данных в виде формулы, квалифицированной листом, например Sheet1!$A$1:$D$5. Здесь Sheet1 — имя листа, ! разделяет его от диапазона ячеек, а $A$1:$D$5 указывает на ячейки от A1 до D5 включительно. Доллары означают абсолютные ссылки на строки и столбцы.
Метод читает текущий диапазон без изменения диаграммы или её рабочей книги. Если диаграмма не использует рабочую книгу в качестве источника данных, будет поднято исключение InvalidOperationException. Подробнее см. ChartData API Reference.
В этом примере открывается презентация и проверяются фигуры на каждом слайде на наличие диаграмм. Выводятся имя каждой диаграммы и её исходный диапазон. Если диаграмма не использует рабочую книгу, выводится сообщение и проверка продолжается со следующей диаграммой.
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.");
}
Очистка коллекций удаляет устаревшие ссылки на данные перед записью рабочей книги. Восстановите при необходимости серии и сопоставления категорий для обновлённой рабочей книги перед использованием диаграммы.
Установить ячейку рабочей книги в качестве подписи данных диаграммы
Можно использовать текст из ячеек рабочей книги в качестве подписей данных диаграммы.
Пример добавляет пузырьковую диаграмму с данными по умолчанию на первый слайд существующей презентации. Он использует ячейки 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 может восстановить рабочую книгу диаграммы из кешированных данных презентации. Создайте 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
Могу ли я определить, к какой внешней или встроенной рабочей книге привязана конкретная диаграмма?
Да. Диаграмма имеет data source type и path to an external workbook; если источник — внешняя рабочая книга, вы можете прочитать полный путь и убедиться, что используется внешний файл.
Поддерживаются ли относительные пути к внешним рабочим книгам и как они сохраняются?
Да. При указании относительного пути он автоматически преобразуется в абсолютный. Презентация сохраняет абсолютный путь в файле PPTX, поэтому при перемещении книги может потребоваться обновить ссылку.
Можно ли использовать рабочие книги, расположенные на сетевых ресурсах/общих папках?
Да, такие книги могут использоваться как внешний источник данных. Однако прямое редактирование удалённых книг из Aspose.Slides не поддерживается — они могут использоваться только в качестве источника.
Перезаписывает ли Aspose.Slides внешний XLSX при сохранении презентации?
Презентация хранит link to the external file. Редактирование данных, полученных из ячеек, может также обновить связанный локальный файл XLSX. При необходимости сохранения оригинала используйте копию рабочей книги.
Что делать, если внешний файл защищён паролем?
Aspose.Slides не принимает пароль при создании ссылки. Обычный подход — снять защиту заранее или подготовить расшифрованную копию (например, с помощью Aspose.Cells) и ссылаться именно на неё.
Могут ли несколько диаграмм ссылаться на одну и ту же внешнюю рабочую книгу?
Да. Каждая диаграмма хранит собственную ссылку. Если все они указывают на один и тот же файл, изменение этого файла отразится в каждой диаграмме при следующей загрузке данных.

