Управление рабочими книгами диаграмм в презентациях с использованием JavaScript
Обзор
Эта статья объясняет, как работать с рабочими книгами диаграмм в Aspose.Slides. Она показывает, как читать и записывать данные диаграммы через потоки рабочей книги, использовать ячейки рабочей книги в качестве меток данных диаграммы, получать доступ к коллекциям листов и задавать тип источника данных для значений диаграммы.
Она также охватывает работу с внешними рабочими книгами в качестве источников данных для диаграмм. Примеры демонстрируют, как создать и назначить внешнюю рабочую книгу, получить путь к внешней рабочей книге, связанной с диаграммой, и редактировать данные диаграммы, когда рабочая книга доступна.
Для ячеек рабочей книги, представляющих отсутствующие данные, см. Управление отображением пустых ячеек для различий между пустой ячейкой и нулём, а также сравнение линейных диаграмм доступных режимов отображения.
Включать данные из скрытых строк и колонок
Используйте Chart.setPlotVisibleCellsOnly для контроля того, будет ли диаграмма строить данные из скрытых строк и колонок листа. Установите значение true, чтобы строить только видимые ячейки, или false, чтобы включать и видимые, и скрытые ячейки. Эта настройка управляет построением диаграммы; она не скрывает и не раскрывает строки или колонки листа.
Пример презентации (sample presentation) содержит столбчатую диаграмму как первую форму на первом слайде. Встроенный лист Sheet1 имеет диапазон источника A1:C4. Строка 3 и колонка C скрыты, но их ячейки всё равно содержат значения.
| Worksheet row | A: Month | B: Retail | C: Wholesale (hidden column) |
|---|---|---|---|
| 2 | Январь | 10 | 30 |
| 3 (скрытая строка) | Февраль | 40 | 60 |
| 4 | Март | 20 | 50 |
Получайте исходные ячейки через ChartData.getChartDataWorkbook и читайте ChartDataCell.isHidden для проверки их статуса скрытия. Этот метод сообщает статус скрытия без его изменения. В данном файле B2 видима, B3 принадлежит скрытой строке, а C2 — скрытой колонке; пример выводит false, true и true соответственно.
Для этого примера обновите данные диаграммы после изменения настройки построения: сохраните встроенную рабочую книгу с помощью readWorkbookStream и загрузите её с помощью writeWorkbookStream. При включении всех ячеек также используйте setRange для восстановления полного диапазона, включая скрытую категорию февраля. Просто изменение флага недостаточно для обновления кэшированных данных диаграммы и меток категорий в этом примере. Пример преобразует полученный буфер Node.js в массив байтов Java перед передачей его в метод записи.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("hidden-source-data.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shapeCount = slide.getShapes().size();
if (shapeCount > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const workbook = chart.getChartData().getChartDataWorkbook();
console.log("B2 hidden: " + workbook.getCell(0, "B2").isHidden());
console.log("B3 hidden: " + workbook.getCell(0, "B3").isHidden());
console.log("C2 hidden: " + workbook.getCell(0, "C2").isHidden());
const workbookBuffer = chart.getChartData().readWorkbookStream();
const workbookBytes = Array.from(workbookBuffer);
const workbookData = java.newArray("byte", workbookBytes);
for (const visibleOnly of [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", aspose.slides.SaveFormat.Pptx);
}
} else {
console.log("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Пример сохраняет две версии презентации: одну только с видимыми значениями розницы (10 и 20), другую со всеми шестью значениями. Ниже показаны два режима построения. Строка 3 и колонка C остаются скрытыми в обеих встроенных рабочих книгах.
Только видимые ячейки (true) |
Все ячейки (false) |
|---|---|
![]() |
![]() |
Скрытая ячейка, содержащая значение, отличается от пустой ячейки. Chart.setDisplayBlanksAs управляет тем, как отображаются отсутствующие значения; она не включает и не исключает скрытые исходные данные. См. Управление отображением пустых ячеек для примера.
Получить диапазон данных диаграммы
Перед обновлением данных рабочей книги в существующей презентации проверьте исходные диапазоны, чтобы определить, какие ячейки листа использует каждая диаграмма. Метод ChartData.getRange возвращает текущий диапазон данных как формулу, квалифицированную листом, например Sheet1!$A$1:$D$5. Здесь Sheet1 — имя листа, ! разделяет его от диапазона ячеек, а $A$1:$D$5 указывают ячейки от A1 до D5 включительно. Символы $ обозначают абсолютные ссылки на строки и столбцы.
Метод читает текущий диапазон без изменения диаграммы или её рабочей книги. Если диаграмма не использует рабочую книгу в качестве источника данных, будет выброшено InvalidOperationException. Подробнее см. в ChartData API Reference.
В этом примере открывается презентация и проверяются формы непосредственно на каждом слайде на предмет диаграмм. Выводится имя каждой диаграммы и её исходный диапазон. Если диаграмма не использует рабочую книгу, выводится сообщение и переход к следующей диаграмме.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
for (let slideIndex = 0; slideIndex < presentation.getSlides().size(); slideIndex++) {
const slide = presentation.getSlides().get_Item(slideIndex);
for (let shapeIndex = 0; shapeIndex < slide.getShapes().size(); shapeIndex++) {
const shape = slide.getShapes().get_Item(shapeIndex);
if (java.instanceOf(shape, "com.aspose.slides.IChart")) {
const chart = shape;
try {
const range = chart.getChartData().getRange();
console.log(chart.getName() + ": " + range);
} catch (exception) {
if (exception.cause && java.instanceOf(exception.cause, "com.aspose.slides.exceptions.InvalidOperationException")) {
console.log(chart.getName() + ": The chart does not use a workbook as its data source.");
} else {
console.log(chart.getName() + ": Could not retrieve the data range: " + exception.message);
}
}
}
}
}
} finally {
presentation.dispose();
}
Чтение и запись данных диаграммы из рабочей книги
Aspose.Slides for Node.js via Java предоставляет методы readWorkbookStream и writeWorkbookStream, позволяющие читать и записывать рабочие книги данных диаграммы (содержащие данные, отредактированные в Aspose.Cells). Примечание: данные диаграммы должны быть организованы одинаково или иметь структуру, аналогичную исходной.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("chart.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shapeCount = slide.getShapes().size();
if (shapeCount > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const chartData = chart.getChartData();
const workbookBuffer = chartData.readWorkbookStream();
const workbookBytes = Array.from(workbookBuffer);
const workbookData = java.newArray("byte", workbookBytes);
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
} else {
console.log("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Проверка макета диаграммы после изменения рабочей книги
Когда вы заменяете встроенную рабочую книгу модифицированной, диаграмма сохраняет свои исходные коллекции серий и категорий. Такое несоответствие может привести к ошибке при вызове Chart.validateChartLayout с ошибкой «index-out-of-range». Очистите существующие серии и категории перед записью обновлённой рабочей книги обратно в диаграмму. В примере используется диаграмма, первая форма на первом слайде. Комментарий отмечает место, где будет происходить редактирование рабочей книги; исполняемый пример записывает оригинальную рабочую книгу назад и проверяет макет в памяти.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("chart.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shapeCount = slide.getShapes().size();
if (shapeCount > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const chartData = chart.getChartData();
const workbookBuffer = chartData.readWorkbookStream();
const workbookBytes = Array.from(workbookBuffer);
const workbookData = java.newArray("byte", workbookBytes);
// Измените байты рабочей книги здесь, например, с помощью Aspose.Cells.
chartData.getSeries().clear();
chartData.getCategories().clear();
chartData.writeWorkbookStream(workbookData);
chart.validateChartLayout();
} else {
console.log("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Очистка коллекций удаляет устаревшие ссылки данных перед записью рабочей книги. Перед использованием диаграммы восстановите любые необходимые сопоставления серий и категорий для обновлённой рабочей книги.
Установить пользовательские числовые форматы для ячеек рабочей книги
Используйте ChartDataCell.setCustomNumberFormat для контроля того, как числовые значения отображаются в встроенной рабочей книге диаграммы. Например, в отчёте может потребоваться показывать коэффициент конверсии в виде процента с четырьмя знаками после запятой и коэффициент с пятью знаками после запятой. Оставьте оба значения числовыми, чтобы они оставались доступными для вычислений и построения диаграмм.
Числовой формат меняет только отображение, а не сохранённое значение. Формат 0.0000% отображает 0.125 как 12.5000%; он не заменяет сохранённое число на 12.5. Аналогично, 0.00000 отображает 0.1234567 как 0.12346 без округления сохранённого значения. Если пользовательский формат — пустая строка (""), используется формат, возвращённый getPresetNumberFormat.
Следующий пример создаёт столбчатую диаграмму и получает доступ к её ячейкам через getChartDataWorkbook. На листе 0 ячейка B2 содержит коэффициент конверсии, а C2 — коэффициент. Обе ячейки поставляют значения для диаграммы. Пример также включает метки значений, привязанные к исходным форматам.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
presentation.getSlideSize().setSize(720, 270, aspose.slides.SlideSizeScaleType.DoNotScale);
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.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();
const workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
const categoryCell = workbook.getCell(0, "A2", "Sample");
chart.getChartData().getCategories().add(categoryCell);
const percentageCell = workbook.getCell(0, "B2", 0.125);
percentageCell.setCustomNumberFormat("0.0000%");
const percentageName = workbook.getCell(0, "B1", "Conversion rate");
const percentageSeries = chart.getChartData().getSeries().add(percentageName, chart.getType());
percentageSeries.getDataPoints().addDataPointForBarSeries(percentageCell);
const precisionCell = workbook.getCell(0, "C2", 0.1234567);
precisionCell.setCustomNumberFormat("0.00000");
const precisionName = workbook.getCell(0, "C1", "Coefficient");
const precisionSeries = chart.getChartData().getSeries().add(precisionName, chart.getType());
precisionSeries.getDataPoints().addDataPointForBarSeries(precisionCell);
for (let seriesIndex = 0; seriesIndex < chart.getChartData().getSeries().size(); seriesIndex++) {
const series = chart.getChartData().getSeries().get_Item(seriesIndex);
const labelFormat = series.getDataPoints().get_Item(0).getLabel().getDataLabelFormat();
labelFormat.setShowValue(true);
labelFormat.setNumberFormatLinkedToSource(true);
}
presentation.save("CustomCellFormats.pptx", aspose.slides.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 для первых трёх меток первой серии, включаются метки из ячеек и сохраняется обновлённая презентация.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation("chart2.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Bubble, 50, 50, 600, 400, true);
const series = chart.getChartData().getSeries().get_Item(0);
const 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", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Управление листами
Метод ChartDataWorkbook.getWorksheets предоставляет доступ к листам в рабочей книге диаграммы. Этот пример создаёт круговую диаграмму с данными по умолчанию и выводит имена каждого листа в консоль.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 500);
const workbook = chart.getChartData().getChartDataWorkbook();
for (let i = 0; i < workbook.getWorksheets().size(); i++) {
console.log(workbook.getWorksheets().get_Item(i).getName());
}
} finally {
presentation.dispose();
}
Указать тип источника данных
Значения точек серии также могут храниться напрямую как числовые литералы. См. Установка значений серии с использованием числовых литералов для полного примера, сохраняющего и читающего их. Тип источника точек отличается от внутренней или внешней конфигурации рабочей книги диаграммы; использование числовых литералов само по себе не удаляет встроенную рабочую книгу.
В этом примере создаётся 3D‑столбчатая диаграмма с данными по умолчанию и задаются два имени серии, используя разные источники данных. Первое имя задаётся строковым литералом; второе — ячейкой C1 на листе 0. Перечисление DataSourceType выбирает источник для каждого имени. Пример сохраняет презентацию с обновлёнными именами серий.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Column3D, 50, 50, 600, 400, true);
const literalName = chart.getChartData().getSeries().get_Item(0).getName();
literalName.setDataSourceType(aspose.slides.DataSourceType.StringLiterals);
literalName.setData("LiteralString");
const cellName = chart.getChartData().getSeries().get_Item(1).getName();
const nameCell = chart.getChartData().getChartDataWorkbook().getCell(0, "C1", "NewCell");
cellName.setDataSourceType(aspose.slides.DataSourceType.Worksheet);
cellName.setData(nameCell);
presentation.save("pres.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Обнаружение неподдерживаемых форматов внедрённых рабочих книг
Aspose.Slides не поддерживает формат бинарной рабочей книги Excel (.xlsb), который может быть внедрён в некоторых диаграммах. Вы можете использовать метод getEmbeddedWorkbookType на объекте ChartData вместе с перечислением WorkbookType для определения неподдерживаемых форматов и пропуска соответствующих диаграмм. Этот пример проверяет формы на первом слайде существующей презентации, пропускает формы, не являющиеся диаграммами, и выводит диагностическое сообщение для каждой диаграммы с внедрённой рабочей книгой .xlsb.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("sample.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
for (let shapeIndex = 0; shapeIndex < slide.getShapes().size(); shapeIndex++) {
const shape = slide.getShapes().get_Item(shapeIndex);
if (!(java.instanceOf(shape, "com.aspose.slides.IChart"))) {
continue;
}
const chart = shape;
const chartData = chart.getChartData();
const isInternalWorkbook = chartData.getDataSourceType() == aspose.slides.ChartDataSourceType.InternalWorkbook;
const isBinaryMacro = chartData.getEmbeddedWorkbookType() == aspose.slides.WorkbookType.WorkbookBinaryMacro;
if (isInternalWorkbook && isBinaryMacro) {
console.log("Skipping a chart with an unsupported .xlsb workbook.");
continue;
}
// Прочитать или изменить поддерживаемые данные рабочей книги диаграммы здесь.
}
} finally {
presentation.dispose();
}
Внешняя рабочая книга
Aspose.Slides поддерживает использование внешних рабочих книг в качестве источника данных для диаграмм.
Создать внешнюю рабочую книгу
Используйте readWorkbookStream и setExternalWorkbook для экспорта встроенной рабочей книги диаграммы в файл и привязки диаграммы к этой внешней рабочей книге.
В этом примере создаётся круговая диаграмма с данными по умолчанию и экспортируется её рабочая книга. Запись в файл завершается перед назначением внешней рабочей книги в качестве источника данных диаграммы, затем сохраняется связанная презентация.
const aspose = { slides: require("aspose.slides.via.java") };
const path = require("path");
const fileSystem = require("fs");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600);
const workbookPath = path.resolve("externalWorkbook1.xlsx");
const workbookData = chart.getChartData().readWorkbookStream();
try {
fileSystem.writeFileSync(workbookPath, Buffer.from(workbookData));
chart.getChartData().setExternalWorkbook(workbookPath);
presentation.save("externalWorkbook.pptx", aspose.slides.SaveFormat.Pptx);
} catch (exception) {
console.log("Could not write the external workbook: " + exception.message);
}
} finally {
presentation.dispose();
}
Назначить внешнюю рабочую книгу
С помощью метода setExternalWorkbook можно назначить внешнюю рабочую книгу диаграмме в качестве её источника данных. Этот метод также может использоваться для обновления пути к внешней рабочей книге (если файл был перемещён).
Хотя редактировать данные в рабочих книгах, хранящихся в удалённых местах или ресурсах, нельзя, такие книги всё равно могут использоваться как внешний источник данных. Если указан относительный путь к внешней рабочей книге, он автоматически преобразуется в абсолютный путь.
В примере используется внешняя рабочая книга, лист которой Sheet1 содержит имя серии в B1, имена категорий в A2:A4 и числовые значения в B2:B4. Пример создаёт круговую диаграмму, привязывает рабочую книгу и с помощью setRange сопоставляет диапазон A1:B4 с одной серией и тремя категориями. Затем сохраняется презентация со связанной диаграммой.
const aspose = { slides: require("aspose.slides.via.java") };
const path = require("path");
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600, true);
const chartData = chart.getChartData();
const workbookPath = path.resolve("externalWorkbook.xlsx");
chartData.setExternalWorkbook(workbookPath);
chartData.setRange("Sheet1!$A$1:$B$4");
presentation.save("Presentation_with_externalWorkbook.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Параметр updateChartData метода setExternalWorkbook управляет тем, будет ли загружена рабочая книга.
- Когда
updateChartData—false, обновляется только путь к рабочей книге. Данные диаграммы не загружаются и не обновляются из целевой рабочей книги, поэтому рабочая книга может быть недоступна. - Когда
updateChartData—true, данные диаграммы обновляются из целевой рабочей книги.
В следующем примере задаётся заполнитель URL с updateChartData, установленным в false. Диаграмма сохраняет данные по умолчанию и презентация сохраняется без загрузки недоступной рабочей книги.
const aspose = { slides: require("aspose.slides.via.java") };
const presentation = new aspose.slides.Presentation();
try {
const slide = presentation.getSlides().get_Item(0);
const chart = slide.getShapes().addChart(aspose.slides.ChartType.Pie, 50, 50, 400, 600, true);
chart.getChartData().setExternalWorkbook("https://example.com/unavailable-workbook.xlsx", false);
presentation.save("SetExternalWorkbookWithUpdateChartData.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Получить путь к внешней рабочей книге, используемой диаграммой
Чтобы определить, к какой рабочей книге привязана диаграмма, проверьте, использует ли диаграмма внешний источник данных, и получите её путь к рабочей книге.
В этом примере проверяется первая форма на первом слайде презентации с привязанной внешней рабочей книгой. Если это диаграмма, связанная с внешней рабочей книгой, пример выводит getExternalWorkbookPath в консоль. Затем сохраняется копия презентации.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("externalWorkbook.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
if (slide.getShapes().size() > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const chartData = chart.getChartData();
if (chartData.getDataSourceType() == aspose.slides.ChartDataSourceType.ExternalWorkbook) {
console.log(chartData.getExternalWorkbookPath());
} else {
console.log("The chart does not use an external workbook.");
}
} else {
console.log("The first shape is not a chart.");
}
presentation.save("Result.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Редактировать данные диаграммы
Можно изменять данные во внешних рабочих книгах так же, как меняете содержимое внутренних рабочих книг. Если внешняя рабочая книга не может быть загружена, будет выброшено исключение.
В этом примере используется диаграмма, первая форма на первом слайде, привязанная к доступной внешней рабочей книге. Значение первой точки данных первой серии задаётся равным 100, и сохраняется обновлённая презентация. При редактировании значений ячеек можно обновлять связанный внешний файл XLSX, поэтому используйте копию, если необходимо сохранить оригинальную рабочую книгу.
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const presentation = new aspose.slides.Presentation("presentation.pptx");
try {
const slide = presentation.getSlides().get_Item(0);
const shapeCount = slide.getShapes().size();
if (shapeCount > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const series = chart.getChartData().getSeries();
if (series.size() > 0 && series.get_Item(0).getDataPoints().size() > 0) {
const valueCell = series.get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell();
if (valueCell != null) {
valueCell.setValue(100);
presentation.save("presentation_out.pptx", aspose.slides.SaveFormat.Pptx);
} else {
console.log("The first data point is not linked to a workbook cell.");
}
} else {
console.log("The chart has no data points to edit.");
}
} else {
console.log("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Восстановить рабочую книгу из кеша диаграммы
Если диаграмма использует внешнюю рабочую книгу, которой нет или она недоступна, Aspose.Slides может восстановить рабочую книгу диаграммы из кэшированных данных в презентации. Создайте LoadOptions, вызовите LoadOptions.setSpreadsheetOptions, и установите SpreadsheetOptions.setRecoverWorkbookFromChartCache в true перед открытием презентации.
Следующий пример JavaScript восстанавливает данные рабочей книги для диаграммы, первая форма на первом слайде, которая ссылается на недоступную внешнюю рабочую книгу. Доступ к восстановленным данным осуществляется через Chart.getChartData и ChartData.getChartDataWorkbook:
const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");
const spreadsheetOptions = new aspose.slides.SpreadsheetOptions();
spreadsheetOptions.setRecoverWorkbookFromChartCache(true);
const loadOptions = new aspose.slides.LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);
const presentation = new aspose.slides.Presentation("presentation.pptx", loadOptions);
try {
const slide = presentation.getSlides().get_Item(0);
const shapeCount = slide.getShapes().size();
if (shapeCount > 0 && java.instanceOf(slide.getShapes().get_Item(0), "com.aspose.slides.IChart")) {
const chart = slide.getShapes().get_Item(0);
const recoveredWorkbook = chart.getChartData().getChartDataWorkbook();
// Прочитать или изменить восстановленные данные рабочей книги здесь.
} else {
console.log("The first shape is not a chart.");
}
} finally {
presentation.dispose();
}
Если внешняя рабочая книга недоступна и восстановление отключено, Aspose.Slides выбрасывает исключение. Включайте восстановление только тогда, когда использование кэшированных данных диаграммы приемлемо, потому что кеш может не содержать изменений, внесённых во внешнюю рабочую книгу после последнего обновления презентации.
FAQ
Могу ли я определить, связана ли конкретная диаграмма с внешней или встроенной рабочей книгой?
Да. У диаграммы есть тип источника данных и путь к внешней рабочей книге; если источником является внешняя рабочая книга, вы можете прочитать полный путь, чтобы убедиться, что используется внешний файл.
Поддерживаются ли относительные пути к внешним рабочим книгам и как они хранятся?
Да. Если указать относительный путь, он автоматически преобразуется в абсолютный. Презентация сохраняет абсолютный путь в файле PPTX, поэтому перемещение рабочей книги может потребовать обновления ссылки.
Можно ли использовать рабочие книги, расположенные на сетевых ресурсах/общих папках?
Да, такие рабочие книги могут использоваться как внешний источник данных. Однако прямое редактирование удалённых рабочих книг из Aspose.Slides не поддерживается — они могут использоваться только как источник.
Перезаписывает ли Aspose.Slides внешний XLSX при сохранении презентации?
Презентация хранит ссылку на внешний файл. Редактирование данных, основанных на ячейках, может также обновлять связанный локальный файл XLSX. Используйте копию рабочей книги, если оригинал должен оставаться неизменным.
Что делать, если внешний файл защищён паролем?
Aspose.Slides не принимает пароль при привязке. Обычно решают эту проблему, снимая защиту заранее или подготовив расшифрованную копию (например, с помощью Aspose.Cells) и привязываясь к этой копии.
Могут ли несколько диаграмм ссылаться на одну и ту же внешнюю рабочую книгу?
Да. Каждая диаграмма хранит свою собственную ссылку. Если все они указывают на один и тот же файл, обновление этого файла отразится в каждой диаграмме при следующей загрузке данных.

