將 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 方法的重載。這些方法允許您從指定工作表的特定儲存格範圍匯入資料,並依指定座標將其作為表格加入至給定圖形集合的末端。

簡言之,這是一套輕量且直觀的 API,用於讀取 Excel 資料——正是許多開發人員在不想引入完整試算表處理函式庫時所需要的。

讓我們編寫程式碼

郵件合併情境範例

以下範例示範如何透過 Excel 活頁簿中的資料,產生多個簡報以實作簡易的郵件合併情境。

開始前,我們需要兩樣東西:

  1. 含有資料的 Excel 活頁簿

    Excel data example

  2. PowerPoint 簡報範本

    PowerPoint template example

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()

Result

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()

Result

匯入 Excel 圖表範例

此範例示範如何從先前範例使用的 Excel 活頁簿的第一張工作表匯入圖表,且圖表在最終簡報中會連結至外部活頁簿。

首先,我們在 Excel 活頁簿中依員工表格新增一個圓餅圖。

Excel Chart example

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()

Result

匯入全部 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 Table example

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()

Result

總結

此機制直接內建於 Aspose.Slides,讓您在同一個環境中同時處理 Excel 資料與簡報。它使您能在不需額外函式庫或複雜整合的情況下,建立包含視覺化圖表與 Excel 表格資料的投影片。