在 PPTX 中圖表調整大小的可行解決方案

概觀

使用 Aspose 元件在 PowerPoint 簡報中嵌入為 OLE 物件的 Excel 圖表,在第一次啟用後可能會改變大小。這會導致圖表在啟用前後的外觀產生明顯差異。本文說明產生調整大小的原因,並示範如何透過將固定圖表尺寸與 OLE 框匹配來避免此問題。

在在簡報中建立 Excel 圖表並將其嵌入為 OLE 物件,我們說明了如何使用 Aspose.Cells for PHP via Java 建立 Excel 圖表,並使用 Aspose.Slides for PHP via Java 將其嵌入 PowerPoint 簡報。為了解決物件預覽問題,我們將圖表影像指派給圖表的 OLE 物件框。

在輸出簡報中,當您雙擊顯示圖表影像的 OLE 物件框時,Excel 圖表會被啟用。使用者可以編輯嵌入的 Excel 活頁簿,然後透過點擊已啟用工作簿外部返回投影片。使用者返回投影片時,OLE 物件框的大小會變更,且調整比例會根據 OLE 物件框與嵌入的 Excel 活頁簿的原始尺寸而不同。

調整大小的原因

嵌入的 Excel 活頁簿擁有自己的視窗尺寸,Excel 會嘗試在首次啟用物件時保留該尺寸。投影片上的 OLE 框則自行定義了尺寸。當 Excel 活頁簿被啟用時,Excel 與 PowerPoint 會協商物件的大小,以在嵌入過程中保持其比例。因此,活頁簿視窗與 OLE 框之間的差異可能導致物件重新調整大小。

可行的解決方案

將圖表尺寸與投影片上的 OLE 框相匹配,且使圖表尺寸獨立於活頁簿視窗。此解決方案適用於新簡報或現有範本。

此範例需要 Aspose.Cells for PHP via Java 與 Aspose.Slides for PHP via Java。將兩個產品以相同的 PHP/Java Bridge 實例進行配置,載入兩個 PHP 包裝器,並使兩個 Java 程式庫可供 Bridge 使用。此範例不需要輸入檔案。它會在作用中的圖表工作表上建立簡單的柱狀圖,並以 XLS 格式嵌入活頁簿。未指派圖表預覽圖像;圖表會在 PowerPoint 中啟用 OLE 物件時顯示。

此範例建立一個新的簡報,使用 9.5 × 4 吋的 OLE 框,框位於左邊緣 0.5 吋、上方 1 吋處。投影片座標與尺寸以點 (每吋 72 點) 表示。若是現有簡報,請參閱使用範本。

設定固定圖表大小

將Chart::setSizeWithWindow設定為 false,使圖表尺寸與活頁簿視窗無關。透過Shape::setWidth與Shape::setHeight設定Chart::getChartObject的尺寸,並以每吋 96 像素將點轉換為像素:寬 684 × 288 點的框相當於寬 912 × 384 像素的圖表。將Chart::setPrintSize設定為PrintSizeType的 CUSTOM 值。範例使用ShapeCollection::addOleObjectFrame嵌入活頁簿,並儲存一個帶有 9.5 × 4 吋 OLE 框的簡報。

Java 數值結果在用作 PHP 索引之前會透過 java_values 轉換。將活頁簿位元組傳遞給OleEmbeddedDataInfo時,仍保持在 Java 位元組陣列中。

<?php
use aspose\cells\ChartType;
use aspose\cells\FileFormatType;
use aspose\cells\PrintSizeType;
use aspose\cells\SheetType;
use aspose\cells\Workbook;
use aspose\slides\OleEmbeddedDataInfo;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use Java as JavaObject;

$workbook = new Workbook();
try {
    $dataSheet = $workbook->getWorksheets()->get(0);
    $dataSheet->setName("Data");
    $dataSheet->getCells()->get("A1")->putValue(10);
    $dataSheet->getCells()->get("A2")->putValue(20);

    $chartSheetIndex = java_values($workbook->getWorksheets()->add(SheetType::CHART));
    $chartSheet = $workbook->getWorksheets()->get($chartSheetIndex);
    $chartIndex = java_values($chartSheet->getCharts()->add(ChartType::COLUMN, 0, 0, 20, 10));
    $chart = $chartSheet->getCharts()->get($chartIndex);
    $chart->getNSeries()->add("Data!A1:A2", true);
    $workbook->getWorksheets()->setActiveSheetIndex($chartSheetIndex);

    $presentation = new Presentation();
    try {
        $slide = $presentation->getSlides()->get_Item(0);

        // 投影片座標與尺寸以點為單位(每英吋 72 點)。
        $width = 684; // 9.5 吋。
        $height = 288; // 4 吋。

        $chart->setSizeWithWindow(false);
        // 使用每英吋 96 像素將點轉換為圖表像素。
        $chart->getChartObject()->setWidth((int)($width / 72 * 96));
        $chart->getChartObject()->setHeight((int)($height / 72 * 96));
        $chart->setPrintSize(PrintSizeType::CUSTOM);

        $workbookStream = new JavaObject("java.io.ByteArrayOutputStream");
        $workbook->save($workbookStream, FileFormatType::EXCEL_97_TO_2003);
        $workbookBytes = $workbookStream->toByteArray();
        $dataInfo = new OleEmbeddedDataInfo($workbookBytes, "xls");
        $slide->getShapes()->addOleObjectFrame(36, 72, $width, $height, $dataInfo);

        $presentation->save("chart-fixed-size.pptx", SaveFormat::Pptx);
    } finally {
        $presentation->dispose();
    }
} finally {
    $workbook->dispose();
}

使用範本

對於現有簡報,尺寸邏輯相同。若要調整範例:

  1. 載入範本簡報,而非建立空白簡報。
  2. 檢查第一張投影片是否至少包含三個形狀,然後使用索引為 2 的形狀作為佔位符。
  3. 從該形狀取得框的寬度與高度,而非使用固定值 684 與 288。保持尺寸計算不變。
  4. 在佔位符的位置加入 OLE 框,而非使用固定座標 36 與 72。
  5. 在儲存簡報前移除佔位符。

常見問題

為何嵌入的 Excel 圖表在 PowerPoint 中啟用後會改變大小?

這是因為 Excel 在首次啟用時會嘗試還原原始視窗大小,而 PowerPoint 中的 OLE 物件框則有其自行的尺寸。PowerPoint 與 Excel 會協商尺寸以維持長寬比,導致調整大小的情形。

如何保持圖表與 OLE 框的尺寸一致?

設定與 OLE 框相匹配的固定圖表尺寸,並在嵌入活頁簿前使用自訂的圖表列印大小。上述範例展示了所需的設定與單位換算。

僅匹配活頁簿視窗大小是否足夠?

僅匹配活頁簿視窗大小無法可靠地防止 OLE 框在啟用後改變尺寸。請使用如範例所示的固定圖表尺寸。

此解決方案同時適用於基於範本的簡報與新簡報嗎?

是的。對於範本,使用佔位符的尺寸與位置。對於新簡報,直接指定框的尺寸與位置。

我能將此範例用於其他試算表程式建立的圖表嗎?

此範例使用由 Aspose.Cells 建立的 Excel 活頁簿,未示範其他試算表程式的啟用行為。

相關章節