Управление рабочими книгами диаграмм в презентациях на Android
Обзор
В этой статье объясняется, как работать с рабочими книгами диаграмм в Aspose.Slides. Показано, как читать и записывать данные диаграммы через потоки рабочей книги, использовать ячейки рабочей книги в качестве подписей данных диаграммы, получать доступ к коллекциям листов и задавать тип источника данных для значений диаграммы.
Также рассматривается работа с внешними рабочими книгами в качестве источников данных диаграммы. Примеры демонстрируют, как создать и задать внешнюю рабочую книгу, получить путь к внешней рабочей книге, связанную с диаграммой, и редактировать данные диаграммы, когда рабочая книга доступна.
Для ячеек рабочей книги, представляющих отсутствующие данные, см. Управление отображением пустых ячеек для различий между пустой ячейкой и нулём, а также сравнение режимов отображения в линейной диаграмме.
Включать данные из скрытых строк и столбцов
Используйте IChart.setPlotVisibleCellsOnly для управления тем, будет ли диаграмма строить данные только из видимых ячеек листа. Установите true, чтобы строить только видимые ячейки, или false, чтобы включать как видимые, так и скрытые ячейки. Эта настройка управляет построением диаграммы; она не скрывает и не отображает строки или столбцы листа.
Пример презентации содержит столбчатую диаграмму в виде первой фигуры на первом слайде. Встроенный лист Sheet1 имеет диапазон источника A1:C4. Строка 3 и столбец C скрыты, но их ячейки всё равно содержат значения.
| Строка листа | A: Месяц | B: Розничная торговля | C: Оптовая торговля (скрытый столбец) |
|---|---|---|---|
| 2 | Январь | 10 | 30 |
| 3 (скрытая строка) | Февраль | 40 | 60 |
| 4 | Март | 20 | 50 |
Получайте исходные ячейки через IChartData.getChartDataWorkbook и проверяйте их скрытый статус с помощью IChartDataCell.isHidden. Этот метод сообщает о статусе скрытия без его изменения. В данном файле B2 видима, B3 относится к скрытой строке, а C2 — к скрытому столбцу; пример выводит false, true и true соответственно.
Для этого примера обновите данные диаграммы после изменения настройки построения: сохраняйте встроенную рабочую книгу с помощью readWorkbookStream и перезагружайте её с помощью writeWorkbookStream. При включении всех ячеек также используйте setRange для восстановления полного диапазона, включая скрытую категорию «Февраль». Просто изменение флага недостаточно для обновления кэшированных данных диаграммы и подписей категорий в этом примере.
import com.aspose.slides.*;
Presentation presentation = new Presentation("hidden-source-data.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
System.out.println("B2 hidden: " + workbook.getCell(0, "B2").isHidden());
System.out.println("B3 hidden: " + workbook.getCell(0, "B3").isHidden());
System.out.println("C2 hidden: " + workbook.getCell(0, "C2").isHidden());
byte[] workbookData = chart.getChartData().readWorkbookStream();
for (boolean visibleOnly : new boolean[] { true, false }) {
chart.setPlotVisibleCellsOnly(visibleOnly);
// Обновить данные диаграммы из встроенной рабочей книги.
chart.getChartData().writeWorkbookStream(workbookData);
if (!visibleOnly) {
// Восстановить полный исходный диапазон, включая скрытые категории.
chart.getChartData().setRange("Sheet1!$A$1:$C$4");
}
presentation.save("hidden_cells_" + visibleOnly + ".pptx", SaveFormat.Pptx);
}
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Пример сохраняет две версии презентации: одну только с видимыми значениями розничной торговли (10 и 20), другую со всеми шести значениями. Ниже показаны изображения двух режимов построения. Строка 3 и столбец C остаются скрытыми в обеих встроенных рабочих книгах.
Только видимые ячейки (true) |
Все ячейки (false) |
|---|---|
![]() |
![]() |
Скрытая ячейка, содержащая значение, отличается от пустой ячейки. IChart.setDisplayBlanksAs управляет тем, как отображаются отсутствующие значения; она не включает и не исключает скрытые исходные данные. См. Управление отображением пустых ячеек для примера.
Получить диапазон данных диаграммы
Перед обновлением данных рабочей книги в существующей презентации проверьте исходные диапазоны, чтобы определить, какие ячейки листа использует каждая диаграмма. Метод IChartData.getRange возвращает текущий диапазон данных как формулу, квалифицированную листом, например Sheet1!$A$1:$D$5. Здесь Sheet1 — имя листа, ! отделяет его от диапазона ячеек, а $A$1:$D$5 указывает ячейки от A1 до D5 включительно. Знаки доллара означают абсолютные ссылки на строки и столбцы.
Метод читает текущий диапазон без изменения диаграммы или её рабочей книги. Если диаграмма не использует рабочую книгу в качестве источника данных, выбрасывается InvalidOperationException. Подробнее см. Справочник API ChartData.
В этом примере открывается презентация и проверяются фигуры на каждом слайде на наличие диаграмм. Выводится имя каждой диаграммы и её исходный диапазон. Если диаграмма не использует рабочую книгу, выводится сообщение и осуществляется переход к следующей диаграмме.
import com.aspose.slides.*;
import com.aspose.slides.exceptions.InvalidOperationException;
Presentation presentation = new Presentation("presentation.pptx");
try {
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
if (shape instanceof IChart) {
IChart chart = (IChart) shape;
try {
String range = chart.getChartData().getRange();
System.out.println(chart.getName() + ": " + range);
} catch (InvalidOperationException exception) {
System.out.println(chart.getName() + ": The chart does not use a workbook as its data source.");
}
}
}
}
} finally {
presentation.dispose();
}
Чтение и запись данных диаграммы из рабочей книги
Aspose.Slides for Android via Java предоставляет методы readWorkbookStream и writeWorkbookStream, позволяющие читать и записывать рабочие книги данных диаграмм (содержащие данные, отредактированные в Aspose.Cells). Примечание: данные диаграммы должны быть организованы аналогично или иметь структуру, похожую на исходную.
В этом примере используется презентация с диаграммой в виде первой фигуры на первом слайде. Встроенная рабочая книга считывается в массив байтов, существующие серии и категории очищаются, и та же рабочая книга записывается обратно. Изменения остаются в памяти; пример не сохраняет презентацию.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
byte[] workbookData = chartData.readWorkbookStream();
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Проверка макета диаграммы после изменения рабочей книги
При замене встроенной рабочей книги изменённой, диаграмма сохраняет исходные коллекции серий и категорий. Такое несоответствие может вызвать ошибку IChart.validateChartLayout с сообщением о выходе индекса за пределы. Очистите существующие серии и категории перед записью обновлённой рабочей книги обратно в диаграмму. Пример использует диаграмму, являющуюся первой фигурой на первом слайде. Комментарий отмечает место, где будет происходить редактирование рабочей книги; исполняемый пример записывает оригинальную рабочую книгу обратно и проверяет макет в памяти.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
byte[] workbookData = chartData.readWorkbookStream();
// Измените байты рабочей книги здесь, например, с помощью Aspose.Cells.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
chart.validateChartLayout();
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Очистка коллекций удаляет устаревшие ссылки перед записью рабочей книги. Восстановите необходимые серии и сопоставления категорий для обновлённой рабочей книги перед использованием диаграммы.
Задать пользовательские числовые форматы для ячеек рабочей книги
Используйте IChartDataCell.setCustomNumberFormat для управления отображением числовых значений в встроенной рабочей книге диаграммы. Например, в отчёте может потребоваться отображать коэффициент конверсии в виде процента с четырьмя знаками после запятой и коэффициент с пятью знаками после запятой. Оставьте оба значения числовыми, чтобы они оставались доступными для вычислений и построения диаграмм.
Числовой формат меняет только отображение, а не сохраняемое значение. Формат 0.0000% отображает 0.125 как 12.5000%; он не заменяет хранимое число на 12.5. Аналогично, 0.00000 отображает 0.1234567 как 0.12346, не округляя хранимое значение. Если пользовательский формат — пустая строка (""), используется формат, возвращаемый getPresetNumberFormat.
В следующем примере создаётся столбчатая диаграмма и её ячейки доступны через getChartDataWorkbook. На листе 0 ячейка B2 содержит коэффициент конверсии, а C2 — коэффициент. Обе ячейки поставляют значения диаграммы. Пример также включает подписи значений, связанные с исходными форматами.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
presentation.getSlideSize().setSize(720, 270, SlideSizeScaleType.DoNotScale);
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 20, 620, 210);
chart.setTitle(false);
chart.getAxes().getVerticalAxis().setNumberFormatLinkedToSource(false);
chart.getAxes().getVerticalAxis().setNumberFormat("0.00");
chart.getAxes().getVerticalAxis().setAutomaticMinValue(false);
chart.getAxes().getVerticalAxis().setMinValue(0);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartDataCell categoryCell = workbook.getCell(0, "A2", "Sample");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell percentageCell = workbook.getCell(0, "B2", 0.125);
percentageCell.setCustomNumberFormat("0.0000%");
IChartDataCell percentageName = workbook.getCell(0, "B1", "Conversion rate");
IChartSeries percentageSeries = chart.getChartData().getSeries().add(percentageName, chart.getType());
percentageSeries.getDataPoints().addDataPointForBarSeries(percentageCell);
IChartDataCell precisionCell = workbook.getCell(0, "C2", 0.1234567);
precisionCell.setCustomNumberFormat("0.00000");
IChartDataCell precisionName = workbook.getCell(0, "C1", "Coefficient");
IChartSeries precisionSeries = chart.getChartData().getSeries().add(precisionName, chart.getType());
precisionSeries.getDataPoints().addDataPointForBarSeries(precisionCell);
for (IChartSeries series : chart.getChartData().getSeries()) {
IDataLabelFormat labelFormat = series.getDataPoints().get_Item(0).getLabel().getDataLabelFormat();
labelFormat.setShowValue(true);
labelFormat.setNumberFormatLinkedToSource(true);
}
presentation.save("CustomCellFormats.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Форматы ячеек рабочей книги отдельны от форматов, задаваемых напрямую на осях диаграммы или подписи данных. В этом примере каждая подпись отображает значение исходной ячейки, потому что setShowValue установлен в true, а setNumberFormatLinkedToSource также true. После сохранения и повторного открытия презентации подписи показывают 12.5000% и 0.12346, как показано ниже. Вертикальная ось использует собственный числовой формат, задаваемый через setNumberFormat со значением 0.00, а setNumberFormatLinkedToSource установлен в false.
Чтобы отформатировать подпись независимо, установите её флаг связи с источником в false и задайте формат через setNumberFormat. Это не изменит формат ячейки рабочей книги. Например, независимый формат подписи 0.00 отобразит первое значение как 0.13, в то время как B2 всё равно покажет 12.5000%. См. Подписи данных диаграммы для прямого форматирования подписей.
Изображение ниже получено из сохранённой презентации после её повторного открытия:

Задать ячейку рабочей книги в качестве подписи данных диаграммы
Можно использовать текст из ячеек рабочей книги в качестве подписи данных диаграммы.
В этом примере добавляется пузырьковая диаграмма с данными по умолчанию на первый слайд существующей презентации. Используются ячейки A10:A12 на листе 0 для первых трёх подписей в первой серии, включаются подписи из ячеек и сохраняется обновлённая презентация.
import com.aspose.slides.*;
Presentation presentation = new Presentation("chart2.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, true);
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
series.getLabels().getDefaultDataLabelFormat().setShowLabelValueFromCell(true);
series.getLabels().get_Item(0).setValueFromCell(workbook.getCell(0, "A10", "Label 0 cell value"));
series.getLabels().get_Item(1).setValueFromCell(workbook.getCell(0, "A11", "Label 1 cell value"));
series.getLabels().get_Item(2).setValueFromCell(workbook.getCell(0, "A12", "Label 2 cell value"));
presentation.save("resultchart.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Управление листами
Метод IChartDataWorkbook.getWorksheets предоставляет доступ к листам в рабочей книге диаграммы. В этом примере создаётся круговая диаграмма с данными по умолчанию и выводятся имена всех листов в консоль.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 500);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
for (int i = 0; i < workbook.getWorksheets().size(); i++) {
System.out.println(workbook.getWorksheets().get_Item(i).getName());
}
} finally {
presentation.dispose();
}
Указание типа источника данных
Значения точек серии также могут храниться напрямую как числовые литералы. См. Задать значения серии с помощью числовых литералов для полного примера, который сохраняет и читает их. Тип источника значений точек отдельно от конфигурации внутренней или внешней рабочей книги диаграммы; использование числовых литералов само по себе не удаляет встроенную рабочую книгу.
В этом примере создаётся 3D столбчатая диаграмма с данными по умолчанию и задаются два имени серии, использующие разные источники данных. Первое имя задаётся строковым литералом; второе — ячейкой C1 на листе 0. Перечисление DataSourceType выбирает источник для каждого имени. Пример сохраняет презентацию с обновлёнными именами серий.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, true);
IStringChartValue literalName = chart.getChartData().getSeries().get_Item(0).getName();
literalName.setDataSourceType(DataSourceType.StringLiterals);
literalName.setData("LiteralString");
IStringChartValue cellName = chart.getChartData().getSeries().get_Item(1).getName();
IChartDataCell nameCell = chart.getChartData().getChartDataWorkbook().getCell(0, "C1", "NewCell");
cellName.setDataSourceType(DataSourceType.Worksheet);
cellName.setData(nameCell);
presentation.save("pres.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Обнаружение неподдерживаемых форматов встроенных рабочих книг
Aspose.Slides не поддерживает формат бинарной рабочей книги Excel (.xlsb), который может быть встроен в некоторые диаграммы. Можно использовать метод getEmbeddedWorkbookType на объекте IChartData совместно с перечислением WorkbookType для выявления неподдерживаемых форматов и пропуска соответствующих диаграмм. В этом примере проверяются фигуры на первом слайде существующей презентации, пропускаются не‑диаграммные фигуры и выводится диагностическое сообщение для каждой диаграммы с встроенной рабочей книгой .xlsb.
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IChart)) {
continue;
}
IChart chart = (IChart) shape;
IChartData chartData = chart.getChartData();
boolean isInternalWorkbook = chartData.getDataSourceType() == ChartDataSourceType.InternalWorkbook;
boolean isBinaryMacro = chartData.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro;
if (isInternalWorkbook && isBinaryMacro) {
System.out.println("Skipping a chart with an unsupported .xlsb workbook.");
continue;
}
// Читайте или изменяйте поддерживаемые данные рабочей книги диаграммы здесь.
}
} finally {
presentation.dispose();
}
Внешняя рабочая книга
Aspose.Slides поддерживает использование внешних рабочих книг в качестве источника данных для диаграмм.
Создать внешнюю рабочую книгу
Используйте readWorkbookStream и setExternalWorkbook для экспорта встроенной рабочей книги диаграммы в файл и привязки диаграммы к этой внешней рабочей книге.
В этом примере создаётся круговая диаграмма с данными по умолчанию и экспортируется её рабочая книга. Запись в файл завершается перед назначением внешней рабочей книги в качестве источника данных диаграммы, после чего сохраняется связанная презентация.
import com.aspose.slides.*;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600);
File workbookFile = new File("externalWorkbook1.xlsx").getAbsoluteFile();
byte[] workbookData = chart.getChartData().readWorkbookStream();
try {
try (FileOutputStream workbookStream = new FileOutputStream(workbookFile)) {
workbookStream.write(workbookData);
}
chart.getChartData().setExternalWorkbook(workbookFile.getAbsolutePath());
presentation.save("externalWorkbook.pptx", SaveFormat.Pptx);
} catch (IOException exception) {
System.out.println("Could not write the external workbook: " + exception.getMessage());
}
} finally {
presentation.dispose();
}
Задать внешнюю рабочую книгу
С помощью метода setExternalWorkbook можно назначить внешнюю рабочую книгу диаграмме в качестве источника данных. Этот метод также можно использовать для обновления пути к внешней рабочей книге (если она была перемещена).
Хотя редактировать данные в рабочих книгах, хранящихся в удалённых расположениях или ресурсах, нельзя, такие книги всё равно можно использовать как внешний источник данных. Если указан относительный путь к внешней рабочей книге, он автоматически преобразуется в полный путь.
В примере используется внешняя рабочая книга, лист которой Sheet1 содержит имя серии в B1, имена категорий в A2:A4 и числовые значения в B2:B4. Пример создаёт круговую диаграмму, привязывает рабочую книгу и с помощью setRange сопоставляет A1:B4 к одной серии и трем категориям. Затем сохраняется презентация со связанной диаграммой.
import com.aspose.slides.*;
import java.io.File;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
IChartData chartData = chart.getChartData();
File workbookFile = new File("externalWorkbook.xlsx");
String workbookPath = workbookFile.getAbsolutePath();
chartData.setExternalWorkbook(workbookPath);
chartData.setRange("Sheet1!$A$1:$B$4");
presentation.save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Параметр updateChartData метода setExternalWorkbook управляет тем, будет ли загружена рабочая книга.
- Когда
updateChartDataравноfalse, обновляется только путь к рабочей книге. Данные диаграммы не загружаются и не обновляются из целевой рабочей книги, поэтому рабочая книга может быть недоступна. - Когда
updateChartDataравноtrue, данные диаграммы обновляются из целевой рабочей книги.
В следующем примере задаётся заглушка URL с параметром updateChartData, установленным в false. Сохраняется презентация с данными по умолчанию круговой диаграммы без загрузки недоступной рабочей книги.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
chart.getChartData().setExternalWorkbook("https://example.com/unavailable-workbook.xlsx", false);
presentation.save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Получить путь к внешнему источнику данных рабочей книги диаграммы
Чтобы определить, к какой рабочей книге привязана диаграмма, проверьте, использует ли диаграмма внешний источник данных, и получите её путь к рабочей книге.
В примере проверяется первая фигура на первом слайде презентации, содержащей внешнюю привязанную рабочую книгу. Если это диаграмма, привязанная к внешней рабочей книге, выводится getExternalWorkbookPath в консоль. Затем сохраняется копия презентации.
import com.aspose.slides.*;
Presentation presentation = new Presentation("externalWorkbook.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
if (slide.getShapes().size() > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartData chartData = chart.getChartData();
if (chartData.getDataSourceType() == ChartDataSourceType.ExternalWorkbook) {
System.out.println(chartData.getExternalWorkbookPath());
} else {
System.out.println("The chart does not use an external workbook.");
}
} else {
System.out.println("The first shape is not a chart.");
}
presentation.save("Result.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Редактировать данные диаграммы
Можно редактировать данные во внешних рабочих книгах так же, как и во внутренних. Если внешняя рабочая книга не может быть загружена, будет выброшено исключение.
В примере используется диаграмма, первая фигура на первом слайде, привязанная к доступной внешней рабочей книге. Значение первой точки данных первой серии, подкреплённое ячейкой, устанавливается в 100, после чего сохраняется обновлённая презентация. Редактирование значений ячеек может обновлять связанный внешний XLSX‑файл, поэтому используйте копию, если необходимо сохранить оригинальную рабочую книгу.
import com.aspose.slides.*;
Presentation presentation = new Presentation("presentation.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartSeriesCollection series = chart.getChartData().getSeries();
if (series.size() > 0 && series.get_Item(0).getDataPoints().size() > 0) {
IChartDataCell valueCell = series.get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell();
if (valueCell != null) {
valueCell.setValue(100);
presentation.save("presentation_out.pptx", SaveFormat.Pptx);
} else {
System.out.println("The first data point is not linked to a workbook cell.");
}
} else {
System.out.println("The chart has no data points to edit.");
}
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Восстановить рабочую книгу из кэша диаграммы
Если диаграмма использует внешнюю рабочую книгу, которой нет или она недоступна, Aspose.Slides может восстановить рабочую книгу диаграммы из данных, кэшированных в презентации. Создайте LoadOptions, вызовите LoadOptions.setSpreadsheetOptions, и установите ISpreadsheetOptions.setRecoverWorkbookFromChartCache в true перед открытием презентации.
Следующий пример на Java восстанавливает данные рабочей книги для диаграммы, первая фигура на первом слайде, ссылающейся на недоступную внешнюю рабочую книгу. Доступ к восстановленным данным осуществляется через IChart.getChartData и IChartData.getChartDataWorkbook:
import com.aspose.slides.*;
SpreadsheetOptions spreadsheetOptions = new SpreadsheetOptions();
spreadsheetOptions.setRecoverWorkbookFromChartCache(true);
LoadOptions loadOptions = new LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);
Presentation presentation = new Presentation("presentation.pptx", loadOptions);
try {
ISlide slide = presentation.getSlides().get_Item(0);
int shapeCount = slide.getShapes().size();
if (shapeCount > 0 && slide.getShapes().get_Item(0) instanceof IChart) {
IChart chart = (IChart) slide.getShapes().get_Item(0);
IChartDataWorkbook recoveredWorkbook = chart.getChartData().getChartDataWorkbook();
// Читать или изменять восстановленные данные рабочей книги здесь.
} else {
System.out.println("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Если внешняя рабочая книга недоступна и восстановление отключено, Aspose.Slides выбрасывает исключение. Включайте восстановление только тогда, когда использование кэшированных данных диаграммы приемлемо, поскольку кэш может не содержать изменений, внесённых во внешнюю рабочую книгу после последнего обновления презентации.
FAQ
Могу ли я определить, к какой конкретной диаграмме привязана внешняя или встроенная рабочая книга?
Да. У диаграммы есть тип источника данных и путь к внешней рабочей книге; если источник — внешняя рабочая книга, можно прочитать полный путь, чтобы убедиться, что используется внешний файл.
Поддерживаются ли относительные пути к внешним рабочим книгам и как они хранятся?
Да. При указании относительного пути он автоматически преобразуется в абсолютный. Презентация сохраняет абсолютный путь в файле PPTX, поэтому перемещение рабочей книги может потребовать обновления ссылки.
Можно ли использовать рабочие книги, расположенные на сетевых ресурсах/совместных папках?
Да, такие рабочие книги могут использоваться как внешний источник данных. Однако редактирование удалённых рабочих книг напрямую из Aspose.Slides не поддерживается — их можно только использовать в качестве источника.
Перезаписывает ли Aspose.Slides внешний XLSX при сохранении презентации?
Презентация хранит ссылку на внешний файл. Редактирование данных диаграммы, подкреплённого ячейкой, может также обновлять связанный локальный XLSX‑файл. Используйте копию рабочей книги, если оригинал должен остаться неизменным.
Что делать, если внешний файл защищён паролем?
Aspose.Slides не принимает пароль при привязке. Обычно сначала снимают защиту или готовят расшифрованную копию (например, с помощью Aspose.Cells) и привязывают её.
Может ли несколько диаграмм ссылаться на одну и ту же внешнюю рабочую книгу?
Да. Каждая диаграмма хранит свою собственную ссылку. Если все они указывают на один и тот же файл, изменение этого файла отразится в каждой диаграмме при следующей загрузке данных.

