管理 PHP 中的簡報表格
簡介
PowerPoint 中的表格將資訊組織成行與列,讓讀取和比較數值更加容易。
Aspose.Slides 提供了 Table 類別、Cell 類別以及其他類型,讓您能在簡報中建立、更新與管理表格。
從頭建立表格
透過指定位置、欄寬與列高來建立表格。將其加入投影片後,您可以設定儲存格邊框、合併儲存格,並插入文字。
- 建立 Presentation 類別的實例。
- 根據索引取得投影片參考。
- 定義以點為單位的欄寬陣列。
- 定義以點為單位的列高陣列。
- 透過 addTable 方法,將 Table 物件加入投影片。
- 遍歷每個 Cell 以套用上、下、左、右邊框的格式。
- 合併表格第一列的前兩個儲存格。
- 透過其 getTextFrame 方法存取合併後的儲存格。
- 設定合併儲存格內的文字。
- 儲存已修改的簡報。
以下範例在 (100, 50) 點處建立一個具有三欄五列的表格。它套用寬度為 5 點的紅色邊框,合併第一列的前兩個儲存格,並將結果儲存為 table.pptx。
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$red = java("java.awt.Color")->RED;
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 50, 50, 50 ];
$rowHeights = [ 50, 30, 30, 30, 30 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
for ($rowIndex = 0; $rowIndex < java_values($table->getRows()->size()); $rowIndex++) {
$row = $table->getRows()->get_Item($rowIndex);
for ($columnIndex = 0; $columnIndex < java_values($row->size()); $columnIndex++) {
$cell = $row->get_Item($columnIndex);
$cellFormat = $cell->getCellFormat();
$cellFormat->getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderTop()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderTop()->setWidth(5);
$cellFormat->getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderBottom()->setWidth(5);
$cellFormat->getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderLeft()->setWidth(5);
$cellFormat->getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderRight()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderRight()->setWidth(5);
}
}
$table->mergeCells($table->get_Item(0, 0), $table->get_Item(1, 0), false);
$table->get_Item(0, 0)->getTextFrame()->setText("Merged Cells");
$presentation->save("table.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
標準表格的編號方式
在標準表格中,儲存格索引為從零開始,且使用 (欄, 列) 的順序。第一個儲存格的索引為 (0, 0)。
例如,具有 4 欄 4 列的表格其儲存格編號如下:
| (0, 0) | (1, 0) | (2, 0) | (3, 0) |
|---|---|---|---|
| (0, 1) | (1, 1) | (2, 1) | (3, 1) |
| (0, 2) | (1, 2) | (2, 2) | (3, 2) |
| (0, 3) | (1, 3) | (2, 3) | (3, 3) |
此範例建立上述示意的 4 × 4 表格,欄寬與列高皆為 70 點,且套用寬度為 5 點的紅色儲存格邊框。座標說明了儲存格索引;此範例保持儲存格為空,並將表格儲存為 StandardTables_out.pptx。
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$red = java("java.awt.Color")->RED;
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 70, 70, 70, 70 ];
$rowHeights = [ 70, 70, 70, 70 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
for ($rowIndex = 0; $rowIndex < java_values($table->getRows()->size()); $rowIndex++) {
$row = $table->getRows()->get_Item($rowIndex);
for ($columnIndex = 0; $columnIndex < java_values($row->size()); $columnIndex++) {
$cell = $row->get_Item($columnIndex);
$cellFormat = $cell->getCellFormat();
$cellFormat->getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderTop()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderTop()->setWidth(5);
$cellFormat->getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderBottom()->setWidth(5);
$cellFormat->getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderLeft()->setWidth(5);
$cellFormat->getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
$cellFormat->getBorderRight()->getFillFormat()->getSolidFillColor()->setColor($red);
$cellFormat->getBorderRight()->setWidth(5);
}
}
$presentation->save("StandardTables_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
存取現有表格
表格儲存在投影片的形狀集合中。遍歷形狀以找到表格,然後使用 Table 類別讀取或更新其儲存格。
- 使用 Presentation 類別載入簡報。
- 根據索引取得包含表格的投影片參考。
- 遍歷 Shape 物件,當找到表格時即停止。如果投影片包含多個表格,請使用 getAlternativeText 來辨識所需的表格。
- 更新目標儲存格中的文字。
- 儲存已修改的簡報。
以下範例開啟 UpdateExistingTable.pptx,並在第一張投影片上找到第一個表格。它將第 0 欄第 1 列的儲存格設為 New,並將結果儲存為 table1_out.pptx。輸入檔必須至少包含一張投影片,且該投影片上的第一個表格必須至少有一欄兩列。
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("UpdateExistingTable.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = null;
$tableClass = new JavaClass("com.aspose.slides.Table");
$shapeCount = java_values($slide->getShapes()->size());
for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
$shape = $slide->getShapes()->get_Item($shapeIndex);
if (java_instanceof($shape, $tableClass)) {
$table = $shape;
break;
}
}
if ($table !== null) {
$table->get_Item(0, 1)->getTextFrame()->setText("New");
$presentation->save("table1_out.pptx", SaveFormat::Pptx);
}
} finally {
$presentation->dispose();
}
要在現有表格中調整列高,並了解其實際高度為何可能超過要求的最小值,請參閱控制列高。
找出擁有文字框的儲存格
當一般文字處理程式碼從表格取得 TextFrame 時,請使用 TextFrame::getParentCell 方法取得其擁有的 Cell。對於表格儲存格的文字框,TextFrame::getParentCell 會回傳擁有者,而 TextFrame::getParentShape 會回傳 null,即使表格本身也是形狀。
儲存格座標可透過唯讀的 Cell::getFirstColumnIndex 與 Cell::getFirstRowIndex 方法取得。TextFrame::getParentCell 亦提供唯讀的導覽:它回傳擁有者但不會改變所有權。使用前務必以 java_is_null 檢查返回的儲存格是否為 null。
欲取得包含 SmartArt 節點之形狀的完整範例,請參閱搜尋與取代文字。
對齊表格內文字
您可以控制個別表格儲存格的垂直錨定與文字方向。本節範例將文字置中於第一個儲存格,並旋轉 270 度。
- 建立 Presentation 類別的實例。
- 根據索引取得投影片參考。
- 將 Table 物件加入投影片。
- 從表格取得 TextFrame 物件。
- 取得第一個 Paragraph,並設定其文字與顏色。
- 使用 setTextAnchorType 與 setTextVerticalType 設定儲存格的垂直錨定與文字方向。
- 儲存已修改的簡報。
此範例建立一個 4 × 4 表格,欄寬為 120 點、列高為 100 點。它格式化儲存格 (0, 0) 的文字,並在第一列的其餘儲存格加入值,最後將結果儲存為 Vertical_Align_Text_out.pptx。
use aspose\slides\FillType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\TextAnchorType;
use aspose\slides\TextVerticalType;
$presentation = new Presentation();
try {
$black = java("java.awt.Color")->BLACK;
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 120, 120, 120, 120 ];
$rowHeights = [ 100, 100, 100, 100 ];
$table = $slide->getShapes()->addTable(100, 50, $columnWidths, $rowHeights);
$table->get_Item(1, 0)->getTextFrame()->setText("10");
$table->get_Item(2, 0)->getTextFrame()->setText("20");
$table->get_Item(3, 0)->getTextFrame()->setText("30");
$textFrame = $table->get_Item(0, 0)->getTextFrame();
$paragraph = $textFrame->getParagraphs()->get_Item(0);
$portion = $paragraph->getPortions()->get_Item(0);
$portion->setText("Text here");
$portion->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$portion->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor($black);
$cell = $table->get_Item(0, 0);
$cell->setTextAnchorType(TextAnchorType::Center);
$cell->setTextVerticalType(TextVerticalType::Vertical270);
$presentation->save("Vertical_Align_Text_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
在表格層級設定文字格式
使用 setTextFormat 將文字格式套用至表格中的所有儲存格。其多載接受區塊、段落與文字框格式,讓您無需遍歷個別儲存格即可設定這些屬性。
- 使用 Presentation 類別載入簡報。
- 根據索引取得投影片參考。
- 從投影片取得 Table 物件。
- 使用 setFontHeight 設定文字的字型大小。
- 使用 setAlignment 與 setMarginRight 設定段落對齊方式及右側邊距。
- 使用 setTextVerticalType 設定文字方向。
- 儲存已修改的簡報。
以下範例開啟 table.pptx(該檔案必須至少包含一張投影片,且其第一個形狀為表格)。它將字型大小設定為 25 點,段落右對齊且右側邊距為 20 點,並將文字設定為垂直。格式化後的簡報儲存為 result.pptx。
use aspose\slides\ParagraphFormat;
use aspose\slides\PortionFormat;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\TextAlignment;
use aspose\slides\TextFrameFormat;
use aspose\slides\TextVerticalType;
$presentation = new Presentation("table.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = $slide->getShapes()->get_Item(0);
$portionFormat = new PortionFormat();
$portionFormat->setFontHeight(25);
$table->setTextFormat($portionFormat);
$paragraphFormat = new ParagraphFormat();
$paragraphFormat->setAlignment(TextAlignment::Right);
$paragraphFormat->setMarginRight(20);
$table->setTextFormat($paragraphFormat);
$textFrameFormat = new TextFrameFormat();
$textFrameFormat->setTextVerticalType(TextVerticalType::Vertical);
$table->setTextFormat($textFrameFormat);
$presentation->save("result.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
取得表格樣式屬性
使用 getStylePreset 讀取表格的預設樣式,使用 setStylePreset 指定樣式。本範例將 TableStylePreset::DarkStyle1 套用於一個表格,列印預設值,並將相同的預設套用於第二個表格。兩個表格皆儲存於 table-style.pptx。
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use aspose\slides\TableStylePreset;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$columnWidths = [ 100, 150 ];
$rowHeights = [ 5, 5, 5 ];
$table = $slide->getShapes()->addTable(10, 10, $columnWidths, $rowHeights);
$table->setStylePreset(TableStylePreset::DarkStyle1);
$stylePreset = java_values($table->getStylePreset());
echo "Table style preset: " . $stylePreset . PHP_EOL;
$anotherTable = $slide->getShapes()->addTable(10, 100, $columnWidths, $rowHeights);
$anotherTable->setStylePreset($stylePreset);
$presentation->save("table-style.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
鎖定表格的長寬比
表格的長寬比是其寬度與高度的比例。使用 setAspectRatioLocked 可以鎖定表格的長寬比。
以下範例開啟 pres.pptx(該檔案必須至少包含一張投影片,且其第一個形狀為表格)。它列印目前的鎖定狀態,啟用長寬比鎖定,列印更新後的狀態(true),最後將結果儲存為 pres-out.pptx。
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("pres.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$table = $slide->getShapes()->get_Item(0);
echo "Lock aspect ratio set: " . (java_values($table->getGraphicalObjectLock()->getAspectRatioLocked()) ? "true" : "false") . PHP_EOL;
$table->getGraphicalObjectLock()->setAspectRatioLocked(true);
echo "Lock aspect ratio set: " . (java_values($table->getGraphicalObjectLock()->getAspectRatioLocked()) ? "true" : "false") . PHP_EOL;
$presentation->save("pres-out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
常見問題
我可以為整個表格及其儲存格內的文字啟用從右至左 (RTL) 閱讀方向嗎?
可以。表格提供了 setRightToLeft 方法,段落則有 ParagraphFormat::setRightToLeft。同時使用可確保儲存格內的 RTL 順序與呈現正確。
我該如何防止使用者在最終檔案中移動或調整表格大小?
使用 shape locks 可停用移動、調整大小、選取等功能。這些鎖定同樣適用於表格。
是否支援在儲存格內插入圖片作為背景?
可以。您可以為儲存格設定 picture fill;圖片會依所選模式(拉伸或平鋪)覆蓋儲存格區域。