Quizás para algunos PHPExcel es archiconocido, pero les voy a contar (lo poco que se) sobre esta librería para trabajar con hojas de cálculos en PHP.
La semana pasado en el trabajo me encontré con un inconveniente. En un principio, existía un modulo que desarrollé el cual permitía ingresar ciertos datos al sistema mediante un Excel predefinido por mi. Se descarga desde el sistema y es llenado por el usuario para luego ser subido y procesado ingresando todo como si fuese ingresado desde la página directamente (imagen que suben un post a un blog desde una hoja de calculos, indicando lo mismo que se pide al publicar vía web, lo suben y listo). Era cosa de comodidad para los usuarios que muchas veces se manejan más en Excel que en un sistema desarrollado en una plataforma web. El inconveniente fue que el Excel que yo tenía, ahora debía tener ciertas opciones. El GRAN pero de todo esto, era que esas opciones eran rescatadas desde una base de datos. Osea, tenía dos opciones: actualizaba el Excel yo mismo cada vez que se ingrese una opción o realizaba una hoja de cálculos dinámica, que al ser descargada se conectara con la base de datos, rescatara las opciones y las escribiera en la hoja de cálculos. Opté por la segunda opción.
En un principio no lo vi tan complicado. Ya sabia trabajar con Excel desde PHP, podía leer y escribir sin problemas. Pero todo, absolutamente todo se me complicó. En un principio me dije “Bueno, si se puede leer y escribir, se podrá abrir un archivo desde PHP y modificarlo para luego ser guardado”… pero no. La única opción de hacer eso era mediante Componentes COM para comunicarme con Excel desde PHP. Era mucho enredo, a parte de que necesitaba que el servidor sea Windows y tuviese Excel instalado, cosa que no es así.
Intenté genera un Excel desde PHP y ahí ingresar las opciones desde la base de datos, pero me di cuenta que tampoco era posible. Necesitaba hacer el uso de formulas, suma de valores entre pestañas (hojas) y usar una validación de datos del tipo lista para las opciones que debía ingresar. Era mucho pedir.
Fue ahí de tanto y tanto buscar soluciones a mis necesidades que me topé con PHPExcel… nuevamente. Sí, porque hace un tiempo atrás (1 año) también me topé con el buscando soluciones algunos problemas con Excel en PHP. Estúpidamente no le di bola. Pero siempre hay una segunda oportunidad para todo.
PHPExcel tenía todo, pero completamente todo lo que necesitaba. Fue amor a segunda vista. Conocí otras librerías parecidas, en el sentido que permitían hacer cosas como escribir formulas, pero PHPExcel esta a otro nivel. Logre modificar un Excel, que era justo lo que necesitaba. Osea, sinceramente no es modificar, si no que en la practita realmente lo que hice es utilizar un Excel como plantilla y escribir sobre el. Leo, copio y pego. Tal cual.

Creadores de PHPExcel
Luego de “pegar” mi plantilla escribo sobre ella a mi antojo. Lo increíble de PHPExcel es que pudo leer y copiar mi plantilla Excel sin perder casi ningún formato de diseño y de valores (bordes, colores, formulas, nombre de formulas, nombre de rangos, validación de datos, etc). Osea, no lee el valor visible, si no que ve realmente como se compone ese valor. Que lo forma.
Luego de jugar un poco con la librería, leer la documentación (EXCELENTE documentación) y pedir ayuda en los foros logré hacer lo que necesitaba: ingrese la lista de opciones, obteniendo los datos desde una base datos. Todo quedó en una lista desplegable que se muestra al hacer clic en la celda. De este modo no permite ingresar otro valor que no sea el que aparece en la lista (validación de datos).
A continuación algunas características:
- Setear meta data (autor, titulo, descripción, …)
- Agregar mas hojas de cálculo (pestañas)
- Agregar valores y formular a celdas individuales
- Combina celdas
- Proteger rango de celdas con contraseña
- Poder establecer alto y ancho de celdas
- Poder establecer diseño a celdas (fuente, borde, fondo, …)
- Soporte para fijar celdas
- Poder agrupar celdas/columnas
- Insertar o borrar celdas/columnas
- Asignar nombre a un rango
- Soporte para referencias entre pestañas
- Agregar imágenes (con la posibilidad de cambiar su estilo: sombra, posición, ..)
- Agregar comentarios a una celda
- Setear opciones de impresión
- Opciones de salida en distintos formatos
- Excel 2007
- BIFF8 (Excel 97 y superior)
- CSV
- HTML
- PHPExcel Serialized Spreadsheet (formato propio de PHPExcel)
- Opciones de lectura en distintos formatos
- Excel 2007
- BIFF5 (Excel 5.0 / Excel 95), BIFF8 (Excel 97 osuperior)
- PHPExcel Serialized Spreadsheet
- CSV (Comma Separated Values)
Lo bueno (y realmente bueno) es que viene con muchísimos ejemplos con las cosas que puedes hacer con PHPExcel. No sólo viene con ejemplos, si no que también con una completísima documentación de sus clases y funciones. Aparte de todo esto la comunidad que hay detrás de todo esto es buenísima. Hay un constante feedback de los usuarios y el desarrollo es constante. Yo tuve ciertos problemas, postee en el foro y la respuesta no se hizo esperar de un mismo desarrollador que en 15 minutos solucionó mi problema.
Leer un archivo Excel:
<?php
$objReader = PHPExcel_IOFactory::createReader(‘Excel2007′);
$objReader->setReadDataOnly(true);$objPHPExcel = $objReader->load(“test.xlsx”);
$objWorksheet = $objPHPExcel->getActiveSheet();echo ‘<table>’ . “\n”;
foreach ($objWorksheet->getRowIterator() as $row) {
echo ‘<tr>’ . “\n”;$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // This loops all cells,
// even if it is not set.
// By default, only cells
// that are set will be
// iterated.
foreach ($cellIterator as $cell) {
echo ‘<td>’ . $cell->getValue() . ‘</td>’ . “\n”;
}echo ‘</tr>’ . “\n”;
}
echo ‘</table>’ . “\n”;
?>
Como usar una hoja de calculo como plantilla para crear otra
<?php
// Camino a los include
set_include_path(get_include_path() . PATH_SEPARATOR . ‘../Classes/’);// PHPExcel
require_once ‘PHPExcel.php’;// PHPExcel_IOFactory
include ‘PHPExcel/IOFactory.php’;// Creamos un objeto PHPExcel
$objPHPExcel = new PHPExcel();// Leemos un archivo Excel 2007
$objReader = PHPExcel_IOFactory::createReader(‘Excel2007′);
$objPHPExcel = $objReader->load(“Archivo.xlsx”);// Indicamos que se pare en la hoja uno del libro
$objPHPExcel->setActiveSheetIndex(0);//Escribimos en la hoja en la celda B1
$objPHPExcel->getActiveSheet()->SetCellValue(‘B2′, ‘Hola mundo’);// Color rojo al texto
$objPHPExcel->getActiveSheet()->getStyle(‘B2′)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
// Texto alineado a la derecha
$objPHPExcel->getActiveSheet()->getStyle(‘B2′)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
// Damos un borde a la celda
$objPHPExcel->getActiveSheet()->getStyle(‘B2′)->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
$objPHPExcel->getActiveSheet()->getStyle(‘B2′)->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
$objPHPExcel->getActiveSheet()->getStyle(‘B2′)->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);//Guardamos el archivo en formato Excel 2007
//Si queremos trabajar con Excel 2003, basta cambiar el ‘Excel2007′ por ‘Excel5′ y el nombre del archivo de salida cambiar su formato por ‘.xls’
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel2007′);
$objWriter->save(“Archivo_salida.xlsx”);
Todos estos ejemplos los saqué de la misma documentación. Por lo que ustedes mismos encontrarán todo lo necesario ahí.
Actualmente se encuentra en su versión 1.6.7 y la puedes descargar desde aquí.
Sitio Oficial: http://phpexcel.codeplex.com
Hola, funciona en servidores linux?
Sí, estimado. He probado en los dos y funciona a la perfección.