Интеграция данных Excel в презентации PowerPoint
Введение
Презентации PowerPoint — мощный способ отображать и передавать информацию. Их часто используют вместе с книгами Excel, где Excel служит отличным источником структурированных данных, а PowerPoint превосходно визуализирует эти данные для аудитории.
Существует множество практических сценариев, где сочетание Excel и PowerPoint необходимо: слияние писем, заполнение таблиц данными, генерация одного слайда на запись данных (пакетное создание слайдов), создание учебных материалов и консолидация нескольких отчетов Excel в одну презентацию, и многое другое.
До недавнего времени реализация таких функций с помощью API Aspose.Slides требовала использования сторонних решений, таких как Aspose.Cells. Хотя эти инструменты надежны, они могут быть излишне сложными и дорогими для пользователей, которым нужна только базовая интеграция данных.
Как это работает
Чтобы упростить работу с данными Excel и сделать её более удобной, Aspose.Slides представил новые классы для чтения данных из книг Excel и импорта содержимого в презентацию. Эта функция открывает мощные новые возможности для пользователей API, желающих использовать Excel в качестве источника данных в своих рабочих процессах презентаций.
Новая функциональность предназначена для общего доступа к данным и не интегрирована в объектную модель документа презентации (DOM). Это значит, она не позволяет редактировать или сохранять файлы Excel — её единственная цель — открывать книги и перемещаться по их содержимому для получения значений ячеек.
В основе этой функции лежит новый класс ExcelDataWorkbook. Этот класс позволяет загрузить книгу Excel из локального файла или потока. После загрузки он предоставляет несколько перегрузок метода ExcelDataWorkbook.getCell, с помощью которых можно получать конкретные ячейки по их позиции (например, по индексам строки и столбца или по именованным диапазонам).
Каждый вызов ExcelDataWorkbook.getCell возвращает объект ExcelDataCell. Этот объект представляет одну ячейку в книге Excel и предоставляет доступ к её значению простым и понятным способом.
Импорт диаграммы Excel
Следующим шагом расширения функциональности является класс ExcelWorkbookImporter. Этот вспомогательный класс предоставляет возможности импорта содержимого из книги Excel в презентацию. Он содержит несколько перегрузок метода ExcelWorkbookImporter.addChartFromWorkbook, которые помогают извлечь выбранную диаграмму из указанной книги Excel и добавить её в конец указанной коллекции фигур по заданным координатам.
Импорт таблицы Excel
Класс ExcelWorkbookImporter также содержит несколько перегрузок метода ExcelWorkbookImporter.addTableFromWorkbook. Эти методы позволяют импортировать указанный диапазон ячеек с указанного листа и добавить его в виде таблицы в конец указанной коллекции фигур по заданным координатам.
Короче говоря, это лёгкий и прост в использовании API для чтения данных Excel — именно то, что требуется многим разработчикам без нагрузки полной библиотеки обработки электронных таблиц.
Давайте закодируем
Пример сценария слияния писем
В следующем примере мы реализуем простой сценарий слияния писем, генерируя несколько презентаций на основе данных, хранящихся в книге Excel.
Для начала нам нужны две вещи:
-
Книга Excel, содержащая данные

-
Шаблон презентации PowerPoint

import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ExcelDataWorkbook, Presentation, SaveFormat
# Загрузите книгу Excel с данными сотрудников.
workbook = ExcelDataWorkbook("TemplateData.xlsx")
worksheet_index = 0
# Загрузите шаблон презентации.
template_presentation = Presentation("PresentationTemplate.pptx")
try:
# Переберите строки Excel (исключая заголовок в строке 0).
for row_index in range(1, 5):
# Создайте презентацию для каждой записи сотрудника.
employee_presentation = Presentation()
try:
# Удалите стандартный пустой слайд.
employee_presentation.getSlides().removeAt(0)
# Клонируйте шаблонный слайд в презентацию.
slide = employee_presentation.getSlides().addClone(template_presentation.getSlides().get_Item(0))
# Получите абзацы из целевой формы (предполагается, что используется индекс формы 1).
paragraphs = slide.getShapes().get_Item(1).getTextFrame().getParagraphs()
# Замените заполнители данными из Excel.
employee_name = str(workbook.getCell(worksheet_index, row_index, 0).getValue())
name_portion = paragraphs.get_Item(0).getPortions().get_Item(0)
name_portion.setText(str(name_portion.getText()).replace("{{EmployeeName}}", employee_name))
department = str(workbook.getCell(worksheet_index, row_index, 1).getValue())
department_portion = paragraphs.get_Item(1).getPortions().get_Item(0)
department_portion.setText(str(department_portion.getText()).replace("{{Department}}", department))
years_of_service = str(workbook.getCell(worksheet_index, row_index, 2).getValue())
years_portion = paragraphs.get_Item(2).getPortions().get_Item(0)
years_portion.setText(str(years_portion.getText()).replace("{{YearsOfService}}", years_of_service))
# Сохраните персонализированную презентацию в отдельный файл.
employee_presentation.save(f"{employee_name} Report.pptx", SaveFormat.Pptx)
finally:
employee_presentation.dispose()
finally:
template_presentation.dispose()

Пример таблицы Excel
Во втором примере мы просто копируем данные из таблицы Excel и отображаем их на слайде PowerPoint в более визуально привлекательном виде.
В этом примере мы повторно используем ту же книгу Excel из первого примера, в которой находится простая таблица сотрудников.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ExcelDataWorkbook, Presentation, SaveFormat
# Загрузите книгу Excel, содержащую данные сотрудников.
workbook = ExcelDataWorkbook("TemplateData.xlsx")
worksheet_index = 0
# Создайте презентацию PowerPoint.
presentation = Presentation()
try:
# Добавьте форму таблицы на первый слайд.
column_widths = jpype.JArray(jpype.JDouble)([200, 200, 200])
row_heights = jpype.JArray(jpype.JDouble)([30, 30, 30, 30, 30])
table = presentation.getSlides().get_Item(0).getShapes().addTable(50, 200, column_widths, row_heights)
# Заполните таблицу PowerPoint данными из книги Excel.
for row_index in range(5):
for column_index in range(3):
cell_value = str(workbook.getCell(worksheet_index, row_index, column_index).getValue())
table.getColumns().get_Item(column_index).get_Item(row_index).getTextFrame().setText(cell_value)
# Сохраните полученную презентацию в файл.
presentation.save("Table.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()

Пример импорта диаграммы Excel
В этом примере мы импортируем диаграмму с первого листа книги Excel, использованной в предыдущем примере. Диаграмма будет ссылаться на внешний файл книги в полученной презентации.
Сначала мы добавляем круговую диаграмму в книгу Excel на основе таблицы сотрудников.

import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ExcelWorkbookImporter, Presentation, SaveFormat
# Создайте презентацию PowerPoint.
presentation = Presentation()
try:
# Получите коллекцию фигур первого слайда.
shapes = presentation.getSlides().get_Item(0).getShapes()
# Импортируйте диаграмму с именем "Chart 1" с первого листа книги и добавьте её в коллекцию фигур.
ExcelWorkbookImporter.addChartFromWorkbook(shapes, 10, 10, "TemplateData.xlsx", "Sheet1", "Chart 1", False)
# Сохраните полученную презентацию в файл.
presentation.save("Chart.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()

Пример импорта всех диаграмм Excel
Представьте, что у вас есть книга Excel, заполненная диаграммами, и вам нужно импортировать их все в презентацию. Каждая диаграмма должна быть размещена на новом слайде.
Следующий код перебирает все листы исходного файла Excel, извлекает диаграммы с каждого листа и добавляет каждую диаграмму на отдельный слайд, используя пустой макет слайда. В полученной презентации будут встроены только данные диаграмм, а не вся книга.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ExcelDataWorkbook, ExcelWorkbookImporter, Presentation, SaveFormat, SlideLayoutType
# Загрузите книгу Excel, содержащую данные сотрудников.
workbook = ExcelDataWorkbook("ExcelWithCharts.xlsx")
# Создайте презентацию PowerPoint.
presentation = Presentation()
try:
# Получите макет пустого слайда.
blank_layout = presentation.getLayoutSlides().getByType(SlideLayoutType.Blank)
# Удалите стандартный слайд, чтобы результат содержал один слайд на каждую диаграмму.
presentation.getSlides().removeAt(0)
# Получите имена всех листов, содержащихся в книге Excel.
worksheet_names = workbook.getWorksheetNames()
for name in worksheet_names:
# Получите карту, сопоставляющую индексы диаграмм с их именами для листа.
worksheet_charts = workbook.getChartsFromWorksheet(name)
for chart in worksheet_charts:
# Добавьте слайд, используя пустой макет.
slide = presentation.getSlides().addEmptySlide(blank_layout)
# Импортируйте указанную диаграмму из книги Excel в коллекцию фигур слайда.
ExcelWorkbookImporter.addChartFromWorkbook(slide.getShapes(), 10, 10, workbook, name, chart.getKey(), False)
# Сохраните полученную презентацию в файл.
presentation.save("Charts.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Пример импорта таблицы Excel
В этом примере мы импортируем отформатированную таблицу с листа Excel непосредственно в презентацию PowerPoint.
Исходный лист Excel содержит отформатированную таблицу с данными сотрудников:

import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ExcelWorkbookImporter, Presentation, SaveFormat
# Создайте презентацию PowerPoint.
presentation = Presentation()
try:
# Получите первый слайд и его коллекцию фигур.
slide = presentation.getSlides().get_Item(0)
shapes = slide.getShapes()
# Импортируйте таблицу с первого листа книги и добавьте её в коллекцию фигур.
ExcelWorkbookImporter.addTableFromWorkbook(shapes, 10, 10, "TemplateData.xlsx", "Sheet1", "A1:C5")
# Сохраните полученную презентацию в файл.
presentation.save("FormattedTable.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()

Итоги
Этот механизм, доступный непосредственно в Aspose.Slides, объединяет работу с данными Excel и презентациями в одном месте. Он позволяет создавать слайды с визуальными диаграммами и данными, представленными в виде таблиц Excel, — без дополнительных библиотек или сложных интеграций.