TECNato – TIC's Perú

Generar reportes en Excel con PHP

Martes, 20 de julio del 2010 39 comentarios

Algo muy importante en las aplicaciones son los reportes que generalmente se hacen en documentos PDF, Hojas de Calculo, etc.

Las hojas de calculo como Microsoft Excel (.xls) son las mas difundidas en el mercado, es normal que las aplicaciones soporten este formato para sus reportes.

Para generar reportes en Excel en PHP hay varias formas, algunas necesitan que las librerías estén instaladas en los servidores, y otras solo logran escribir en las celdas sin formato o tipo de dato.

Hace poco estuve desarrollando reportes para una Aplicación Web donde desarrolle una clase que me permitió completar los reportes basados en Excel.

La clase se la puede descargar del siguiente link class.excel.writer.php, esta clase se basa en el formato HTML para Microsoft Excel.

Algunas características:

  • Soporta tipos de datos (String, Enteros, Fechas)
  • Colores de letra y fondo de celda
  • Colores de bordes de una celda

Ejemplo 1: Ejemplo simple del uso de esta clase.

Código fuente
Ver ejemplo 1

Ejemplo 2: Ejemplo de un reporte simple.

Código fuente
Ver ejemplo 2

Ejemplo 3: Ejemplo de un reporte con estilo.

Código fuente
Ver ejemplo 3

Los reportes que hice son mas complejos que los ejemplos anteriores, para ello tuve que modificar la clase.

Esta clase esta libre para su uso, pueden modificarlo a su gusto, y si es posible mandarme los cambios y/o publicarlos en alguna dirección Web.

 

09/08/2013: He actualizado el codigo fuente para que trabaje con XML, y funciona mejor para Microsoft Excel

09/08/2013: Para los usuarios avanzados les recomiendo PHPExcel


Escrito por para TECNato

39 comentarios

  • victor
    20 de agosto del 2010

    MUCHAS GRACIAS, ESTO ERA LO QUE ESTABA BUSCANDO, ME AS AYUDADO MUCHO :D

  • Neilmas
    24 de septiembre del 2010

    gracias Edwin, nos encontraremos por Puno todavia por diciembre estoy seguro que me va ser de gran utilidad.

  • jronal
    2 de agosto del 2011

    Hola, buen aporte, ahora justo estoy con generacion de reportes.

  • Oscar
    25 de agosto del 2011

    De favor podria alguien pasarme esta clase class.excel.writer.php
    Saludos/Gracias.

  • mcedwin
    25 de agosto del 2011

    Oscar, esta en el primer link, pero aquí la dirección: http://www.mcedwin.com/excel/class.excel.writer.php.txt

  • miranda
    6 de octubre del 2011

    No estan disponibles los archivos de los enlaces, podrias subirlos nuevamente

  • mcedwin
    6 de octubre del 2011

    Gracias por el aviso, ya están disponibles los archivos.

  • miranda
    7 de octubre del 2011

    Gracias!!

  • Israel
    19 de enero del 2012

    Hola Edwin muchas gracias por el aporte , funciona muy bien la libreria; de casualidas tendras algun ejemplo que utilice una base de datos desde la que se extrae la informacion para enviarla a un archivo en excel, saludos

  • samantha
    1 de marzo del 2012

    Hola, muchas gracias por la información, una pregunta: ¿es gratis?

    Gracias!

  • mcedwin
    1 de marzo del 2012

    Si es gratis, pero pagarías?

  • Eloisa
    21 de mayo del 2012

    Gracias por la información, una pregunta:¿Se puede añadir imagen?

  • Killer
    27 de mayo del 2012

    porque cuando se le coloca un borde o cualquier otra cosa que se le agrege ya no se alinean las celdas??? alguien me explica eso?

  • samantha
    31 de mayo del 2012

    si no es muy costosa si :)

  • JUAN DAVID
    5 de julio del 2012

    hola no me genera el documento de excel gracias mi correo es ingenierojuandavid_7@hotmail.com porfa necesito ayuda

  • Alex Aguilar
    7 de septiembre del 2012

    Hola muy bueno para la exportacion a excel, pero hay un pequeño problema con en esta linea de codigo ereg( “([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})”, ’07/08/2000′, $aFecIni);
    en versiones superiores de php 5.3.x sa este error Deprecated: Function ereg() is deprecated in C:\Ampps\www\PHPEXCEL\php-excel-demo2\class.excel.writer.php on line 249 la razon es que no la funcion ereg ha quedado obselo. Como se prodria solucionar este problema.

  • mcedwin
    7 de septiembre del 2012

    claro, es por el servidor: puedes remplazarlo por la funcion preg(“([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})”,…….

  • jose
    22 de septiembre del 2012

    hola, me gustaria saber como se saca un reporte pero consultando de una base de datos , les agradesco esa informacion.

  • MEGAMENTE
    9 de octubre del 2012

    PERO AS INTENTADO JALAR DATOS DESDE UNA BASE DE DATOS XK ES LO K YO NECESITO PARA JALAR LA INFORMACION DESDE UNA BASE DE DATOS Y EL TUYO SOLO ES QUE LE ASIGNAS LOS DATOS

  • dudito
    18 de octubre del 2012

    gracias amigo me fue de gran ayuda desde lima t deseo lo mejor en tus metas

  • Jise
    15 de noviembre del 2012

    HE PROBADO EL SCRIPT Y NO ME SALE NADA, QUE ECHO MAL AYUDA POR FAVOR.

    ‘int’,’border’=>’000000′); $xls_date = array(‘type’=>’date’,’border’=>’000000′); $xls_normal = array(‘border’=>’000000′); $textos = array(‘aaaa bbbb cccc ddddd’,’bbbb aaaaa dddd’,’cccc dsdsd’,’dddd asdfasdf’,’eeee asdfasdfw’,’erwssd ds werwwe v ytjrheth werwwe jdrfger werwwe kfghtr werwwe’,’gggg’,’hhhh’,’iiii’,’kkkkkk’); $colores = array(‘F17C0E’,’0012FF’,’06FF00′,’FF0000′,’AE00FF’,’BCA8E6′,’7E8D00′,’9D9D96′,’00789B’,’FF4E00′); $arr = array(‘ITEM’,’TEXTOS’,’ENTEROS’,’FECHAS’,’COLORES’); $xls->OpenRow(); foreach($arr as $cod=>$val) $xls->NewCell($val,false,array(‘align’=>’center’,’background’=>’666666′,’color’=>’FFFFFF’,’bold’=>true,’border’=>’000000′)); $xls->CloseRow(); for($i=0;$iOpenRow(); $xls->NewCell($i+1,false,$xls_int); $xls->NewCell($textos[$i],true,$xls_normal); //Auto alineado $xls->NewCell(rand(100,10000),false,$xls_int); $xls->NewCell(date(‘d/m/Y’,time()+24*60*60*$i),false,$xls_date); $xls->NewCell(rand(100,10000),false,array(‘type’=>’int’,’width’=>’250′,’color’=>$colores[rand(0,9)],’background’=>$colores[rand(0,9)],’border’=>’000000′)); $xls->CloseRow(); } $xls->GetXLS(); ?>

  • joel
    23 de noviembre del 2012

    a esta clase le funciona algo similar al colspan?

  • Andres
    9 de enero del 2013

    Saludos desde Colombia,

    aparece un error que dice:

    [Wed Jan 09 12:13:22 2013] [error] [client ::1] PHP Notice: Undefined index: type in /home/andres/workspace/sac/apps/escrutinio/includes/class/ExcelWriter.php on line 233
    [Wed Jan 09 12:13:22 2013] [error] [client ::1] PHP Notice: Undefined index: type in /home/andres/workspace/sac/apps/escrutinio/includes/class/ExcelWriter.php on line 236
    [Wed Jan 09 12:13:22 2013] [error] [client ::1] PHP Notice: Undefined variable: align in /home/andres/workspace/sac/apps/escrutinio/includes/class/ExcelWriter.php on line 294

  • Miguel Valverde
    22 de marzo del 2013

    Solución para los que le salen algunos problemas.

    1: problema: Notice: Undefined index: type in
    1: solución: buscar esta linea “if($style['type']==’int’){”
    y justo encima colocar “if(!isset($style['type'])) $style['type']=’normal’;”

    2: poblema: Undefined variable: align in
    2: solución: crear una variable al inicio del la función NewCell
    con el nombre y valor de : “$align = ”;”

    NOTA: El problema en ambos casos es que la variable que emplea no esta inicializada, por lo tanto lo hago es inicializarlo.

    Es mi solución, si alguien consigue una mejor manera… seria excelente.

    Saludos Miguel

  • Manuel
    18 de junio del 2013

    se puede usar esto a traves de, una consulta de una BBDD? y si es asi, como se podría usar?

  • Alexander
    18 de junio del 2013

    Hola … con esta clase, se puede crear otras hojas en el mismo libro¿

  • alexis
    4 de julio del 2013

    hola, gracias por la información proporcionada, tengo una consulta sobre el comportamiento del excel al momento de abrir el archivo, esto cuando se desea abrir grandes volúmenes de datos, arriba de 50000 o 60000 filas.

    gracias

  • Sergio
    24 de julio del 2013

    Buenas, interesante clase, me funcionó a la primera, excepto la fecha, me pone siempre 30/11/1999, lo que hice fue probar dejándola tal cual me la envia mysql, y después pasándola a castellano, pero siempre me sale mal.
    Me he fijado en el ejemplo, y puse mi fecha, con una coma y poniendo el timer aleatorio, pero nada, ¿alguna solución?.
    Gracias, sergio

  • jorge del castillo
    24 de julio del 2013

    estuvo fabuloso podrian ayudarme en algo mas por favor.
    Es en la creacion de graficos estadisticos apartir de datos que salen de una consulta a una base de datos…
    le agredeceria mucho si pueden ayudarme

  • Edison Arias
    2 de agosto del 2013

    Hola, no me funca el script, me sale esto:

    “‘int’); $xls_date = array(‘type’=>’date’); $textos = array(‘aaaa bbbb cccc ddddd’,’bbbb aaaaa dddd’,’cccc dsdsd’,’dddd asdfasdf’,’eeee asdfasdfw’,’erwssd ds werwwe v ytjrheth werwwe jdrfger werwwe kfghtr werwwe’,’gggg’,’hhhh’,’iiii’,’kkkkkk’); $arr = array(‘ITEM’,’TEXTOS’,’ENTEROS’,’FECHAS’); $xls->OpenRow(); foreach($arr as $cod=>$val) $xls->NewCell($val,false,array(‘bold’=>true)); $xls->CloseRow(); for($i=0;$iOpenRow(); $xls->NewCell($i+1,false,$xls_int); $xls->NewCell($textos[$i],true,$xls_normal); //Auto alineado $xls->NewCell(rand(100,10000),false,$xls_int); $xls->NewCell(date(‘d/m/Y’,time()+24*60*60*$i),false,$xls_date); $xls->CloseRow(); } $xls->GetXLS(); ?>”

    Alguien sabe que hacer con dicho problema???
    Muchas gracias.

  • mcedwin
    8 de agosto del 2013

    Revisando…., tratare de solucionar los problemas para esta noche GMT-5, disculpen la demora.

  • mcedwin
    9 de agosto del 2013

    Solucionado varios de los errores, pero para los usuarios avanzados les recomiendo PHPExcel http://phpexcel.codeplex.com/

  • Luis
    20 de septiembre del 2013

    Hola he implementado esta clase para un botón que extrae información de 3 columnas de una tabla que se muestra en html con jQuery, despues de presionar el botón, genero el excel y la descarga, mi pregunta es: como puedo establecer un nombre para el archivo excel, es que siempre tiene el mismo, hice algo así: function setNameFileExcel($name){ $this->name; } y en el archivo donde llamo la clase uso $xls->setNameFileExcel(“nombre del archivo excel”); y ya despues hago lo demas para generar el archivo, pero no me cambia el nombre al descargar, hay algo que podamos hacer? Gracias

  • Cris
    11 de octubre del 2013

    Hola.

    Tengo problemas con los números decimales. Siguiendo el mismo ejemplo que para números enteros, he puesto lo siguiente:
    $xls_double = array(‘type’=>’double’);
    $doubles = array(’4,6′,’3,6′,’8,4′,’5,5′,’6,2′,’4,2′,’2,3′,’6,4′,’4,56′,’5,55′);
    for($i=0;$iOpenRow();
    $xls->NewCell($doubles[$i],false,$xls_double);
    $xls->CloseRow();
    }

    Pero cuando se crea el archivo aparecen con formato texto (se quedan en el lado izquierdo) en vez de con formato numérico (alineados al lado derecho de la celda). Esto da problemas a la hora de realizar operaciones.
    ¿Podrías poner un ejemplo de cómo sería?

    Gracias

  • Mauro
    3 de abril del 2014

    Es posible realizar la suma de varios numeros de una columna y mostrar el resultado bajo esa columna??

  • Mauro
    3 de abril del 2014

    ya lo hice, gracias.

  • MarcePaz
    15 de abril del 2014

    Tengo un problema, estoy probando la clase, utilizo el primer ejemplo, pero me genera una archivo xml con los datos, en vez de generar el excel.
    Estaré haciendo algo mal??
    Una ayudita por favor.

    Gracias.

  • Jose Rodriguez
    14 de mayo del 2014

    Hola buenas tardes , la clase esta muy buena pero tengo un problema funciona perfecto de la columna A a la Z pero cuando llego a la Columna AA se daña el reporte , donde podria modificar o que debo hacer para q tome columnas sin limites. Muchas Gracias.

  • mcedwin
    14 de mayo del 2014

    Acabo de probar y no me sale ningún error sobrepasando de la A a la Z.

Deja tu comentario

(Iniciar sesión)

TECNato

TECNato nace de la idea de crear un espacio virtual de usuarios Peruanos para compartir conocimientos sobre TIC’s (Tecnologías de la Información y Comunicación)

Hazte miembro

TECNato es libre y abierto a nuevos miembros Peruanos, que estén dispuestos a compartir sus conocimientos en TIC’s, escribenos para mas detalles.

Soporte

Diseño Web:
Grupo Sistemas
Gestor de contenidos:
WordPress