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.

Comentarios Total 193 comentarios

romanzo
Publicado: 30/06/2008 9:25 pm

Hola podrian decirme como hago lo inverso, es decir de excel pasar los datos a mysql. Gracias

unijimpe
Publicado: 30/06/2008 10:51 pm

romanzo, lo que yo utilizo para importar datos de Excel (txt, sql, access, etc) es Navicat a mi parecer el mejor software para MySQL. Pueden leer algo de Navicat en Navicat: Cliente MySQL o puede ir directamente a PremiunSoft Navicat.

Ernesto
Publicado: 02/07/2008 2:07 am

Hola, tengo el problema de muchos y no veo algun post con la solucion, al crear mi excel me sale todo en una sola celda ejemplo: a:15:{i:0;a:4:{s:5:»clave»;s:1:» …

no sè si esto se deba a los headers:
header («Expires: Mon, 26 Jul 2005 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/xls’);
header («Content-Disposition: attachment; filename=\»» . $filename . «\»» );

HELP meeee!!!!

rhuerta
Publicado: 11/07/2008 1:55 pm

En el archivo de crear un excel con base de datos con php me marca el siguinte error
Fatal error: Call to undefined function: stream_wrapper_register() in c:\apache\htdocs\aclaraciones\excel.php on line 233
y no se que pasa si me pueden apoyar
gracias

rhuerta
Publicado: 11/07/2008 1:57 pm

de donde bajan las calses para que corra el excel en php

unijimpe
Publicado: 12/07/2008 11:03 am

rhuerta, la función stream_wrapper_register esta disponible a partir de la versión PHP 4.3.2, es muy probable que la versión que tienes no sea la adecuada.

Margarita
Publicado: 20/07/2008 12:13 am

Urgente!!

me muestra caracteres extraños en el excel!!!!

ayuda pliss

rafael
Publicado: 24/07/2008 1:51 pm

excelente lo monte y listo :p

funcionando si problemas

lo que me gustaria saber como generar distintas hojas.. de excel

:p

no se si sea mucho pedir,….

pero me sta funcionando muy bien el ejemplo….

gerrysito
Publicado: 28/07/2008 1:44 pm

poes yo ya lo hice, acomodado y todo, sin necesidad de fetch_array y eso

si kieren, contactenme =P

Benshin_sama
Publicado: 28/07/2008 3:15 pm

Yo le saque la ruta del fichero, solo deje $excelfile = «tmp/».$filename;

Eso genera el xls, pero me esta guardando mal los dato, no se que pasa

:S

Benshin_sama
Publicado: 28/07/2008 3:22 pm

Funciono, jojojojoj

Saludos!!

juan
Publicado: 11/08/2008 1:15 pm

hola compañeros:
Me tira este error cuando quiero ejecutar:

Warning: fopen(xlsfile://tmp/excel-mysql.xls) [function.fopen]: failed to open stream: «xlsStream::stream_open» call failed in C:\php5\PEAR\excel-ext.php on line 4

Laura
Publicado: 16/08/2008 1:25 pm

Hola Juan, es porq no tienes creada la carpeta tmp, lo que puedes hacer es modificar:
$excelfile = «xlsfile://tmp/».$filename;
por:
$excelfile = «xlsfile://».$filename; en excel-ext.php, te creara el .xls en c. Luego puedes modificar el excel.php de la siguiente manera:
$this->xlsfilename = ‘/’ . $url[‘host’] . $url[‘path’];
por
$this->xlsfilename = $url[‘host’] . $url[‘path’];
para que te lo cree en la misma carpeta de tu servidor. ^^

Alfredo
Publicado: 18/08/2008 10:54 am

Hola,este codigo se ve genial,tengo una pregunta muy estupida,por que la verdad soy nuevo con esto de programacion y linux,ya baje el paquete de librerias,donde tengo que ponerlo ?en que carpeta tengo que poner los archivos?para poder realizar la creacion de un archivo excel-php?es que ya lo baje y estaba haciendo un ejemplo,pero vi que no me agarra ninguno de los codigos,claro lo baje y esta en mi escritorio,no se donde vna las librerias!ayuda!!tengo ubuntu gutsy.
disculpen por la estupidez,soy novato.

Toto
Publicado: 01/09/2008 9:41 am

Somos varios con el problema de que el resultado lo genera en una sola celda, alguien lo pudo solucionar?
Saludos Martin Uruguay

Claudio
Publicado: 16/09/2008 3:15 pm

A mi tambien me genera una sola linea en excel cual es error ?

konsiensia
Publicado: 22/09/2008 10:13 pm

Bueno descubri algo importante.

si despues de hacer los cambios de :

$excelfile = “xlsfile://tmp/”.$filename;
por:
$excelfile = “xlsfile://”.$filename; en excel-ext.php, te creara el .xls en c. Luego puedes modificar el excel.php de la siguiente manera:
$this->xlsfilename = ‘/’ . $url[‘host’] . $url[‘path’];
por
$this->xlsfilename = $url[‘host’] . $url[‘path’];

———— y aun continua sin funcionar…. revisa los permisos de escritura.
si el archivo excel que genera y ke deja una copia en el servidor no tiene permisos de escritura 777 ó 755 genera ese error.

jorge
Publicado: 29/09/2008 5:55 am

Hola
Me gustaría poder poner algún texto en negrita, por ejemplo la cabecera de las tablas, pero por más que busqué no encontré nada. Fui capaz de modificar la clase para poder escribir a medida lo que quería, por ejemplo que solo mostrara como numéricos los campos de texto y que los arrays no sean asociativos:
include «excel.php»;

//Precondición los 3 arrays tienen el mismo número de columnas
class DatosTablasXls{
function DatosTablasXls($cabecera,$columNumReal,$tablaDatos){
$this->numColumnas = sizeof($cabecera);
$this->cabecera = $cabecera;
//Defino las columnas que son numeros reales {false,true}
$this->columNumReal = $columNumReal;
$this->tablaDatos = $tablaDatos;
}
}

/**
* MS-Excel stream handler
* This class read/writes a data stream directly
* from/to a Microsoft Excel spreadsheet
* opened with the xlsfile:// protocol
* This is used to export associative array data directly to MS-Excel
* @requires PHP 4 >= 4.3.2
* @author Ignatius Teo
* @copyright (C)2004 act28.com
* @version 0.3
* @date 20 Jan 2005
* $Id: excel.php,v 1.3 2005/01/20 09:58:58 Owner Exp $
*/
class xlsStreamTablas extends xlsStream
{
/**
* pseudo write function to manipulate the data
* stream before writing it
* modify this to suit your data array
* @access private
* @param (array) $datosFichaMonte class DatosGenerarFichaXls
*/
function _xls_stream_write($datos)
{
$size = 0;
if (!empty($datos))
{
for($col=0;$colnumColumnas;$col++){
$size += $this->_xlsWriteCell(0, $col, $datos->cabecera[$col]);
}
$row = 1;
foreach ($datos->tablaDatos as $filaDatos){
$col=0;
foreach($filaDatos as $valor){
if($datos->columNumReal[$col])
//Ya que sino corta los decimales
$size += $this->_xlsWriteCell($row, $col, floatval(str_replace(«,»,».»,$valor)));
else
$size += $this->_xlsWriteCell($row, $col, $valor);

$col++;
}
$row ++;
}
}
return $size;
}
}

stream_wrapper_register(«xlsfile», «xlsStreamTablas»)
or die(«Failed to register protocol: xlsfile»);

Si alguien pudiese ayudarme con lo de poder formatear mínimante los textos me ayudaría mucho.

diego
Publicado: 29/09/2008 8:43 pm

amigos….no entiendo cual es el archivo «excel.php»….
Soy nuevo en esto, saludos.

jorge
Publicado: 02/10/2008 8:56 am

Lo puedes encontrar en el enlace de arriba donde pone MS-Excel Stream Handler, en http://www.phpclasses.org/browse/package/1919.html

diego
Publicado: 03/10/2008 10:26 am

gracias por la respuesta….ya encontre la clase….otra pregunta. Al hacer correr el algoritmo en EASY PHP, me arroja el siguiente problema que no logro comprender:

Notice: fopen(): Unable to find the wrapper «xlsfile» – did you forget to enable it when you configured PHP? in c:\archivos de programa\easyphp1-8\www\prueba\excel-ext.php on line 4

Warning: fopen(xlsfile://tmp/excel-mysql.xls): failed to open stream: Invalid argument in c:\archivos de programa\easyphp1-8\www\prueba\excel-ext.php on line 4
Error al crear xlsfile://tmp/excel-mysql.xls

Laika
Publicado: 07/10/2008 6:52 pm

No entiendo que es eso de los permisos 777 y 775, y me sigue saliendo el mismo error a pesar de las modificaciones posteadas :(

Lisangel
Publicado: 15/10/2008 11:26 am

Para que me funcionara el primer ejemplo tuve que realizar los siguientes cambios:

1. En el excel.php en la linea #14 $this->xlsfilename = ‘/’ . $url[‘host’] . $url[‘path’]; lo cambie por $this->xlsfilename = $url[‘host’] . $url[‘path’];

2. En el excel-ext.php la linea #3 las comillas dobles («) que encierran «xlsfile://», hacen efecto de comentario a esa parte, se las borre y volvi a colocar y ya.. $excelfile = «xlsfile://».$filename; Me funciono!!.. Gracias por el ejemplo … Muy Bueno!

ann
Publicado: 28/10/2008 8:22 pm

saben como puedo dar formato a la hoja de excel aunque sea a los ecabezados :S

Rigo
Publicado: 05/11/2008 8:01 pm

A mi tambien me salen los resultados en una sola celda alguien ha podido solucionar el problema yo lo seguire intentando…

tania flores
Publicado: 27/11/2008 2:54 pm

disculpen, alguien tiene de casualidad el codigo excel.php para php en referente a exportar reportes desde php a formato .xls

Alejo
Publicado: 15/12/2008 10:08 am

Yo también saco los resultados en una única celda… :-( Somos los apestados de entre los exportadores a Excel… :_(

Pablo
Publicado: 17/12/2008 2:19 pm

Son los headers los que hacen que falle la escritura, saquenlos y se genera bien el excel… despues prueban los que necesiten

Saludos!

Fernando
Publicado: 18/12/2008 7:34 am

Hola a todos, tenia funcionando todo perfecto y ahora me da un error cuando trata de bajar el archivo, pero me lo genera perfectamente en el servidor, que puedo haber desconfigurado?,algun dato del php.ini?,o en apache? ayudaaaa

nestat
Publicado: 25/12/2008 11:55 am

Bueno eh probado el código y tampoco me funciono…me marcaba unos errores…lo primero fue solucionar lo del archivo excel-ext.php..que debe qdar algo asi:

$excelfile = «xlsfile://».$filename;

Despues en el archivo array.php hay que cambiar la linea:

createExcel(«borrame.xls», $data);

por

createExcel(«borrame.xls», $assoc);

espero esto solucione su error… XD

nestat
Publicado: 25/12/2008 11:57 am

ah por cierto el nombre del archvio borrame.xls….pueden poner el que ustedes quieran..solo que yo elegi ese XD

Emiliano
Publicado: 02/01/2009 6:53 pm

Buenas…. Alguien sabe como poner titulos etc…
Exporto de MYSQL…

quiero cambiar los titulos que por dejecto me pone los de la consulta…

Emiliano
Publicado: 03/01/2009 6:09 am

Ya lo solucione… Para quien lo quiera lo hice desde la consulta mysql

EJ:

SELECT nombre, direccion, telefono FROM empresa

Si lo dejamos así, muestra de titulo. El nombre de la tabla… Ahora si…

SELECT nombre ‘NOMBREQUEQUIERODETITULO’, direccion ‘DONDE VIVE’, telefono ‘NOMBREQUEQUIERODETITULO’ FROM empresa

Va a ponernos de titulos lo que pongamos… Como puse en DIRECCION en lugar de eso aparece lo que le digo… DONDE VIVE….

Espero les sirva… Ahora no me toma bien los acentos en el excel exportado… Pero le aclaro a la conexión…
mysql_query («SET NAMES ‘utf8′»);

Pero igual no lo toma…. Alguna idea ??

hugo
Publicado: 06/01/2009 9:13 am

He probado el código y en algunos casos si funciona, sin embargo en otros me muestra la opcion de descargar el archivo que contiene el código en este caso mysql.php y no el excel-mysql.xls

Podrian orientarme en cuanto a que puede estar fallando por favor..
Gracias…

gerardosch
Publicado: 20/01/2009 9:22 am

hola mi problema es que guarda el archivo en el servidor, no sale la ventana de guardar ni especificarle la direccion de donde quiero guardar el archivo, si alguien sabe algo de como solucionar este problema hagamelo saber porfavor…gracias :)

hackmaskate
Publicado: 16/02/2009 3:56 pm

Muy buen post!!! pero tengo una pregunta y espero me podas responder =) fijate que necesito pasar un archivo PHP a XLS pero… no con librerias que usen archivos especificos de EXCEL de Microsoft, porque yo uso open-office y no me funciona con esas librerias, me podrias responder aqui y por correo porfa =)

Diego González
Publicado: 03/03/2009 9:57 am

Como puedo hacer para cambiarle el nombre a la hoja que genero? Solo pone el nombre del archivo que he creado? Espero su respuesta, gracias.

Jose Luis
Publicado: 04/03/2009 11:45 am

Buenas, el primer ejemplo no funciona correctamente ya que no te hace bien el excel probandolo con los ficheros que hay para descargar en este post.

Alguien lo ha corregido???

Podrias poner el fichero bueno.

Gracias.

Jose Luis
Publicado: 04/03/2009 12:02 pm

Las modificaciones de $data por $assoc y demas ya estan. Es utilizando el ejemplo que el excel lo genera mal.

Un saludo!

srtooth
Publicado: 05/03/2009 2:42 pm

PAra cambiarle el nombre al archvo usen:

$excelfile= «xlsfile://xampp//htdocs//SITIO//Excel//».$filename;
y asi lo ubican en la direccion que quieran.

Yo tengo el problema que cuando ya esta en els ervidor no me lo exporta, tiene problemas al crearlo, por lo demas el codigo esta bien.

Jose Luis
Publicado: 06/03/2009 7:50 am

Bueno,

Sin ánimo de desmerecer al blog, ya que considero que es un gran blog con aportes muy buenos, aquí hay una solución super sencilla a la exportación en excel:

http://www.tutores.iexperto.com/?codigo=1512&Exportar-php-a-un-archivo-Excel

Y que; a mi almenos, me ha sacado rápidamente del apuro.

Chao.

Fernando
Publicado: 22/03/2009 1:14 pm

Hola a todos, tengo un problema, lo tenia funcionando perfecto, despues cambie el server , etc y cuando lo volvi a instalar no funciono mas.
Me genera el archivo en el server(raiz) y despues me sale un error en el navegador(cualquier navegador) que no encuentra archivo y obviamente no me lo baja. no se si sera algun valor de configuracion del php?

Javier Montaluisa
Publicado: 24/03/2009 6:42 pm

Por favor alguein quien me ayude tengo datos en un archivo de excel y quiero con php desplegar en una pagica como lo hago ayuda por favor inmediatamente

Noelia
Publicado: 04/04/2009 3:09 pm

Buenas tardes, muy bueno el código pero tengo dos preguntas puntuales: 1) cómo hago para que no genere el excel en el server (aquí lo está generando ok) ya que solo interesa generarlo en el cliente, es decir, en la dirección donde decida el usuario.
2) existe algun problema con el excel 2007? yo tengo instalado excel 2007, y cuando genero el excel en una ubicación o lo abro de inmediato, me sale código basura (datos raros).

Por favor, agradecería me den una ayudita.

Muchas Gracias.

Ares
Publicado: 07/04/2009 9:46 am

excelente, llevaba buscando precisamente la solucion a descargar una consulta a una base de datos MySQL en un archivo pdf, estoy en pañales con php.

Pero esuvo muy bueno el tutorial que incluso pude utilizar los archivos con solo cambiar los datos de la BD y la consulta por un join que nesecitaba hacer entre dos tablas.

Gracias viejo por compartir sus conocimientos.

carlos
Publicado: 15/04/2009 9:29 pm

Hola, gracias por el codigo me ayudo de mucho… solo tengo un problema, necesito que la hoja se llame diferente al nombre del archivo…(miarchivo.xls y dentro que tenga una hoja llamada hoja1) tendra alguna propiedad que haga eso?

Saludos!

gak
Publicado: 20/04/2009 7:40 am

Gracias por el código, es muy útil. Para los que tengan problemas con los acentos, yo lo solucioné así:
– En la línea 14 de excel-ext.php reemplacé por:
header («Content-type: application/x-msexcel;charset=iso-8859-1»);
– Y luego a los datos aplico utf8_decode().
Espero que sirva, a mi me funciona bien.

Saludos!

Diego
Publicado: 21/04/2009 4:23 pm

Hola Amigos
Gracias por el aporte, a mi me exporta a excel, pero la pantalla generada ademas de poseer los datos de la Base posee botones y campos de textos que la pagina tiene
Como puedo solucionar esto?

leo quiroz vicharra
Publicado: 18/05/2009 9:00 pm

no se pero es diferente que los demas

francisco duran
Publicado: 02/06/2009 3:33 pm

Hola necesito ayuda, he utilizado la libreria y me presenta problemas, supuestamente me descarga el archivo pero al tratar de abrirlo me dice que el formato esta errado.
Gracias

 

Comentar

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;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)