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

Tony
Publicado: 19/07/2010 4:16 pm

Me doy, finalmente lo hice asi:
lo encontre en:

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

<?php
ob_start("ob_gzhandler");
include ("funciones_sistema.php");
$comando = "SELECT `id` , `titulo` , `palabras` , `extracto`
FROM `busqueda`
WHERE `titulo` LIKE CONVERT( _utf8 '%tarjetas%'
USING latin1 )
COLLATE latin1_spanish_ci
AND `palabras` LIKE CONVERT( _utf8 '%tarjetas%'
USING latin1 )
COLLATE latin1_spanish_ci
AND `extracto` LIKE CONVERT( _utf8 '%tarjetas%'
USING latin1 )
COLLATE latin1_spanish_ci";
$resultado = comando_sql($comando);
header("Content-type: application/vnd.ms-excel;charset=latin");
header("Content-Disposition: attachment; filename=archivo.xls");
header("Pragma: no-cache");
header("Expires: 0");
echo " ";
echo " ";
echo "ID ";
echo "TITULO ";
echo "PALABRAS ";
echo "EXTRACTO ";
echo " ";
if ($resultado != false && mysql_num_rows($resultado) > 0)
{
while ( $datos = mysql_fetch_array($resultado, MYSQL_ASSOC))
{
echo " ";
echo "".$datos["id"]." ";
echo "".$datos["titulo"]." ";
echo "".$datos["palabras"]." ";
echo "".$datos["extracto"]." ";
echo " ";
}
}
else
{
echo " ";
echo "0 ";
echo "0 ";
echo "0 ";
echo "0 ";
echo " ";
}
echo " ";
ob_end_flush();
?>

LoThaR
Publicado: 16/08/2010 9:26 am

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
Publicado: 12/09/2010 5:11 pm

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

Juan Carlos
Publicado: 17/09/2010 2:42 pm

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
Publicado: 22/09/2010 7:22 pm

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

desde ya gracias

ivan
Publicado: 22/09/2010 7:23 pm

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


desde ya gracias

ivan
Publicado: 22/09/2010 7:23 pm

?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
Publicado: 06/10/2010 5:11 pm

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
Publicado: 06/10/2010 5:46 pm

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

}

enner
Publicado: 16/10/2010 10:15 am

como puedo hacer para que pueda correr en windows explorer

Tsuky
Publicado: 16/11/2010 11:01 am

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
Publicado: 31/03/2011 11:41 am

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
Publicado: 14/04/2011 3:56 pm

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
Publicado: 18/05/2011 5:33 am

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
Publicado: 18/05/2011 2:07 pm

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

Jaime Jeovanny Cortez Flores
Publicado: 23/06/2011 8:16 pm

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
Publicado: 23/06/2011 8:19 pm

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
Publicado: 26/06/2011 10:55 pm

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
Publicado: 28/06/2011 10:38 am

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

}

HeadBoxMaster
Publicado: 29/06/2011 1:41 pm

Que rayos es el «WB» y que demonios es el FOPEN?

Jacin Montava
Publicado: 27/07/2011 5:50 am

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

Saludos

mancinator
Publicado: 13/08/2011 11:26 am

muy buen aporte funciona bien si alguien funcionando al 100 con gusto saludos y gracias por el aporte

Marco
Publicado: 23/08/2011 7:14 pm

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
Publicado: 25/08/2011 11:20 am

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

juan calle
Publicado: 03/09/2011 11:55 am

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
Publicado: 15/09/2011 4:14 pm

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
Publicado: 04/11/2011 7:47 pm

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
Publicado: 07/11/2011 9:31 am

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
Publicado: 11/11/2011 1:09 pm

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
Publicado: 11/11/2011 1:13 pm

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
Publicado: 03/01/2012 2:56 pm

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
Publicado: 03/01/2012 3:37 pm

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

Irasema
Publicado: 31/01/2012 11:47 am

No funciona el ejemplo.

alex few
Publicado: 12/09/2012 10:48 pm

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

alex few
Publicado: 13/09/2012 9:35 pm

COMO INSERTO IMAGENES EN EXCEL DESDE PHP¡¡??

David
Publicado: 02/10/2012 12:32 pm

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

Alex
Publicado: 08/03/2013 4:07 pm

Infinitas gracias. Funciona perfecto.

Dan
Publicado: 22/08/2013 12:06 pm

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
Publicado: 25/09/2013 4:20 pm

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
Publicado: 26/09/2013 3:52 am

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.

Cesar
Publicado: 17/04/2015 10:37 am

hola alguien puede decirme porque cuando se crea el archivo de excel salen los datos en unsa sola celda asi: a:4:{i:0;a:2:{s:6:”Nombre”;s:7:”Mattias”;s:2:”IQ”;i:250;}i:1;a:2:{s:6:”Nombre”;s:4:”Tony”;s:2:”IQ”;i:100;}i:2;a:2:{s:6:”Nombre”;s:5:”Peter”;s:2:”IQ”;i:100;}i:3;a:2:{s:6:”Nombre”;s:6:”Edvard”;s:2:”IQ”;i:100;}}

Omar
Publicado: 24/07/2015 3:21 pm

Despues de todas las correcciones, me genera un xls, con la matriz deseada, sin simbolos raros.
Mi problema es ue no me abre el archivo .xml automáticamente y que en el navegador me sale «Pagina no disponible» ERR_INVALID_RESPONSE, estoy usando el Chrome

 

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>)