Quản lý các ô bảng trong bản trình chiếu bằng PHP
Tổng quan
Aspose.Slides cho phép bạn truy cập và sửa đổi các ô bảng trong bản trình chiếu PowerPoint. Bài viết này giải thích cách xác định các ô bảng đã hợp nhất, xóa viền ô, làm việc với đánh số ô sau khi hợp nhất hoặc tách ô, thay đổi màu nền của ô, và chèn hình ảnh vào trong ô bảng. Các ví dụ cho thấy cách tạo hoặc mở một bản trình chiếu, lấy bảng từ một slide, cập nhật định dạng ô qua các thuộc tính ô, và lưu bản trình chiếu đã sửa đổi thành tệp PPTX.
Xác định ô bảng đã hợp nhất
- Tạo một thể hiện của lớp Presentation.
- Lấy bảng từ slide đầu tiên.
- Duyệt qua các hàng và cột của bảng để tìm các ô đã hợp nhất.
- In ra thông báo khi phát hiện các ô đã hợp nhất.
Đoạn mã PHP này cho bạn thấy cách xác định các ô bảng đã hợp nhất trong một bản trình chiếu:
$pres = new Presentation("SomePresentationWithTable.pptx");
try {
$table = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);// giả sử Slide#0.Shape#0 là một bảng
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();
}
}
Xóa viền ô bảng
- Tạo một thể hiện của lớp Presentation.
- Lấy tham chiếu tới một slide thông qua chỉ mục của nó.
- Định nghĩa một mảng các cột với chiều rộng.
- Định nghĩa một mảng các hàng với chiều cao.
- Thêm một bảng vào slide thông qua phương thức addTable.
- Duyệt qua từng ô để xóa viền trên, dưới, phải và trái.
- Lưu bản trình chiếu đã sửa đổi thành tệp PPTX.
Đoạn mã PHP này cho bạn thấy cách xóa viền khỏi các ô bảng:
# Khởi tạo lớp Presentation đại diện cho tệp PPTX
$pres = new Presentation();
try {
# Truy cập slide đầu tiên
$sld = $pres->getSlides()->get_Item(0);
# Xác định các cột với độ rộng và các hàng với chiều cao
$dblCols = array(50, 50, 50, 50 );
$dblRows = array(50, 30, 30, 30, 30 );
# Thêm hình dạng bảng vào slide
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Đặt định dạng viền cho mỗi ô
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);
}
}
# Ghi tệp PPTX ra đĩa
$pres->save("table_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Đánh số trong các ô đã hợp nhất
Nếu chúng ta hợp nhất 2 cặp ô (1, 1) x (2, 1) và (1, 2) x (2, 2), bảng kết quả sẽ được đánh số. Đoạn mã PHP này minh họa quy trình:
# Khởi tạo lớp Presentation đại diện cho tệp PPTX
$pres = new Presentation();
try {
# Truy cập slide đầu tiên
$sld = $pres->getSlides()->get_Item(0);
# Xác định các cột với độ rộng và các hàng với chiều cao
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Thêm hình dạng bảng vào slide
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Đặt định dạng viền cho mỗi ô
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);
}
}
# Hợp nhất các ô (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Hợp nhất các ô (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();
}
}
Sau đó chúng ta tiếp tục hợp nhất các ô bằng cách hợp nhất (1, 1) và (1, 2). Kết quả là một bảng chứa một ô hợp nhất lớn ở trung tâm:
# Khởi tạo lớp Presentation đại diện cho tệp PPTX
$pres = new Presentation();
try {
# Truy cập slide đầu tiên
$sld = $pres->getSlides()->get_Item(0);
# Xác định các cột với độ rộng và các hàng với chiều cao
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Thêm hình dạng bảng vào slide
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Đặt định dạng viền cho mỗi ô
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);
}
}
# Hợp nhất các ô (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Hợp nhất các ô (1, 2) x (2, 2)
$tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
# Hợp nhất các ô (1, 1) x (1, 2)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(1, 2), true);
# Ghi tệp PPTX ra đĩa
$pres->save("MergeCells_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Đánh số trong ô đã tách
Trong các ví dụ trước, khi các ô bảng được hợp nhất, hệ thống đánh số trong các ô còn lại không thay đổi.
Lần này, chúng ta lấy một bảng thông thường (bảng không có ô hợp nhất) và sau đó tách ô (1,1) để tạo ra một bảng đặc biệt. Bạn có thể chú ý đến cách đánh số của bảng này, có thể có vẻ lạ. Tuy nhiên, đó là cách Microsoft PowerPoint đánh số các ô bảng và Aspose.Slides cũng làm tương tự.
Đoạn mã PHP này minh họa quy trình chúng tôi mô tả:
# Khởi tạo lớp Presentation đại diện cho tệp PPTX
$pres = new Presentation();
try {
# Truy cập slide đầu tiên
$sld = $pres->getSlides()->get_Item(0);
# Xác định các cột với độ rộng và các hàng với chiều cao
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Thêm hình dạng bảng vào slide
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Đặt định dạng viền cho mỗi ô
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);
}
}
# Hợp nhất các ô (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Hợp nhất các ô (1, 2) x (2, 2)
$tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
# Tách ô (1, 1)
$tbl->get_Item(1, 1)->splitByWidth($tbl->get_Item(2, 1)->getWidth() / 2);
# Ghi tệp PPTX ra đĩa
$pres->save("SplitCells_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Thay đổi màu nền của ô bảng
Đoạn mã PHP này cho bạn thấy cách thay đổi màu nền của một ô bảng:
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$dblCols = array(150, 150, 150, 150 );
$dblRows = array(50, 50, 50, 50, 50 );
# tạo một bảng mới
$table = $slide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
# đặt màu nền cho một ô
$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();
}
}
Thêm hình ảnh vào trong ô bảng
- Tạo một thể hiện của lớp Presentation.
- Lấy tham chiếu tới một slide thông qua chỉ mục của nó.
- Định nghĩa một mảng các cột với chiều rộng.
- Định nghĩa một mảng các hàng với chiều cao.
- Thêm một bảng vào slide thông qua phương thức AddTable.
- Tạo một đối tượng
Imagesđể chứa tệp hình ảnh. - Thêm hình ảnh
IImagevào đối tượngIPPImage. - Đặt
FillFormatcho ô bảng thànhPicture. - Thêm hình ảnh vào ô đầu tiên của bảng.
- Lưu bản trình chiếu đã sửa đổi thành tệp PPTX
Đoạn mã PHP này cho bạn thấy cách chèn hình ảnh vào trong một ô bảng khi tạo bảng:
# Khởi tạo lớp Presentation đại diện cho tệp PPTX
$pres = new Presentation();
try {
# Truy cập slide đầu tiên
$islide = $pres->getSlides()->get_Item(0);
# Xác định các cột với độ rộng và các hàng với chiều cao
$dblCols = array(150, 150, 150, 150 );
$dblRows = array(100, 100, 100, 100, 90 );
# Thêm hình dạng bảng vào slide
$tbl = $islide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
# Tạo đối tượng IPPImage bằng tệp hình ảnh
$picture;
$image = Images->fromFile("image.jpg");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Thêm hình ảnh vào ô bảng đầu tiên
$cellFormat = $tbl->get_Item(0, 0)->getCellFormat();
$cellFormat::getFillFormat()->setFillType(FillType::Picture);
$cellFormat::getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode->Stretch);
$cellFormat::getFillFormat()->getPictureFillFormat()->getPicture()->setImage($picture);
# Lưu tệp PPTX vào đĩa
$pres->save("Image_In_TableCell_out.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Câu hỏi thường gặp
Tôi có thể đặt độ dày và kiểu đường viền khác nhau cho từng cạnh của một ô duy nhất không?
Có. Các viền top/bottom/left/right có các thuộc tính riêng, vì vậy độ dày và kiểu của mỗi cạnh có thể khác nhau. Điều này hợp lý dựa trên việc điều khiển viền theo từng cạnh cho một ô được trình bày trong bài viết.
Điều gì sẽ xảy ra với hình ảnh nếu tôi thay đổi kích thước cột/hàng sau khi đã đặt hình ảnh làm nền cho ô?
Hành vi phụ thuộc vào fill mode (stretch/tile). Khi kéo dãn, hình ảnh sẽ điều chỉnh theo ô mới; khi lát, các ô ảnh sẽ được tính lại. Bài viết đề cập đến các chế độ hiển thị hình ảnh trong ô.
Tôi có thể gán siêu liên kết cho toàn bộ nội dung của một ô không?
Hyperlinks được đặt ở mức văn bản (phần) bên trong khung văn bản của ô hoặc ở mức toàn bộ bảng/hình. Trong thực tế, bạn gán liên kết cho một phần hoặc cho toàn bộ văn bản trong ô.
Tôi có thể đặt phông chữ khác nhau trong cùng một ô không?
Có. Khung văn bản của ô hỗ trợ portions (run) với định dạng độc lập—gia đình phông, kiểu, kích thước và màu sắc.