使用 PHP 管理簡報中的表格儲存格

概觀

Aspose.Slides 允許您在 PowerPoint 簡報中存取與修改表格儲存格。本文說明如何識別合併的表格儲存格、移除儲存格邊框、在合併或拆分儲存格後處理儲存格編號、變更儲存格的背景顏色,以及在表格儲存格內加入圖片。示例展示了如何建立或開啟簡報、從投影片取得表格、透過儲存格屬性更新儲存格格式,並將修改後的簡報儲存為 PPTX 檔案。

識別合併的表格儲存格

  1. 建立 Presentation 類別的實例。
  2. 從第一張投影片取得表格。
  3. 遍歷表格的列與欄,以尋找合併的儲存格。
  4. 當找到合併的儲存格時列印訊息。

以下 PHP 程式碼示範如何在簡報中識別合併的表格儲存格:

  $pres = new Presentation("SomePresentationWithTable.pptx");
  try {
    $table = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);// 假設 Slide#0.Shape#0 是一個表格

    for($i = 0; $i < java_values($table->getRows()->size()) ; $i++) {
      for($j = 0; $j < java_values($table->getColumns()->size()) ; $j++) {
        $currentCell = $table->getRows()->get_Item($i)->get_Item($j);
        if ($currentCell->isMergedCell()) {
          echo(sprintf("Cell %d;%d is a part of merged cell with RowSpan=%d and ColSpan=%d starting from Cell %d;%d.", $i, $j, $currentCell->getRowSpan(), $currentCell->getColSpan(), $currentCell->getFirstRowIndex(), $currentCell->getFirstColumnIndex()));
        }
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

移除表格儲存格邊框

  1. 建立 Presentation 類別的實例。
  2. 透過索引取得投影片的參照。
  3. 定義具有寬度的欄位陣列。
  4. 定義具有高度的列陣列。
  5. 使用 addTable 方法將表格加入投影片。
  6. 遍歷每個儲存格,清除上、下、右、左邊框。
  7. 將修改後的簡報儲存為 PPTX 檔案。

以下 PHP 程式碼示範如何移除表格儲存格的邊框:

  # 實例化代表 PPTX 檔案的 Presentation 類別
  $pres = new Presentation();
  try {
    # 取得第一張投影片
    $sld = $pres->getSlides()->get_Item(0);
    # 定義具有寬度的欄位與具有高度的列
    $dblCols = array(50, 50, 50, 50 );
    $dblRows = array(50, 30, 30, 30, 30 );
    # 將表格形狀新增至投影片
    $tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    # 為每個儲存格設定邊框格式
    foreach($tbl->getRows() as $row) {
      foreach($row as $cell) {
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->setFillType(FillType::NoFill);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->setFillType(FillType::NoFill);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->setFillType(FillType::NoFill);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->setFillType(FillType::NoFill);
      }
    }
    # 將 PPTX 寫入磁碟
    $pres->save("table_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

合併儲存格的編號

如果我們合併兩組儲存格 (1, 1) x (2, 1) 與 (1, 2) x (2, 2),則產生的表格會被編號。以下 PHP 程式碼示範此過程:

  # 實例化代表 PPTX 檔案的 Presentation 類別
  $pres = new Presentation();
  try {
    # 取得第一張投影片
    $sld = $pres->getSlides()->get_Item(0);
    # 定義具有寬度的欄位與具有高度的列
    $dblCols = array(70, 70, 70, 70 );
    $dblRows = array(70, 70, 70, 70 );
    # 將表格形狀新增至投影片
    $tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    # 為每個儲存格設定邊框格式
    foreach($tbl->getRows() as $row) {
      foreach($row as $cell) {
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderTop()->setWidth(5);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderBottom()->setWidth(5);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderLeft()->setWidth(5);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderRight()->setWidth(5);
      }
    }
    # 合併儲存格 (1, 1) x (2, 1)
    $tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
    # 合併儲存格 (1, 2) x (2, 2)
    $tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
    $pres->save("MergeCells_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

接著我們進一步合併 (1, 1) 與 (1, 2) 兩個儲存格。結果是表格中心出現一個大型合併儲存格:

  # 實例化代表 PPTX 檔案的 Presentation 類別
  $pres = new Presentation();
  try {
    # 取得第一張投影片
    $sld = $pres->getSlides()->get_Item(0);
    # 定義具有寬度的欄位與具有高度的列
    $dblCols = array(70, 70, 70, 70 );
    $dblRows = array(70, 70, 70, 70 );
    # 將表格形狀新增至投影片
    $tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    # 為每個儲存格設定邊框格式
    foreach($tbl->getRows() as $row) {
      foreach($row as $cell) {
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderTop()->setWidth(5);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderBottom()->setWidth(5);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderLeft()->setWidth(5);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderRight()->setWidth(5);
      }
    }
    # 合併儲存格 (1, 1) x (2, 1)
    $tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
    # 合併儲存格 (1, 2) x (2, 2)
    $tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
    # 合併儲存格 (1, 1) x (1, 2)
    $tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(1, 2), true);
    # 將 PPTX 檔案寫入磁碟
    $pres->save("MergeCells_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

分割儲存格的編號

在先前的範例中,當表格儲存格合併時,其他儲存格的編號系統不會改變。
這次,我們使用一個普通表格(未包含合併儲存格的表格),然後嘗試將儲存格 (1,1) 拆分,得到一個特殊的表格。您可能需要注意此表格的編號方式,這看起來可能有點奇怪。然而,這正是 Microsoft PowerPoint 為表格儲存格編號的方式,Aspose.Slides 亦然。

以下 PHP 程式碼示範我們所描述的過程:

  # 實例化代表 PPTX 檔案的 Presentation 類別
  $pres = new Presentation();
  try {
    # 取得第一張投影片
    $sld = $pres->getSlides()->get_Item(0);
    # 定義具有寬度的欄位與具有高度的列
    $dblCols = array(70, 70, 70, 70 );
    $dblRows = array(70, 70, 70, 70 );
    # 將表格形狀新增至投影片
    $tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    # 為每個儲存格設定邊框格式
    foreach($tbl->getRows() as $row) {
      foreach($row as $cell) {
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderTop()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderTop()->setWidth(5);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderBottom()->setWidth(5);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderLeft()->setWidth(5);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
        $cell->getCellFormat()->getBorderRight()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cell->getCellFormat()->getBorderRight()->setWidth(5);
      }
    }
    # 合併儲存格 (1, 1) x (2, 1)
    $tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
    # 合併儲存格 (1, 2) x (2, 2)
    $tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
    # 分割儲存格 (1, 1)
    $tbl->get_Item(1, 1)->splitByWidth($tbl->get_Item(2, 1)->getWidth() / 2);
    # 將 PPTX 檔案寫入磁碟
    $pres->save("SplitCells_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

變更表格儲存格背景顏色

以下 PHP 程式碼示範如何變更表格儲存格的背景顏色:

  $presentation = new Presentation();
  try {
    $slide = $presentation->getSlides()->get_Item(0);
    $dblCols = array(150, 150, 150, 150 );
    $dblRows = array(50, 50, 50, 50, 50 );
    # 建立新表格
    $table = $slide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
    # 為儲存格設定背景顏色
    $cell = $table->get_Item(2, 3);
    $cell->getCellFormat()->getFillFormat()->setFillType(FillType::Solid);
    $cell->getCellFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
    $presentation->save("cell_background_color.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($presentation)) {
      $presentation->dispose();
    }
  }

在表格儲存格內加入圖片

  1. 建立 Presentation 類別的實例。
  2. 透過索引取得投影片的參照。
  3. 定義具有寬度的欄位陣列。
  4. 定義具有高度的列陣列。
  5. 使用 AddTable 方法將表格加入投影片。
  6. 建立一個 Images 物件以保存圖片檔案。
  7. IImage 圖像加入 IPPImage 物件。
  8. 將表格儲存格的 FillFormat 設定為 Picture
  9. 將圖片加入表格的第一個儲存格。
  10. 將修改後的簡報儲存為 PPTX 檔案。

以下 PHP 程式碼示範在建立表格時如何將圖片放置於表格儲存格內:

  # 實例化代表 PPTX 檔案的 Presentation 類別
  $pres = new Presentation();
  try {
    # 取得第一張投影片
    $islide = $pres->getSlides()->get_Item(0);
    # 定義具有寬度的欄位與具有高度的列
    $dblCols = array(150, 150, 150, 150 );
    $dblRows = array(100, 100, 100, 100, 90 );
    # 將表格形狀新增至投影片
    $tbl = $islide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
    # 使用圖像檔建立 IPPImage 物件
    $picture;
    $image = Images->fromFile("image.jpg");
    try {
      $picture = $pres->getImages()->addImage($image);
    } finally {
      if (!java_is_null($image)) {
        $image->dispose();
      }
    }
    # 將影像加入表格的第一個儲存格
    $cellFormat = $tbl->get_Item(0, 0)->getCellFormat();
    $cellFormat::getFillFormat()->setFillType(FillType::Picture);
    $cellFormat::getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode->Stretch);
    $cellFormat::getFillFormat()->getPictureFillFormat()->getPicture()->setImage($picture);
    # 將 PPTX 檔案儲存至磁碟
    $pres->save("Image_In_TableCell_out.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

常見問題

我能為單一儲存格的不同邊設定不同的線寬與樣式嗎?
可以。儲存格的 /// 邊框各自擁有獨立的屬性,因此每一側的線寬與樣式都可以不同。這與本文示範的儲存格逐側邊框控制邏輯相符。

如果在將圖片設定為儲存格背景後,變更欄或列的大小,圖片會發生什麼情況?
其行為取決於 fill mode(伸展/平鋪)。若使用伸展,圖片會依新儲存格調整大小;若使用平鋪,圖塊會重新計算。本文有提到儲存格內圖片的顯示模式。

我能為儲存格的所有內容指派超連結嗎?
Hyperlinks 可設定於儲存格文字框內的文字(段落)層級,或整個表格/形狀層級。實務上,您可以將連結指派給某段文字或整個儲存格的所有文字。

我能在單一儲存格內設定不同的字型嗎?
可以。儲存格的文字框支援 portions(文字片段),可獨立設定格式——字型、樣式、大小與顏色。