在 PHP 中管理演示文稿表格

简介

PowerPoint 中的表格是一种高效的显示和呈现信息的方式。网格中的单元格(按行和列排列)的信息直观且易于理解。

Aspose.Slides 提供了 Table 类、Cell 类以及其他类型,帮助您在各种演示文稿中创建、更新和管理表格。

从头创建表格

  1. 创建 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 定义 columnWidth 数组。
  4. 定义 rowHeight 数组。
  5. 通过 addTable 方法向幻灯片添加一个 Table 对象。
  6. 遍历每个 Cell,对其上、下、右、左边框进行格式化。
  7. 合并表格第一行的前两个单元格。
  8. 访问 Cell’s TextFrame
  9. TextFrame 添加一些文本。
  10. 保存修改后的演示文稿。

下面的 PHP 代码演示了如何在演示文稿中创建表格:

  # 实例化一个表示 PPTX 文件的 Presentation 类
  $pres = new Presentation();
  try {
    # 访问第一张幻灯片
    $sld = $pres->getSlides()->get_Item(0);
    # 定义列宽和行高
    $dblCols = array(50, 50, 50 );
    $dblRows = array(50, 30, 30, 30, 30 );
    # 向幻灯片添加表格形状
    $tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    # 为每个单元格设置边框格式
    for($row = 0; $row < java_values($tbl->getRows()->size()) ; $row++) {
      for($cell = 0; $cell < java_values($tbl->getRows()->get_Item($row)->size()) ; $cell++) {
        $cellFormat = $tbl->getRows()->get_Item($row)->get_Item($cell)->getCellFormat();
        $cellFormat::getBorderTop()->getFillFormat()->setFillType(FillType::Solid);
        $cellFormat::getBorderTop()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cellFormat::getBorderTop()->setWidth(5);
        $cellFormat::getBorderBottom()->getFillFormat()->setFillType(FillType::Solid);
        $cellFormat::getBorderBottom()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cellFormat::getBorderBottom()->setWidth(5);
        $cellFormat::getBorderLeft()->getFillFormat()->setFillType(FillType::Solid);
        $cellFormat::getBorderLeft()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cellFormat::getBorderLeft()->setWidth(5);
        $cellFormat::getBorderRight()->getFillFormat()->setFillType(FillType::Solid);
        $cellFormat::getBorderRight()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
        $cellFormat::getBorderRight()->setWidth(5);
      }
    }
    # 合并第 1 行的第 1 和第 2 个单元格
    $tbl->mergeCells($tbl->getRows()->get_Item(0)->get_Item(0), $tbl->getRows()->get_Item(1)->get_Item(1), false);
    # 向合并的单元格添加一些文本
    $tbl->getRows()->get_Item(0)->get_Item(0)->getTextFrame()->setText("Merged Cells");
    # 将演示文稿保存到磁盘
    $pres->save("table.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

标准表格中的编号

在标准表格中,单元格的编号是直接且从零开始的。表格的第一个单元格索引为 0,0(第 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)

下面的 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);
    # 为每个单元格设置边框格式
    $rows = $tbl->getRows();
    foreach($rows 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);
      }
    }
    # 将演示文稿保存到磁盘
    $pres->save("StandardTables_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

访问现有表格

  1. 创建 Presentation 类的实例。
  2. 通过索引获取包含表格的幻灯片引用。
  3. 创建一个 Table 对象并将其设为 null。
  4. 遍历所有 Shape 对象,直到找到表格。

如果您怀疑当前幻灯片只包含一个表格,可以直接检查它包含的所有形状。当形状被识别为表格时,您可以将其强制转换为 Table 对象。但如果幻灯片包含多个表格,最好通过其 setAlternativeText(String value) 方法搜索所需的表格。

  1. 使用 Table 对象操作表格。在下面的示例中,我们向表格添加了新行。
  2. 保存修改后的演示文稿。

下面的 PHP 代码演示了如何访问并操作现有表格:

  # 实例化表示 PPTX 文件的 Presentation 类
  $pres = new Presentation("UpdateExistingTable.pptx");
  try {
    # 访问第一张幻灯片
    $sld = $pres->getSlides()->get_Item(0);
    # 初始化为 null 的 TableEx
    $tbl = null;
    # 遍历形状并设置对找到的表格的引用
    $shapes = $sld->getShapes();
    foreach($shapes as $shp) {
      if (java_instanceof($shp, new JavaClass("com.aspose.slides.Table"))) {
        $tbl = $shp;
        # 设置第二行第一列的文本
        $tbl->get_Item(0, 1)->getTextFrame()->setText("New");
      }
    }
    # 将修改后的演示文稿保存到磁盘
    $pres->save("table1_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

查找拥有 TextFrame 的单元格

当通用文本处理代码从表格中获取到一个 TextFrame 时,使用 TextFrame::getParentCell 方法检索其所属的 Cell。对于表格单元格的 TextFrame,TextFrame::getParentCell 返回所有者,而 TextFrame::getParentShape 返回 null,即使表格本身也是一个形状。

可以通过只读的 Cell::getFirstColumnIndexCell::getFirstRowIndex 方法获取单元格坐标。TextFrame::getParentCell 同样提供只读导航:它返回所有者但不更改所有权。使用前请务必使用 java_is_null 检查返回的单元格是否为 null。

有关完整示例(识别表格单元格和形状所有者,包括与 SmartArt 节点关联的形状),请参阅 Search and Replace Text

在表格中对齐文本

  1. 创建 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 向幻灯片添加一个 Table 对象。
  4. 从表格中获取一个 TextFrame 对象。
  5. 获取 Paragraph
  6. 垂直对齐文本。
  7. 保存修改后的演示文稿。

下面的 PHP 代码演示了如何在表格中对齐文本:

  # 创建 Presentation 类的实例
  $pres = new Presentation();
  try {
    # 获取第一张幻灯片
    $slide = $pres->getSlides()->get_Item(0);
    # 定义列宽和行高
    $dblCols = array(120, 120, 120, 120 );
    $dblRows = array(100, 100, 100, 100 );
    # 向幻灯片添加表格形状
    $tbl = $slide->getShapes()->addTable(100, 50, $dblCols, $dblRows);
    $tbl->get_Item(1, 0)->getTextFrame()->setText("10");
    $tbl->get_Item(2, 0)->getTextFrame()->setText("20");
    $tbl->get_Item(3, 0)->getTextFrame()->setText("30");
    # 访问文本框
    $txtFrame = $tbl->get_Item(0, 0)->getTextFrame();
    # 为文本框创建 Paragraph 对象
    $paragraph = $txtFrame->getParagraphs()->get_Item(0);
    # 为段落创建 Portion 对象
    $portion = $paragraph->getPortions()->get_Item(0);
    $portion->setText("Text here");
    $portion->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
    $portion->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
    # 垂直对齐文本
    $cell = $tbl->get_Item(0, 0);
    $cell->setTextAnchorType(TextAnchorType::Center);
    $cell->setTextVerticalType(TextVerticalType::Vertical270);
    # 将演示文稿保存到磁盘
    $pres->save("Vertical_Align_Text_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

在表格级别设置文本格式

  1. 创建 Presentation 类的实例。
  2. 通过索引获取幻灯片的引用。
  3. 从幻灯片中获取一个 Table 对象。
  4. 为文本设置 setFontHeight(float value)
  5. 设置 setAlignment(int value)setMarginRight(float value)
  6. 设置 setTextVerticalType(byte value)
  7. 保存修改后的演示文稿。

下面的 PHP 代码演示了如何对表格中的文本应用首选的格式选项:

  # 创建 Presentation 类的实例
  $pres = new Presentation("simpletable.pptx");
  try {
    # 假设第一张幻灯片上的第一个形状是表格
    $someTable = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    # 设置表格单元格的字体高度
    $portionFormat = new PortionFormat();
    $portionFormat::setFontHeight(25);
    $someTable->setTextFormat($portionFormat);
    # 一次调用设置表格单元格的文本对齐方式和右边距
    $paragraphFormat = new ParagraphFormat();
    $paragraphFormat::setAlignment(TextAlignment->Right);
    $paragraphFormat::setMarginRight(20);
    $someTable->setTextFormat($paragraphFormat);
    # 设置表格单元格的文本垂直类型
    $textFrameFormat = new TextFrameFormat();
    $textFrameFormat::setTextVerticalType(TextVerticalType::Vertical);
    $someTable->setTextFormat($textFrameFormat);
    $pres->save("result.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

获取表格样式属性

Aspose.Slides 允许您检索表格的样式属性,以便在其他表格或其他位置使用这些细节。下面的 PHP 代码演示了如何从表格预设样式获取样式属性:

  $pres = new Presentation();
  try {
    $table = $pres->getSlides()->get_Item(0)->getShapes()->addTable(10, 10, array(100, 150 ), array(5, 5, 5 ));
    $table->setStylePreset(TableStylePreset->DarkStyle1);// 更改默认的样式预设主题

    $pres->save("table.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

锁定表格的宽高比

几何形状的宽高比是其不同维度尺寸的比例。Aspose.Slides 提供了 setAspectRatioLocked 方法,允许您锁定表格和其他形状的宽高比设置。

下面的 PHP 代码演示了如何锁定表格的宽高比:

  $pres = new Presentation("pres.pptx");
  try {
    $table = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    echo("Lock aspect ratio set: " . $table->getGraphicalObjectLock()->getAspectRatioLocked());
    $table->getGraphicalObjectLock()->setAspectRatioLocked(!$table->getGraphicalObjectLock()->getAspectRatioLocked());// invert

    echo("Lock aspect ratio set: " . $table->getGraphicalObjectLock()->getAspectRatioLocked());
    $pres->save("pres-out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

常见问题

我可以为整个表格及其单元格中的文本启用从右到左 (RTL) 读取方向吗?
可以。表格提供了 setRightToLeft 方法,段落则有 ParagraphFormat::setRightToLeft。同时使用两者即可确保单元格内的正确 RTL 顺序和渲染。

如何阻止用户在最终文件中移动或调整表格大小?
使用形状锁定来禁用移动、调整大小、选择等操作。这些锁定同样适用于表格。

是否支持在单元格内部插入图片作为背景?
可以。您可以为单元格设置 picture fill,图像将根据所选模式(拉伸或平铺)覆盖单元格区域。