Exportar registros a Excel automáticamente con PHP
Últimamente he trabajado con aplicaciones de registro de usuarios para distintos eventos, y una de las funcionalidades principales que requieren estos sistemas es la exportación en formato XLS (o de Excel) de toda la información, por lo que en este post les explicaré el procedimiento que utilizo para crear estos listados en formato excel.
Existen varias formas de conseguir crear estos archivos, y una de ellas es utilizar librerías disponibles en PEAR, o la muchas otras librerías que andan por ahí sueltas en la web, aunque para mi el paso mas sencillo y lmpio es: para cada de celda insertar un tabulador (\t) y para cada cambio de fila un salto de línea (\n).
Por ejemplo, para la siguiente tabla convertirla en un archivo Excel:
| uno | dos | tres | cuatro | cinco | seis |
| siete | ocho | nueve | diez | once | 4 |
| doce | trece | catorce | quince | 46 | ah |
Sería de la siguiente forma: A cada dato agregarle un tabulador después de que termina la celda, y al final de cada línea un salto del línea.
- <?
- echo "uno\tdos\ttres\tcuatro\tcinco\tseis\t\n";
- echo "siete\tocho\tnueve\tdiez\tonce\t4\t\n";
- echo "doce\ttrece\tcatorce\tquince\t46\tah\t\n";
- ?>
El código anterior si lo copiamos y guardamos en un archivo prueba.xls y lo abrimos en Excel, este ya lo interpretará en el formato de filas y columnas.
Ahora para que el código anterior funcione, forzamos enviamos al navegador headers identificando la salida de datos como un archivo de excel, y además forzamos la descarga para que este archivo pueda ser guardado.
- <?
- 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=\"prueba.xls\"" );
- echo "uno\tdos\ttres\tcuatro\tcinco\tseis\t\n";
- echo "siete\tocho\tnueve\tdiez\tonce\t4\t\n";
- echo "doce\ttrece\tcatorce\tquince\t46\tah\t\n";
- ?>
Otra forma de crear archivos legibles por Excel, es el formato CSV. Este formato para cada cambio de dato en lugar de un tabulador se inserta un ; (punto y coma), y para cada cambio de fila un salto de línea.
El ejemplo anterior para exportarlo en CSV, sería así:
- <?
- 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/vnd.ms-excel");
- header ("Content-Disposition: attachment; filename=\"prueba.csv\"" );
- echo "uno;dos;tres;cuatro;cinco;seis;\n";
- echo "siete;ocho;nueve;diez;once;4;\n";
- echo "doce;trece;catorce;quince;46;ah;\n";
- ?>
Todo lo anterior es sólo demostración: Si quisieramos exportar una base de datos, habría que recorrer cada uno de los registros e irlos mostrando en alguno de los 2 formatos anteriores para y así tendremos un archivo legible por excel.
Nota: Si se exporta gran cantidades de registros, es recomendable comprimir los la información en algun formato. Yo utilizo compresión en Zip, y me ha funcionado bastante bien.
sheryl
2009-12-15 09:31:53
hola lo q deseo saber es yo prove abrir un archivo de txt; osea abri una hoja excel guarde como arriba porf.txt
y a bajo puse csv(delimitado por comas ) y no le nada
por fa espero su respuesta
Néstor
2010-01-02 16:06:09
Hola,
Muchas gracias por el artículo, yo en su momento lo hice con una libreria, pero veo que lo pude haber hecho de una forma más sencilla.
Néstor
Néstor
2010-01-02 16:11:24
Hola
Muchas gracias por el artículo. Hace ya un tiempo necesitaba hacerlo y lo hice con una clase que encontre googleando, pero veo que era mucho más sencillo de lo que me pensaba.
Lo que no sabía era lo de separar en celdas, y claro con un tabulador, en fin, .. ha veces te rompes la cabeza con tonterias como estas.
Néstor
rodolfo
2010-05-13 16:01:27
gracias por tu codigo sirvio me sacaste de un apuro
Jero
2010-09-18 18:22:47
Hola! Muchas gracias por el script, me salvaste las papas. Te hago una consulta, cómo hago para que el excel me tome los caracteres especiales como "¿" o los acentos?
Saludos!!
Ness Gama
2010-10-06 14:59:10
Buen aporte, solo aclarar que en el CSV el separador debe ser la coma
echo "uno,dos,tres,cuatro,cinco,seis,n";
echo "siete,ocho,nueve,diez,once,4,n";
echo "doce,trece,catorce,quince,46,ah,n";
saludos
Victor De la Rocha
2010-11-01 15:39:04
Jero, prueba utf8_decode antes de mandar con echo la información.
Victor De la Rocha
2010-11-01 15:42:45
Ness Gama tienes razón, gracias por la aclaración.
Fitorec
2010-11-11 18:24:19
Otra seria la notación de tablas HTML.
luisme
2011-01-26 11:52:10
Hola gente, muchas gracias por el artículo y por las aclaratorias en el foro.... defenitivamtne entre todos podemos hacer mucho!!! Éxitos!!!!!! ;-)
chenteb
2011-04-03 01:47:08
llegue a pensar que esto de la exportacion de datos a excel desde php seria algo muy complejo pero me han dejado perplejo con la simplicidad, gracias y muy buen aporte me sacara de apuros
Jenny
2011-05-09 17:02:17
Hola mucho gusto, quisiera exportar algunos campos de una base de datos de oracle a un formato tipo CVS o SQL o MySQL, por ejemplo: necesito los campos de nombre, apellido, no. de identificación de esta base de datos no todos y tenerlos en un formato diferente para poder hacer querys o comparar datos de otra base, se puede?
alma
2011-07-08 15:54:15
hola...
me quisieran decir que en un algoritmo
Ana Rivera
2011-10-05 12:37:05
Hola, que buen aporte, me salió a la primera, estos ejemplos son los que me gustan faciles, amigables, entendibles y sobre todo funcionales muy bien, felicidades colega!.