将 Excel 数据集成到 PowerPoint 演示文稿中

介绍

PowerPoint 演示文稿是一种展示和传达信息的强大方式。它们通常与 Excel 工作簿一起使用,其中 Excel 作为结构化数据的极佳来源,而 PowerPoint 则擅长为观众可视化这些数据。

在许多实际场景中,Excel 与 PowerPoint 的组合是必不可少的:邮件合并、填充数据表、为每条数据记录生成一张幻灯片(批量幻灯片生成)、创建培训材料以及将多个 Excel 报告合并为单个演示文稿,等等。

直到目前,使用 Aspose.Slides API 实现这些功能需要依赖像 Aspose.Cells 这样的第三方解决方案。虽然这些工具功能强大,但对于只需要基本数据集成功能的用户来说,它们可能过于复杂且成本高昂。

工作原理

为了让 Excel 数据的使用更加简便流畅,Aspose.Slides 引入了用于从 Excel 工作簿读取数据并将内容导入演示文稿的新类。该功能为希望在演示工作流中将 Excel 作为数据源的 API 用户开辟了强大的新可能性。

新功能旨在提供通用的数据访问,并未集成到演示文稿对象模型 (DOM) 中。这意味着 它不允许编辑或保存 Excel 文件 —— 它唯一的目的只是打开工作簿并在其内容中导航以检索单元格数据。

该功能的核心是全新的 ExcelDataWorkbook 类。该类允许您从本地文件或流加载 Excel 工作簿。加载后,它提供了多个 ExcelDataWorkbook.getCell 方法的重载,您可以使用这些方法按位置(例如行列索引或命名范围)检索特定单元格。

ExcelDataWorkbook.getCell 的每次调用都会返回一个 ExcelDataCell 对象。该对象代表 Excel 工作簿中的单个单元格,并以简洁直观的方式提供对其值的访问。

导入 Excel 图表

扩展功能的下一步是 ExcelWorkbookImporter 类。该实用类提供了将 Excel 工作簿内容导入演示文稿的功能。它包含多个 ExcelWorkbookImporter.addChartFromWorkbook 方法的重载,帮助您从指定的 Excel 工作簿中检索所选图表,并在指定坐标处将其添加到给定形状集合的末尾。

导入 Excel 表格

ExcelWorkbookImporter 类同样包含多个 ExcelWorkbookImporter.addTableFromWorkbook 方法的重载。这些方法允许您从指定工作表中导入指定的单元格范围,并在指定坐标处将其作为表格添加到给定形状集合的末尾。

简而言之,这是一个轻量且直接的读取 Excel 数据的 API——正是许多开发者在无需完整电子表格处理库的情况下所需的。

让我们编写代码

邮件合并场景示例

在下面的示例中,我们将通过基于存储在 Excel 工作簿中的数据生成多个演示文稿,来实现一个简单的邮件合并场景。

要开始,我们需要两样东西:

  1. 一个包含数据的 Excel 工作簿 Excel 数据示例

  2. 一个 PowerPoint 演示文稿模板 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)

    # 使用 Excel 工作簿中的数据填充 PowerPoint 表格。
    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 工作簿中添加一个饼图。

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 工作表包含一个带有员工数据的格式化表格:

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 表格形式呈现数据的幻灯片——无需任何额外库或复杂集成。