Управление таблицами презентаций в PHP
Введение
Таблицы в PowerPoint упорядочивают информацию в строки и столбцы, упрощая чтение и сравнение значений.
Aspose.Slides предоставляет класс Таблица класс Ячейка и другие типы, позволяющие создавать, обновлять и управлять таблицами в презентациях.
Создать таблицу с нуля
Создайте таблицу, указав её положение, ширину столбцов и высоту строк. После добавления её в слайд вы можете форматировать границы ячеек, объединять ячейки и вставлять текст.
- Создайте экземпляр класса Presentation.
- Получите ссылку на слайд по его индексу.
- Определите массив ширин столбцов в пунктах.
- Определите массив высот строк в пунктах.
- Добавьте объект Table на слайд с помощью метода addTable.
- Итерируйтесь по каждой 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 перед её использованием.
Для полного примера, который определяет владельцев ячеек таблицы и фигур, включая фигуры, связанные с узлами 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();
}
FAQ
Можно ли включить направление чтения справа налево (RTL) для всей таблицы и текста в её ячейках?
Да. Таблица предоставляет метод setRightToLeft, а у абзацев есть ParagraphFormat::setRightToLeft. Использование обоих обеспечивает правильный порядок RTL и рендеринг внутри ячеек.
Как предотвратить перемещение или изменение размера таблицы пользователями в конечном файле?
Используйте блокировки фигур для отключения перемещения, изменения размера, выделения и т.д. Эти блокировки применимы и к таблицам.
Поддерживается ли вставка изображения в ячейку в качестве фона?
Да. Вы можете задать picture fill для ячейки; изображение будет покрывать область ячейки в соответствии с выбранным режимом (растягивание или плитка).