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 flujophp://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.