PHPExcel Guía Técnica de Desarrollo en Español

Requisitos Previos

Para utilizar la extensión PHPExcel, se necesitan los siguientes componentes de software:

  • Versión de PHP 5.2.0 o superier.
  • La extensión php_zip habilitada (requerida solo para formatos .xlsx y .ods).
  • La extensión php_xml habilitada.
  • La extensión php_gd2 habilitada (si no está compilada).

La extensión php_zip es necesaria únicamente para las clases PHPExcel_Reader_Excel2007, PHPExcel_Writer_Excel2007 y PHPExcel_Reader_OOCalc. Para archivos Excel 2007, es posible evitar esta dependencia utilizando la biblioteac PCLZip incluida con PHPExcel, activando la extensión zlib de PHP.

Instalación

La instalación consiste en copiar el contenido de la carpeta Classes al directorio de código fuente de su aplicación. Por ejemplo, si su raíz web es /var/www/, puede crear una subcarpeta como /var/www/mis_clases/ y copiar los archivos allí, resultando en rutas como:

/var/www/mis_clases/PHPExcel.php
/var/www/mis_clases/PHPExcel/Calculation.php
/var/www/mis_clases/PHPExcel/Cell.php

Primeros Pasos

Una buena manera de comenzar es ejecutar los scripts de ejemplo incluidos en la distribución. Copie la carpeta Examples junto a Classes. Luego, acceda a los scripts mediante su navegador:

http://ejemplo.com/Examples/01simple.php
http://ejemplo.com/Examples/02types.php

Nota: Puede que necesite ajustar las sentencias include o require al inicio de cada script si la ruta a la carpeta Classes es diferente.

Arquitectura

PHPExcel se estructura como una hoja de cálculo en memoria. Esto permite comunicarse con un modelo de objetos para representar el contenido de una hoja de cálculo, siendo posible construir una vista web basada en este modelo.

La biblioteca central no proporciona funcionalidad para leer o escribir archivos. Para ello, se utilizan clases de tipo Lector (Reader) y Escritor (Writer). La distribución incluye implementaciones para varios formatos como Excel 2007 (Open XML), Excel 5 (BIFF), CSV, HTML, entre otros. También es posible implementar clases personalizadas que sigan las interfaces PHPExcel_Reader_IReader y PHPExcel_Writer_IWriter.

Creación de una Hoja de Cálculo

La clase PHPExcel actúa como el objeto central que representa un libro de trabajo. Contiene las hojas de cálculo, metadatos, configuración de seguridad y referencias.

Cargar desde un Archivo

$rutaArchivo = './datos/ejemplo1.xls';
$libroTrabajo = PHPExcel_IOFactory::load($rutaArchivo);

Crear un Nuevo Libro

$libroTrabajo = new PHPExcel();

Un nuevo libro se crea con una hoja de trabajo predeterminada.

Configuración de Almacenamiento en Caché

Para reducir el consumo de memoria con libros grandes, PHPExcel ofrece mecanismos de caché. Se configuran antes de instanciar un objeto PHPExcel o cargar un archivo.

$metodoCache = PHPExcel_CachedObjectStorageFactory::cache_in_memory;
PHPExcel_Settings::setCacheStorageMethod($metodoCache);

Algunos métodos disponibles incluyen:

  • cache_in_memory_serialized: Almacena objetos serializados en memoria PHP.
  • cache_in_memory_gzip: Similar al anterior, pero comprimido con gzip.
  • cache_to_phpTemp: Utiliza el flujo php://temp, con un límite de memoria configurable (predeterminado 1MB).
  • cache_to_apc: Almacena en APC (Alternative PHP Cache).
  • cache_to_memcache: Almacena en un servidor Memcached.

Acceso a Celdas

Por Coordenada

// Establecer valor
$libroTrabajo->getActiveSheet()->setCellValue('B8', 'Texto de ejemplo');

// Obtener valor
$valor = $libroTrabajo->getActiveSheet()->getCell('B8')->getValue();
// Obtener valor calculado (ej. fórmulas)
$valorCalculado = $libroTrabajo->getActiveSheet()->getCell('B8')->getCalculatedValue();

Por Índice de Fila y Columna

// Establecer valor en la celda B8 (columna 1, fila 8)
$libroTrabajo->getActiveSheet()->setCellValueByColumnAndRow(1, 8, 'Datos');

// Obtener valor
$valor = $libroTrabajo->getActiveSheet()->getCellByColumnAndRow(1, 8)->getValue();

Iteración sobre Celdas

Se puede usar un iterador para recorrer las celdas de una hoja.

$hojaActiva = $libroTrabajo->getActiveSheet();
$iteradorFilas = $hojaActiva->getRowIterator();

foreach ($iteradorFilas as $fila) {
    $iteradorCeldas = $fila->getCellIterator();
    $iteradorCeldas->setIterateOnlyExistingCells(false); // Iterar todas las celdas, incluso las vacías

    foreach ($iteradorCeldas as $celda) {
        echo $celda->getValue() . "\t";
    }
    echo "\n";
}

Para iterar usando índices numéricos:

$ultimaFila = $hojaActiva->getHighestRow();
$ultimaColumna = PHPExcel_Cell::columnIndexFromString($hojaActiva->getHighestColumn());

for ($fila = 1; $fila <= $ultimaFila; $fila++) {
    for ($col = 0; $col <= $ultimaColumna; $col++) {
        $valor = $hojaActiva->getCellByColumnAndRow($col, $fila)->getValue();
        echo $valor . "\t";
    }
    echo "\n";
}

Estilizado de Celdas

Se puede aplicar formatto a celdas o rangos.

// Aplicar estilo a un rango
$rango = 'A1:D10';
$estilo = $libroTrabajo->getActiveSheet()->getStyle($rango);

// Configurar fuente
$estilo->getFont()->setName('Arial');
$estilo->getFont()->setSize(10);
$estilo->getFont()->setBold(true);

// Configurar borde
$estilo->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$estilo->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$estilo->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$estilo->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

// Relleno
$estilo->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$estilo->getFill()->getStartColor()->setARGB('FFC0C0C0');

También se puede usar un array de configuración:

$definicionEstilo = [
    'font' => [
        'bold' => true,
        'color' => ['argb' => 'FFFF0000'],
    ],
    'alignment' => [
        'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
    ],
    'borders' => [
        'allborders' => [
            'style' => PHPExcel_Style_Border::BORDER_MEDIUM,
            'color' => ['argb' => 'FF000000'],
        ],
    ],
];
$libroTrabajo->getActiveSheet()->getStyle('B2:G8')->applyFromArray($definicionEstilo);

Fórmulas

Las fórmulas deben escribirse en el formato interno inglés, usando el punto como separador decimal y la coma como separador de argumentos. Al abrir el archivo en una aplicación como Microsoft Excel, se mostrarán en el idioma local configurado.

$libroTrabajo->getActiveSheet()->setCellValue('C10', '=SUMA(A1:A9)');

Para obtener el valor calculado de una celda con fórmula:

$resultado = $libroTrabajo->getActiveSheet()->getCell('C10')->getCalculatedValue();

Lectura y Escritura de Archivos

Se utiliza la fábrica PHPExcel_IOFactory para crear lectores o escritores según el formato.

Leer un archivo Excel 2007 (.xlsx)

$lector = PHPExcel_IOFactory::createReader('Excel2007');
$libroTrabajo = $lector->load('documento.xlsx');

Escribir un archivo Excel 97-2003 (.xls)

$escritor = PHPExcel_IOFactory::createWriter($libroTrabajo, 'Excel5');
$escritor->save('salida.xls');

Es posible combinar la lectura, modificación y escritura para generar archivos a partir de una plantilla.

Etiquetas: PHPExcel PHPExcel_IOFactory PHPExcel_Worksheet PHPExcel_Cell PHPExcel_Style

Publicado el 6-28 23:59