General Excel Real con PHP

Existen varias herramientas para generar Excel desde PHP que van desde un simple HTML en forma de tabla hasta la complejidad de crear un stream que exporte estos resultados a una especie de Excel utilizando la documentación del propio Microsoft.



Entre estas herramientas me he encontrado con la librería de clases PHPExcel, excelente para la gestión de Excels pues permite leer desde CSV, HTML, Excel5 y Excel 2007 además de crear archivos en todos estos formatos más PDF.

Es una librería muy completa y solo requiere tener habilitadas las librerías de php_zip y php_xsl, además de una versión de PHP superior o igual a la 5.2.

Hay multitud de ejemplos y documentación en la página oficial pero aquí os dejo un script para generar un Excel a partir de un array asociativo que podemos sacar perfectamente de una base de datos (solo es válido para datos que no excedan las 25 columnas):

function GeneraExcelFromDB($data,$url){
 $objPHPExcel = new PHPExcel();
 $letra_inicial_ascii = 65; // corresponde con la A 
 $letra_final_ascii = 90; // corresponde con la Z
 if (is_array($data) && !empty($data)){
  $row = 1;
  $active_sheet = $objPHPExcel->setActiveSheetIndex(0);
  foreach (array_values($data) as $_data){
   if (is_array($_data) && !empty($_data)){
    if ($row == 1){
     foreach (array_keys($_data) as $col => $val){
      $active_sheet->setCellValue(chr($letra_inicial_ascii+$col).$row,ucwords(str_replace("_"," ",$val)));
     }
     $row++;
    }
    foreach (array_values($_data) as $col => $val){
     $active_sheet->setCellValue(chr($letra_inicial_ascii+$col).$row,utf8_encode($val));
    }
    $row++;
   }
  }
 }
 $objPHPExcel->getActiveSheet()->setTitle('Informe');
 $objPHPExcel->setActiveSheetIndex(0);
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
 $objWriter->save($url);
}

El bug de las 25 columnas es facilmente corregible pues el excel sigue patrones para sus columnas del tipo A,B…Z,AA,AB…AZ,BA,BB…BZ. Es muy importante el utf8 y codificar los datos porque sino se cortan los datos al llegar a un carácter no compatible.

Comentarios