Управление рабочими книгами диаграмм в презентациях на Android
Чтение и запись данных диаграммы из рабочей книги
Aspose.Slides предоставляет методы ReadWorkbookStream и WriteWorkbookStream , позволяющие читать и записывать рабочие книги данных диаграмм (содержащие данные диаграмм, отредактированные с помощью Aspose.Cells). Примечание: данные диаграммы должны быть организованы тем же способом или иметь структуру, похожую на исходную.
Этот код на Java демонстрирует пример операции:
Presentation pres = new Presentation("chart.pptx");
try {
Chart chart = (Chart) pres.getSlides().get_Item(0).getShapes().get_Item(0);
IChartData data = chart.getChartData();
byte[] stream = data.readWorkbookStream();
data.getSeries().clear();
data.getCategories().clear();
data.writeWorkbookStream(stream);
} finally {
if (pres != null) pres.dispose();
}
Установка ячейки рабочей книги в качестве метки данных диаграммы
- Создайте экземпляр класса Presentation .
- Получите ссылку на слайд по его индексу.
- Добавьте пузырчатую диаграмму с некоторыми данными.
- Получите доступ к сериям диаграммы.
- Установите ячейку рабочей книги в качестве метки данных.
- Сохраните презентацию.
Следующий код на Java показывает, как установить ячейку рабочей книги в качестве метки данных диаграммы:
String lbl0 = "Label 0 cell value";
String lbl1 = "Label 1 cell value";
String lbl2 = "Label 2 cell value";
// Создает объект класса презентации, представляющий файл презентации
Presentation pres = new Presentation("chart2.pptx");
try {
ISlide slide = pres.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Bubble, 50, 50, 600, 400, true);
IChartSeriesCollection series = chart.getChartData().getSeries();
IDataLabelCollection dataLabelCollection = series.get_Item(0).getLabels();
dataLabelCollection.getDefaultDataLabelFormat().setShowLabelValueFromCell(true);
IChartDataWorkbook wb = chart.getChartData().getChartDataWorkbook();
dataLabelCollection.get_Item(0).setValueFromCell(wb.getCell(0, "A10", lbl0));
dataLabelCollection.get_Item(1).setValueFromCell(wb.getCell(0, "A11", lbl1));
dataLabelCollection.get_Item(2).setValueFromCell(wb.getCell(0, "A12", lbl2));
pres.save("resultchart.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Управление листами рабочей книги
Этот код на Java демонстрирует операцию, в которой метод IChartDataWorkbook.Worksheets используется для доступа к коллекции листов:
Presentation pres = new Presentation();
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 500);
IChartDataWorkbook wb = chart.getChartData().getChartDataWorkbook();
for (int i = 0; i < wb.getWorksheets().size(); i++)
System.out.println(wb.getWorksheets().get_Item(i).getName());
} finally {
if (pres != null) pres.dispose();
}
Указание типа источника данных
Этот код на Java показывает, как указать тип для источника данных:
Presentation pres = new Presentation();
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Column3D, 50, 50, 600, 400, true);
IStringChartValue val = chart.getChartData().getSeries().get_Item(0).getName();
val.setDataSourceType(DataSourceType.StringLiterals);
val.setData("LiteralString");
val = chart.getChartData().getSeries().get_Item(1).getName();
val.setData(chart.getChartData().getChartDataWorkbook().getCell(0, "B1", "NewCell"));
pres.save("pres.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Обнаружение неподдерживаемых форматов встроенных рабочих книг
Aspose.Slides не поддерживает бинарный формат рабочей книги Excel (.xlsb), который может быть встроен в некоторые диаграммы. Вы можете использовать метод getEmbeddedWorkbookType интерфейса IChartData вместе с перечислением WorkbookType для обнаружения неподдерживаемых форматов и пропускать такие диаграммы.
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();
if (chartData.getDataSourceType() == ChartDataSourceType.InternalWorkbook &&
chartData.getEmbeddedWorkbookType() == WorkbookType.WorkbookBinaryMacro) {
// Встроенная рабочая книга в формате .xlsb, который не поддерживается.
continue;
}
// Читайте или изменяйте данные рабочей книги диаграммы здесь.
}
} finally {
presentation.dispose();
}
Внешняя рабочая книга
Aspose.Slides поддерживает внешние рабочие книги в качестве источника данных для диаграмм.
Создание внешней рабочей книги
С помощью методов readWorkbookStream и setExternalWorkbook вы можете либо создать внешнюю рабочую книгу с нуля, либо сделать внутреннюю рабочую книгу внешней.
Этот код на Java демонстрирует процесс создания внешней рабочей книги:
Presentation pres = new Presentation();
try {
final String workbookPath = "externalWorkbook1.xlsx";
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600);
FileOutputStream fileStream = new FileOutputStream(workbookPath);
try {
byte[] workbookData = chart.getChartData().readWorkbookStream();
fileStream.write(workbookData, 0, workbookData.length);
} finally {
if (fileStream != null) fileStream.close();
}
chart.getChartData().setExternalWorkbook(workbookPath);
pres.save("externalWorkbook.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Установка внешней рабочей книги
С помощью метода setExternalWorkbook вы можете назначить внешнюю рабочую книгу диаграмме в качестве её источника данных. Этот метод также может использоваться для обновления пути к внешней рабочей книге (если она была перемещена).
Хотя вы не можете редактировать данные в рабочих книгах, хранящихся в удаленных местах или ресурсах, их всё равно можно использовать как внешний источник данных. Если указать относительный путь к внешней рабочей книге, он автоматически преобразуется в полный путь.
Этот код на Java показывает, как установить внешнюю рабочую книгу:
// Создает экземпляр класса Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, false);
IChartData chartData = chart.getChartData();
chartData.setExternalWorkbook("externalWorkbook.xlsx");
chartData.getSeries().add(chartData.getChartDataWorkbook().getCell(0, "B1"), ChartType.Pie);
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B2"));
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B3"));
chartData.getSeries().get_Item(0).getDataPoints().addDataPointForPieSeries(chartData.getChartDataWorkbook().getCell(0, "B4"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A2"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A3"));
chartData.getCategories().add(chartData.getChartDataWorkbook().getCell(0, "A4"));
pres.save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Параметр ChartData (в методе setExternalWorkbook) используется для указания, будет ли загружена Excel‑рабочая книга.
- Когда значение
ChartDataустановлено вfalse, обновляется только путь к рабочей книге — данные диаграммы не будут загружаться и не будут обновляться из целевой рабочей книги. Этот параметр полезен, когда целевая рабочая книга отсутствует или недоступна. - Когда значение
ChartDataустановлено вtrue, данные диаграммы обновляются из целевой рабочей книги.
// Создает экземпляр класса Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = pres.getSlides().get_Item(0).getShapes().addChart(ChartType.Pie, 50, 50, 400, 600, true);
IChartData chartData = chart.getChartData();
((ChartData)chartData).setExternalWorkbook("http://path/doesnt/exists", false);
pres.save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Получение пути к внешней рабочей книге источника данных диаграммы
- Создайте экземпляр класса Presentation .
- Получите ссылку на слайд по его индексу.
- Создайте объект для формы диаграммы.
- Создайте объект типа источника (
ChartDataSourceType), представляющего источник данных диаграммы. - Укажите соответствующее условие, исходя из того, что тип источника совпадает с типом внешней рабочей книги.
Этот код на Java демонстрирует операцию:
// Создает экземпляр класса Presentation
Presentation pres = new Presentation("chart.pptx");
try {
ISlide slide = pres.getSlides().get_Item(1);
IChart chart = (IChart)slide.getShapes().get_Item(0);
int sourceType = chart.getChartData().getDataSourceType();
if (sourceType == ChartDataSourceType.ExternalWorkbook)
{
String path = chart.getChartData().getExternalWorkbookPath();
}
// Сохраняет презентацию
pres.save("result.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Редактирование данных диаграммы
Вы можете редактировать данные во внешних рабочих книгах так же, как вносите изменения в содержимое внутренних книг. Если внешнюю рабочую книгу невозможно загрузить, генерируется исключение.
Этот код на Java реализует описанный процесс:
// Создает экземпляр класса Presentation
Presentation pres = new Presentation("chart.pptx");
try {
IChart chart = (IChart)pres.getSlides().get_Item(0).getShapes().get_Item(0);
ChartData chartData = (ChartData)chart.getChartData();
chartData.getSeries().get_Item(0).getDataPoints().get_Item(0).getValue().getAsCell().setValue(100);
pres.save("presentation_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Часто задаваемые вопросы
Могу ли я определить, связана ли конкретная диаграмма с внешней или встроенной рабочей книгой?
Да. У диаграммы есть тип источника данных и путь к внешней рабочей книге; если источник — внешняя рабочая книга, вы можете прочитать полный путь, чтобы убедиться, что используется внешний файл.
Поддерживаются ли относительные пути к внешним рабочим книгам и как они хранятся?
Да. Если указать относительный путь, он автоматически преобразуется в абсолютный. Это удобно для переносимости проекта, однако следует учитывать, что презентация хранит абсолютный путь в файле PPTX.
Могу ли я использовать рабочие книги, расположенные в сетевых ресурсах/общих папках?
Да, такие рабочие книги могут использоваться как внешний источник данных. Однако редактирование удалённых рабочих книг напрямую из Aspose.Slides не поддерживается — их можно только использовать как источник.
Перезаписывает ли Aspose.Slides внешний файл XLSX при сохранении презентации?
Нет. Презентация хранит ссылку на внешний файл и использует её для чтения данных. Сам внешний файл не изменяется при сохранении презентации.
Что делать, если внешний файл защищён паролем?
Aspose.Slides не принимает пароль при привязке. Обычно защищённость снимают заранее или подготавливают дешифрованную копию (например, с помощью Aspose.Cells) и привязывают её.
Могут ли несколько диаграмм ссылаться на одну и ту же внешнюю рабочую книгу?
Да. Каждая диаграмма хранит свою собственную ссылку. Если они указывают на один и тот же файл, обновление этого файла отразится во всех диаграммах при следующей загрузке данных.