:::: MENU ::::

Generar Excel con PHP

La presente es una pequeña guía de como generar archivos en formato Excel utilizando PHP. Esto es muy interesante pues nos puede servir para generar reportes de nuestra base de datos a un archivo .xls el cual es un formato ampliamente utilizado.

Que necesitamos?

Lo primero que necesitamos es una clase llamada MS-Excel Stream Handler la cual contiene las funciones necesarias para crear archivos Excel. Ahora bien, esta librería permite la creación de los archivos pero no de manera intuitiva, basados en la documentación de esta clase me he tomado la libertad de crear un archivo llamado excel-ext.php que contiene una función que nos facilitará este proceso.

Para ello utilizaremos la función createExcel que recibe dos parámetros, el primero el nombre del archivo que deseas crear y el segundo un array asociativo con los datos a mostrar en el archivo generado.

createExcel("excelname.xls", array);

Creando nuestro primer Ejemplo

Entonces el primer paso es incluir el archivo excel.php y excel-ext.php en nuestro script php de la siguiente forma:

require_once("excel.php");  
require_once("excel-ext.php"); 

Lo siguiente es crear un array asociativo que contiene los datos a mostrar, para nuestro ejemplo creamos un array que contiene una lista de nombre y su IQ.

$assoc = array(  
			array("Nombre"=>"Mattias", "IQ"=>250),  
			array("Nombre"=>"Tony", "IQ"=>100),  
			array("Nombre"=>"Peter", "IQ"=>100),  
			array("Nombre"=>"Edvard", "IQ"=>100)
		 ); 

Luego el tercer y ultimo paso es crear el archivo Excel, para ello utilizamos la función createExcel, uniendo todo tendríamos:

require_once("excel.php");  
require_once("excel-ext.php");
$assoc = array(  
			array("Nombre"=>"Mattias", "IQ"=>250),  
			array("Nombre"=>"Tony", "IQ"=>100),  
			array("Nombre"=>"Peter", "IQ"=>100),  
			array("Nombre"=>"Edvard", "IQ"=>100)
		 );
createExcel("excel-array.xls", $assoc);
exit;

Esto generará un archivo excel con dos columnas llamadas Nombre y IQ con los datos creados en el array. Puedes ver el resultado funcionando en: php-excel/array.php

Crear Excel desde una Base de Datos

El siguiente ejemplo obtiene datos desde una base de datos MySQL y generará un archivo Excel como reporte. Para ello primero creamos una conexión a nuestra base de datos y consultamos la tabla empresa y luego colocamos los resultados en una matriz asociativa llamada $data.

require_once("excel.php"); 
require_once("excel-ext.php"); 
// Consultamos los datos desde MySQL
$conEmp = mysql_connect("localhost", "userDB", "passDB");
mysql_select_db("sampleDB", $conEmp);
$queEmp = "SELECT nombre, direccion, telefono FROM empresa";
$resEmp = mysql_query($queEmp, $conEmp) or die(mysql_error());
$totEmp = mysql_num_rows($resEmp);
// Creamos el array con los datos
while($datatmp = mysql_fetch_assoc($resEmp)) { 
	$data[] = $datatmp; 
}
// Generamos el Excel  
createExcel("excel-mysql.xls", $data);
exit;

Pueden ver el resultado de este ejemplo funcionando en php-excel/mysql.php. Finalmente les dejo los archivos fuente para que puedas revisar y hacer tus experimentos con lo aprendido en este post.


191 Comentarios

  • LoThaR |

    Hola,

    Cuando hay un session_start() en la pagina, no funciona. Arroja un error “El archivo esta dañado y no se puede abrir” (al menos con Excel 2007).

    Si quitamos el session_start() funciona correctamente. En mi caso lo necesito porque utilizo variables de sesión y get.

    ¿Hay forma de sortear este problema?

    Gracias.

  • Manuel |

    Hola disculpen pero tengo una duda
    como descargo la clase?
    De atemano gracias

  • Juan Carlos |

    necesitaba que el archivo se descargara y que no quedara en el server, después de tanto batallar y buscar en google sin tener resultados concretos, modifique el archivo excel-ext.php poniendole lo siguiente:

    $excelfile = “xlsfile://./”.$filename;

    hay que considerar que si la base de datos esta bacía devolverá un error, lo otro que encontré es que localmente si me funcionaba porque la base tenía datos pero a la hora de subirlo al server remoto colapsaba.

    me parece una buena herramienta pero bastante desatendida por parte del creador.

  • ivan |

    buen post ya no me salen errores pero no vuelca nada dentro del archivo sale vacio este es el codigo

    desde ya gracias

  • ivan |

    buen post ya no me salen errores pero no vuelca nada dentro del archivo sale vacio este es el codigo


    desde ya gracias

  • ivan |

    ?php
    require_once("excel.php");
    require_once("example_download.php");

    include("../editorial.php");

    $base = clientes;
    $seleccion = "*";

    $consulta = "SELECT $seleccion FROM $base";
    $resultados = mysql_query($consulta, $link) or die(mysql_error());
    $totales = mysql_num_rows($resultados);

    while($datatmp = mysql_fetch_assoc($resultados)) {
    $data[] = $datatmp;
    }
    createExcel("bbkkkk.xls", $data);

    exit;
    ?

  • christian |

    En resumen seria esto como dice muchos comentarios :

    crear carpeta tmp en la raiz ó en la carpeta donde esta la aplicación y copiar lo siguiente en el excel-ext.php a mi me funciono :

  • christian |

    function createExcel($filename, $arrydata) {
    $excelfile = “xlsfile://tmp/”.$filename;
    $fp = fopen($excelfile, “wb”);
    if (!is_resource($fp)) {
    die(“Error al crear $excelfile”);
    }
    fwrite($fp, serialize($arrydata));
    fclose($fp);

    header(“Content-type: application/xls”);
    header (“Content-Disposition: attachment; filename=\”” . $filename . “\”” );
    readfile($excelfile);

    }

  • Tsuky |

    excelente ejemplo :), ypor cierto felicidades por tan excelete web.
    Disculpa tengo una duda, en html hay tablas, las cuales tienen rowspan y colspan, lo equivalente en excel seria celdas combinadas, e buscado en google por un buen tiempo y no e encontrado ninguna libreria que me permita hacer celdas combianadas, o pasar los rowspan de html a excel, sabes alguna forma?
    Te agradeceria que me puedieras ayudar.
    De antemano gracias

  • Rolando |

    Hola!!

    muy bueno el script, cómo podría ir ingresando los datos(filas) de a poco?? sin que no se superponga con la información anterior. Si alguien me puede ayudar estaría muya agradecido.

  • jorge eduardo ayala |

    Ke tal tengo el mismo error que varios me arroja el resultado en una sola celda, ya e modificado las cabeceras como lo an propuesto algunos pero el error sigue si alguien a solucionado este problema comentenlo porfavor
    estoy apunto de casarme si no consigo esto me deja mi prometida jajaajajaj

  • dani |

    A quien tenga problemas con las rutas , aqui lo resuelve, en el comentario 4.
    Si alguien tiene alguna solución facil para el problema del amontonamiento de datos en la primera celda, se agradece.
    He de decir que demasiados problemas genera esta clase :(
    Un saludo.

  • FERNANDO |

    HOLA NECESTITO SABER SI PUDIERON SOLUCIONAR QUE EL RESULTADO SALE EN UNA SOLA CELDA
    AYUDA

  • Jaime Jeovanny Cortez Flores |

    Saludos, mi consulta radica en que necesito incluir Vinculos en cada fila del excel generado.

    Al colocar en el arreglo, lo siguiente:

    $data[] = array("FOTO"=>"&lta href=\"fotos/".$fila->ID_INTERNO.".jpeg\" target=\"_blank\"&gtFOTO&lt/a&gt",
    "FECHA REG"=>$fila->FECHA_REG,
    ...

    Me imprime en las celdas del archivo de excel la porción de código:

    &lta href=\"fotos/".$fila->ID_INTERNO.".jpeg\" target=\"_blank\"&gtFOTO&lt/a&gt

    y yo quiero el vinculo directo solamente para darle clic.

    ¿Se puede hacer esta funcionalidad en la clase? o habrá necesidad de agregarle algo extra al código.

    Agradeceré sus respuestas.

  • Jaime Jeovanny Cortez Flores |

    Saludos, mi consulta radica en que necesito incluir Vinculos en cada fila del excel generado.
    Al colocar en el arreglo, lo siguiente:

    $data[] = array(“FOTO”=>”<a href=\”fotos/”.$fila->ID_INTERNO.”.jpeg\” target=\”_blank\”>FOTO</a>”,
    “FECHA REG”=>$fila->FECHA_REG,

    Me imprime en las celdas del archivo de excel la porción de código:

    <a href=\”fotos/”.$fila->ID_INTERNO.”.jpeg\” target=\”_blank\”>FOTO</a>

    y yo quiero el vinculo directo solamente para darle clic.
    ¿Se puede hacer esta funcionalidad en la clase? o habrá necesidad de agregarle algo extra al código.
    Agradeceré sus respuestas.

  • wilson |

    y la duda de algo asi como esto a:12:{i:0;a:2:{s:7:”galones”;s:3:”213″;s:10:”id_maquina”;s:2:”10″;}i:1;a:2:{s:7:”galones”;s:3:”177″;s:10:”id_maquina”;s:2:”11″;}i:2;a:2:{s:7:”galones”;s:3:”117″;s:10:”id_maquina”;
    no la resolvio nadie :'(

  • wilson |

    Bueno ya que nadie parece prestar atencion a las preguntas, me contesto yo mismo y talvez sea posible lo conteste a alguin mas el problema de la celda que muestra todos los datos lo corregi con un pequeño cambio en el archivo excel-ext.php de nuestro amigo del blgo lo cambie y quedo de las siguiente manera:
    function createExcel($filename, $arrydata) {
    $excelfile = “xlsfile://”.$filename;
    $fp = fopen($excelfile, “wb”);
    if (!is_resource($fp)) {
    die(“Error al crear $excelfile”);
    }
    fwrite($fp, serialize($arrydata));
    fclose($fp);
    header (“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
    header (“Last-Modified: ” . gmdate(“D,d M YH:i:s”) . ” GMT”);
    header (“Cache-Control: no-cache, must-revalidate”);
    header (“Pragma: no-cache”);
    header (“Content-type: application/x-msexcel”);
    header (“Content-Disposition: attachment; filename=\”” . $filename);
    readfile($excelfile);

    }

  • Jacin Montava |

    Gracias, me ha venido de lujo.
    Y gracias tambien por el blog porque me ayuda un monton de veces con scripts,etc…

    Saludos

  • Marco |

    La respuesta a que el còdigo salga así

    {s:7:”galones”;s:3:”213″;s:10:”id_maquina”;s:2:”10″;}i:1;a:2:{s:7:”galones”;s:3:”177″;s:10:”id_maquina”;s:2:”11″;}i:2;a:2:{s:7:”galones”;s:3:”117″;s:10:”id_maquina”;

    es

    $arreglo= unserialize($datos); // convierte string a array

    lo que te permite acceder a $arreglo['galones'] cuyo valor es 213
    y así sucesivamente por registro

    Saludos

  • sam |

    ¿COMO LE HARÍA SI QUIERO COLOCAR LOS REGISTROS EN CELDAS NO CONTIGUAS???

  • juan calle |

    Hola.. he usado esta funcion y anda muy bien.. sin embargo cuando consulto un campo con mas de 256 caracteres excel lo abre con error y esa celda que deberia contener mas de 256 caracteres sale vacía.. alguien le ha sucedido?? como se soluciona??

  • Tato |

    Hola:
    Estoy probando el script y me funciona correctamente.
    Lo que no se como hacer es que los campos en excel me queden con formato numerico.

    Gracias

  • johnmax11 |

    a pesar que este codigo es muy viejo… lo empece a usar y me quede en problema de casi todos … los datos en la misma fila……………. y depsues d leer todos los comentarios…. reuslta que no era nada malo……

    solo que los que quieran usar la clase para guardar en algun lugar diferente el archivo.. solo ponen la ruta

    asi como sugeria srtooth y ya

    $excelfile= “xlsfile://xampp//htdocs//SITIO//Excel//”.$filename;

  • liz |

    hola me podrias ayudar me sale un error me sale todo en una sola linea y los registros salen con estos signos ??? que puedo hacer

  • leonaro |

    agregue el codigo de generacion a mi servido ,, todo al parecer funciona ,, sin embardo no me genera el archivo de excel, aparece nomas la pagina en blanco y no descarga ni guarda en ningun lado el archivo segun generado , y cuando lo ejecuto en mi localhost si lo genera sin error alguno agradeceria si supieran la solucion.

    Gracias excelente codigo.

  • leonaro |

    En mi localhost todo funciona perfectamente,,,
    sin embargo al subirlo a mi servidor no me guarda el archivo en ningun lado,, como sino lo generara ,, alguien sabria la solucion se lo agradeceria

    Gracias excelente codigo..

  • J |

    En linux funciona correctamente, en windows tiene el problema de la direccion donde se guarda el archivo, despues de solucionarlo, todos los registros me aparecen en una sola linea. a:1936:{i:0;a:91:{s:7:”AÑO_INF”;s:4:”2012″;s:10:”MUN_CODIGO” alguien lo corrigio?

    Gracias.

  • J |

    Gracias wilson esa era la solucion no la habia leido, el problema sigue siendo la ruta donde se guarda el xls, como esta ahi funciona bien para windows, para linux funciona correctamente el original.

    Feliz año a todos..

  • alex few |

    Saludos unijimpe podrias hacerme el favor de facilitarme algun tuto de phpexccel emitir reporte en execel desde una consulta mysql, o que interprete los datos en una tabla html y emita el reporte excel

  • David |

    Quiero agradecer personalmente a Zerts que gracias a su aporacion pude resolver lo que llevaba rato buscando gracias Zerts

  • Dan |

    Hola buen dia buen aporte solo que tengo una duda
    por que el excel que genera no me permite editarlo
    lo genera protegido contra escritura

  • david |

    Holaa está genial el código pero solo tengo una duda:
    ¿Al abrir el .xls, lo crea protegido contra escritura?, ¿me podrían ayudar a como cambiar esa configuración o alguna pista?

    De antemano muchas gracias,
    Saludos.

  • lucky |

    Yo no tengo mucha idea de php, por eso pregunto si alguien sabe como hacer un script para copiar dos campos de una tabla de una base datos de un servidor remoto y grabar el contenido de esos dos campos en dos campos de una tabla de una base de datos de mi página web. gracias.

Publica tu comentario

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.