====== PHPExcel ====== Clase para la lectura y escritura de ficheros Excel con [[informatica:programacion:php|PHP]]. * [[https://github.com/PHPOffice/PHPExcel|Repositorio oficial]] (GitHub) Las notas aquí recogidas se centran en la versión 1.8.1 (año 2015) que ya está obsoleta. A día de hoy, su sucesor es [[https://github.com/PHPOffice/PhpSpreadsheet|PhpSpreadsheet]] ===== Operaciones habituales ===== ==== Nombrar una hoja ==== // La "activamos" para trabajar con ella $objPHPExcel->setActiveSheetIndex(1); // Damos nombre $objPHPExcel->getActiveSheet()->setTitle('N1'); ==== Escribir números largos ==== Por defecto, sin introducimos un número en una celda, Excel lo tratará como número y si es demasiado grande lo redondeará o truncará. Para que nos respete el número tal cual, tenemos que forzar a que se introduzca como texto: $objPHPExcel->getActiveSheet()->setCellValueExplicit('A1', '1234567890', PHPExcel_Cell_DataType::TYPE_STRING); ==== Añadir una hoja ==== Por defecto, el fichero Excel se creará con una sola hoja. Si queremos añadir otra: $objPHPExcel->createSheet(); // La "activamos" para trabajar con ella $objPHPExcel->setActiveSheetIndex(1); ==== Dimensiones de una hoja ==== Para obtener la última fila y columna que Excel reconoce: $ultima_fila = $objPHPExcel->getHighestRow(); $ultima_columna = $hoja->getHighestColumn(); Sin embargo, puede ocurrir que la última fila / columna sea mucho mayor de lo esperado porque incluso los estilos pueden falsificar los valores más altos almacenados. Si abrimos el fichero en Excel y presionamos la combinación Ctrl + Fin, Excel nos llevará a la última celda que reconoce. De esta manera podremos comprobar con qué rango está trabajando Excel. Una solución a esto en PHPExcel, es utilizar los métodos (lentos) ''getHighestDataRow()'' y ''getHighestDataColumn()'' para identificar la fila y columna más grandes que realmente contienen información en sus celdas. $ultima_fila_con_datos = $objPHPExcel->getHighestDataRow(); $ultima_columna_con_datos = $hoja->getHighestDataColumn(); ===== Fechas ===== ==== Convertir desde formato Excel ==== Excel almacena las fechas como el tiempo transcurrido desde el 01/01/1900 (en algunas versiones utiliza el 01/01/1904). Para fechas anteriores a 01/01/1900, Excel las representa como una cadena de texto. Si extraemos una fecha con PHPExcel, obtendremos un número decimal con los días transcurridos. Para transformarlo a fecha UNIX (01/01/1970) y poder trabajar mejor con ella: $fecha_unix = ($fecha_excel - 25569) * 86400; ''25569'' son los días entre 01/01/1900 y 01/01/1970. ''86499'' son los segundos que hay en un día. A partir de entonces, ya podríamos utilizar ''$fecha_unix'' para obtener otros formatos de fecha: echo gmdate("d/m/Y H:i:s", $fecha_unix); * [[https://stackoverflow.com/a/15137090|Solución en StackOverflow]] ==== Escribir en formato fecha Excel ==== Si un valor de texto lo que queremos transformar en un dato de fecha de Excel, primero tenemos que pasarlo a un valor de fecha Excel (un número): $obj->setActiveSheetIndex(0) ->setCellValue("B1", PHPExcel_Shared_Date::PHPToExcel("2025-01-01 10:20:33")); Y ahora cambiamos el formato de esa celda a tipo fecha con la máscara que queramos: $obj->getActiveSheet() ->getStyle("B1") ->getNumberFormat() //->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME); ->setFormatCode("dd/mm/yyyy hh:mm:ss"); La constante ''FORMAT_DATE_DATETIME'' lo escribiría con el formato ''d/m/y h:mm'' (sin ceros iniciales) ===== Recursos ===== * [[https://github.com/PHPOffice/PHPExcel/tree/1.8/Examples|Ejemplos de la versión 1.8]] (lanzada en 2015 y archivada en 2019)