Administrar celdas de tabla en presentaciones usando PHP
Identificar una celda de tabla fusionada
- Crear una instancia de la Presentation class.
- Obtener la tabla de la primera diapositiva.
- Recorrer las filas y columnas de la tabla para encontrar celdas combinadas.
- Mostrar un mensaje cuando se encuentren celdas combinadas.
Este código PHP muestra cómo identificar celdas de tabla combinadas en una presentación:
$pres = new Presentation("SomePresentationWithTable.pptx");
try {
$table = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);// suponiendo que Slide#0.Shape#0 es una tabla
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();
}
}
Eliminar los bordes de las celdas de la tabla
- Crear una instancia de la Presentation class.
- Obtener la referencia de una diapositiva mediante su índice.
- Definir una matriz de columnas con ancho.
- Definir una matriz de filas con altura.
- Agregar una tabla a la diapositiva mediante el método addTable.
- Recorrer cada celda para eliminar los bordes superior, inferior, derecho e izquierdo.
- Guardar la presentación modificada como un archivo PPTX.
Este código PHP muestra cómo eliminar los bordes de las celdas de la tabla:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Accede a la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Define columnas con anchos y filas con alturas
$dblCols = array(50, 50, 50, 50 );
$dblRows = array(50, 30, 30, 30, 30 );
# Añade la forma de tabla a la diapositiva
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Establece el formato de borde para cada celda
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);
}
}
# Escribe el PPTX en disco
$pres->save("table_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Numeración en celdas combinadas
Si combinamos 2 pares de celdas (1, 1) x (2, 1) y (1, 2) x (2, 2), la tabla resultante tendrá numeración. Este código PHP muestra el proceso:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Accede a la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Define columnas con anchos y filas con alturas
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Añade una forma de tabla a la diapositiva
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Establece el formato de borde para cada celda
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);
}
}
# Fusiona celdas (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Fusiona celdas (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();
}
}
Entonces combinamos las celdas más allá combinando (1, 1) y (1, 2). El resultado es una tabla que contiene una gran celda combinada en su centro:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Accede a la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Define columnas con anchos y filas con alturas
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Añade una forma de tabla a la diapositiva
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Establece el formato de borde para cada celda
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);
}
}
# Fusiona celdas (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Fusiona celdas (1, 2) x (2, 2)
$tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
# Fusiona celdas (1, 1) x (1, 2)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(1, 2), true);
# Escribe el archivo PPTX en disco
$pres->save("MergeCells_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Numeración en una celda dividida
En ejemplos anteriores, cuando las celdas de la tabla se combinaron, la numeración o el sistema de números en otras celdas no cambió.
Esta vez, tomamos una tabla normal (una tabla sin celdas combinadas) y luego intentamos dividir la celda (1,1) para obtener una tabla especial. Puede que quiera prestar atención a la numeración de esta tabla, que puede parecer extraña. Sin embargo, así es como Microsoft PowerPoint numeriza las celdas de la tabla y Aspose.Slides hace lo mismo.
Este código PHP muestra el proceso que describimos:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Accede a la primera diapositiva
$sld = $pres->getSlides()->get_Item(0);
# Define columnas con anchos y filas con alturas
$dblCols = array(70, 70, 70, 70 );
$dblRows = array(70, 70, 70, 70 );
# Añade una forma de tabla a la diapositiva
$tbl = $sld->getShapes()->addTable(100, 50, $dblCols, $dblRows);
# Establece el formato de borde para cada celda
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);
}
}
# Fusiona celdas (1, 1) x (2, 1)
$tbl->mergeCells($tbl->get_Item(1, 1), $tbl->get_Item(2, 1), false);
# Fusiona celdas (1, 2) x (2, 2)
$tbl->mergeCells($tbl->get_Item(1, 2), $tbl->get_Item(2, 2), false);
# Divide la celda (1, 1)
$tbl->get_Item(1, 1)->splitByWidth($tbl->get_Item(2, 1)->getWidth() / 2);
# Escribe el archivo PPTX en disco
$pres->save("SplitCells_out.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Cambiar el color de fondo de la celda de la tabla
Este código PHP muestra cómo cambiar el color de fondo de una celda de tabla:
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$dblCols = array(150, 150, 150, 150 );
$dblRows = array(50, 50, 50, 50, 50 );
# crea una tabla nueva
$table = $slide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
# establece el color de fondo de una celda
$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();
}
}
Agregar una imagen dentro de una celda de tabla
- Crear una instancia de la Presentation class.
- Obtener la referencia de una diapositiva mediante su índice.
- Definir una matriz de columnas con ancho.
- Definir una matriz de filas con altura.
- Agregar una tabla a la diapositiva mediante el método AddTable.
- Crear un objeto
Imagespara contener el archivo de imagen. - Agregar la imagen
IImageal objetoIPPImage. - Establecer el
FillFormatde la celda de la tabla aPicture. - Agregar la imagen a la primera celda de la tabla.
- Guardar la presentación modificada como un archivo PPTX
Este código PHP muestra cómo colocar una imagen dentro de una celda de tabla al crear una tabla:
# Instancia la clase Presentation que representa un archivo PPTX
$pres = new Presentation();
try {
# Accede a la primera diapositiva
$islide = $pres->getSlides()->get_Item(0);
# Define columnas con anchos y filas con alturas
$dblCols = array(150, 150, 150, 150 );
$dblRows = array(100, 100, 100, 100, 90 );
# Añade una forma de tabla a la diapositiva
$tbl = $islide->getShapes()->addTable(50, 50, $dblCols, $dblRows);
# Crea un objeto IPPImage usando el archivo de imagen
$picture;
$image = Images->fromFile("image.jpg");
try {
$picture = $pres->getImages()->addImage($image);
} finally {
if (!java_is_null($image)) {
$image->dispose();
}
}
# Añade la imagen a la primera celda de la tabla
$cellFormat = $tbl->get_Item(0, 0)->getCellFormat();
$cellFormat::getFillFormat()->setFillType(FillType::Picture);
$cellFormat::getFillFormat()->getPictureFillFormat()->setPictureFillMode(PictureFillMode->Stretch);
$cellFormat::getFillFormat()->getPictureFillFormat()->getPicture()->setImage($picture);
# Guarda el archivo PPTX en disco
$pres->save("Image_In_TableCell_out.pptx", SaveFormat::Pptx);
} catch (JavaException $e) {
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
¿Puedo establecer diferentes grosores y estilos de línea para los diferentes lados de una sola celda?
Sí. Los bordes top/bottom/left/right tienen propiedades independientes, por lo que el grosor y el estilo de cada lado pueden ser diferentes. Esto sigue lógicamente del control de bordes por lado para una celda demostrado en el artículo.
¿Qué ocurre con la imagen si cambio el tamaño de la columna/fila después de establecer una imagen como fondo de la celda?
El comportamiento depende del fill mode (stretch/tile). Con estiramiento, la imagen se ajusta a la nueva celda; con mosaico, los mosaicos se recalculan. El artículo menciona los modos de visualización de la imagen en una celda.
¿Puedo asignar un hipervínculo a todo el contenido de una celda?
Los Hyperlinks se establecen a nivel de texto (porción) dentro del marco de texto de la celda o a nivel de toda la tabla/forma. En la práctica, asignas el enlace a una porción o a todo el texto de la celda.
¿Puedo establecer diferentes fuentes dentro de una sola celda?
Sí. El marco de texto de una celda soporta portions (segmentos) con formato independiente — familia de fuente, estilo, tamaño y color.