Generar Excel con PHP
- 14/10/2007
- 11:28 am
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.
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.
Luego el tercer y ultimo paso es crear el archivo Excel, para ello utilizamos la función createExcel, uniendo todo tendríamos:
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
-
$queEmp = "SELECT nombre, direccion, telefono FROM empresa";
-
// Creamos el array con los datos
-
$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.
Posts Relacionados
- Webthumb: Web ScreenShots
- Google Spreadsheets
- Crear PDF con Imagenes en PHP
- Generar PDF con PHP y MySQL
- PDFs con fondo utilizando PHP
Total de Comentarios: 46
Qué tal es esta clase para añadir imágenes, unir celdas… vamos, aplicar formatos a celdas y poner fórmulas?
Hola Luman, esta clase en sencilla y solo permite la generación de archivos Excel a partir de un array. Ahora si lo que deseas es una clase mas completa puedes utilizar PHPExcel (http://www.codeplex.com/PHPExcel/) que contiene una serie de funciones y metodos que te permitirá crear de forma muy detallada archivos Excel. La unica observación es que para su funcionamiento requiere PHP version 5.2.
[...] Generar Excel con PHP » unijimpe (tags: php xml) [...]
tremendo ejemplo…. hace años atras trate de hacer esto… y nunk encontre un ejemplo digno para hacerlo…. esta clase es lo maximo
Hola
No funciona el enlace del ejemplo de php-excel/array.php puede ser porque crea el array en $assoc y a la funcion le envia $data.
Baje la clase y la funcion para hacer facil el proceso y obtengo el ste error:
Warning: fopen(xlsfile://tmp/excel-array.xls): failed to open stream: “xlsstream::stream_open”
Donde se supone que va a crear el archivo?? en la misma carpeta del nuestro php.
Gracias
Disculpa pero ya logre usar la clase para generar desdes mysql a excel pero no me lo ordena en los registros de la tabla aparecen todos los datos en una sola celda porque? espero me puedas contestar te lo agradeceria muchisimo
Me gustó mucho el ejemplo pero he podido realizarlo porque no puedo descargar la clase, me registré en el site y aún no me han enviado una contraseña para poder entrar y descargar. Espero alguien pueda enviarme la clase que genera los excel, gracias.
compliementi per l’articoli, saluti dall’italia
Hola, he bsucado por todos lados pero no encuentro que hacer..
kiero pasar datos de consultas a excel, pdf, y rtf desde una base de datos en MS SQL en php pero no logro hacerlo, he bajado algunos ejemplos pero estan en mysql y al momento de adaptarlos a mssql me marcan errores supongo es porque no se trabaja igual en mysql ke en mssql… alguien que me pueda orientar.?
Muy chido el codigo, no entiendo todo, pero lo puede hechar a andar, gracias.
El primer comentario con respecto al primer link de array.php es correcto, el arreglo que se le pasa no es $data debe ser $assoc. y bueno la clase que se utiliza esta contenida en el archivo excel.php, la funcion que es intermediaria me parece excelente y reduce enormemente el trabajo :)
Gracias y saludos..
Tengo un problema el archivo solo me muestra 22 registros a lo maximo, es esto correcto o tendria que configurar algun otro parametro?
gracias
la verdad el codigo es muy sencillo y facil de entender, pero me marca un error al correrlo el error es : Warning: fopen(xlsfile://tmp/excel-mysql.xls): failed to open stream: “xlsstream::stream_open” call failed in c:\appserv\www\excel-ext.php on line 4
Error al crear xlsfile://tmp/excel-mysql.xls y se lo agradeceria a que me encharan la mano
disculpa pero al ejecutar el ejmplo me marca el siguiente error
Warning: fopen(xlsfile://tmp/excel-mysql.xls) [function.fopen]: failed to open stream: “xlsStream::stream_open” call failed in C:\xampp\htdocs\excel-php\excel-ext.php on line 4
Error al crear xlsfile://tmp/excel-mysql.xls
por favor me podrian decier como se puede corregir
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;}}
como puedo solucionar esto? Gracias
para hacer correr los ejemplos hay que cambiar en el ejemplo de array los datos que mandan por assoc.
y en el excel-ext.php cambiar
$excelfile = “xlsfile://tmp/”.$filename;
por
$excelfile = “xlsfile://”.$filename;
asi se guardara en el escritorio
el archivo
También tengo el error de lilia y luis, me puedes ayudar?
Warning: fopen(xlsfile://tmp/excel-mysql.xls) [function.fopen]: failed to open stream: “xlsStream::stream_open” call failed in /docs/php/excel-ext.php on line 4
Error al crear xlsfile://excel-mysql.xls
hola, muy interesante el codigo, pero el problema es que cuando hago que genere el xls me devuelve la informacion por pantalla y no dentro del xls.
alguien tiene alguna idea de porque hace esto?
desde ya muchas gracias
XD q wena me gusto
igual ta wena tbn la del phpexcel
más complejita
pero en wena tbm t digo q “$totEmp = mysql_num_rows($resEmp);” ta como sobrando en el ejemplo XD pero son detalles
nos vemos !!!
yo diria a krakism y lunam q ña varialbe $data está bien
a no ser q se refieran al primer ejemplo, $assoc no está ni declarada en el ejemplo de mysql, si la llama daria nulo.
a lo mejor se confunde con
mysql_fetch_assoc
que asocia la respuesta de mysql y ” ” la hace más descriptiva
como si usara $_POST.. ejemplo xD
salo, mira lo q dice jose es un gran punto,
no he probado aún el código, pero algo q podrian pobrar ustedes para no estar cambiando cógio y cógido… es crear un temp y poner sus archivos xls dentro …
parese q unjimpesan usa artos temporales por aí XD
yyy le gustan los temp XD yyy y yy temp temp
ooOOooOOHH! ! ! ! ! !! !! darle al path de tu archivo. ^^’
Quijote Shin
el ejemplo va pero tarda una barbaridad en bajar el fichero!!!!
xp sp2 2.00 GB
servidor unix va rapido en php + js . . .
gracias !!!!!
Hola, chicos quizas no he entendido pero hago la modificacion y me sigue dando el error
Error al crear xlsfile:……
me pueden ayudar?
hola, me interesa mucho el ejemplo, pero no me funciona, crea un archivo excel, pero con datos erroneos, como hago? Muchas gracias
probe el programa pero tengo el mismo drama del error
Error al crear xlsfile://tmp/excel-mysql.xls
pero parece que el quijote_shin tiene una buena solucion para este error
te pido que si me puedes explicar el asunto de los tmp que utiliza el codigo y asi poder hacer funcionar este ejemplo
te lo agradeceria mucho
me intereso mucho el ejemplo esta muy bueno pero tengo el mismo problema, realice estas modificaciones
$excelfile = “xlsfile://tmp/”.$filename;
por
$excelfile = “xlsfile://”.$filename;
y creo el archivo en C:/ cosa que no quiero ya que quiero que lo genere en la carpeta donde estoy trabajando… para lograr esto modifique el archivo excel.php de la siguiente manera:
$this->xlsfilename = ‘/’ . $url['host'] . $url['path'];
por
$this->xlsfilename = $url['host'] . $url['path'];
espero y les funciones
pueden checar la explicacion de la solucion en http://www.phpclasses.org/discuss/package/1919/thread/14/
la verdad no he podido hechar a andar el script, haber si alguien me puede hechar una mano,,,,
joel…el código esta perfecto. funciona correctamente, cual es tu problema… si quieres respuestas pues elabora bien tus preguntas o lo que quieres es que alguien te mande el código ya listo para usar….
Muchas gracias, justo lo que necesitaba y funciona perfecto. Ahora veré si puedo buscar otra class que aplique formato.
hola es muy interesanter tus ejemplos pero resulto un error cuando quiero mostrar un dato muy lrgo como un tipo longtext ya que no me muestra el valor que contiene sino que sale posible error por perdida de datos y no me los muestra que debo corregir para que tome cadenas de mayor longiru que las que esta tomando gracias y espero me puedas ayudar
Nancy
el problema que tu tienes se produce con el explorer (para variar) este programa trata de abrir el excel y salen esos numero.
Intenta ejecutando la api con mozilla u otro y verás que lo baja correctamente.
prueba esto:
$excelfile = “xlsfile://../tmp”.$filename;
Hola Colegas, e bajado y e realizado las modificaciones que salen aqui, pero cuando lo ejecuto me sale que Internet Explorer no puede encontrar el archivosy tengo en:
excel.php
$this->xlsfilename = $url['host'] . $url['path'];
y
excel-ext.php
$excelfile = “xlsfile://”.$filename;
Espero me puedad ayudar
samuel, tienes que hacer algunas cosas: en principio, asegúrate que tienes el path creado, y existe un directorio tmp… luego en el archivo excel-ext.php cambias lo siguiente:
línea 4:
$excelfile = “xlsfile://..”.$filename.”.xls”;
linea 16:
header (”Content-Disposition: attachment; filename=\”" . $filename . “.xls\”" );
tuve ese problema y lo he solucionado de esa forma.
Alguien solucionó el error de que el resultado solo salga en una celda???
Gracias
yaya, despues de mucho batallar, lo hice funcionar….
muchisimas gracias, excelentes librerias
Muchísimas gracias,, era lo que necesitaba.
Aqui les dejo las modificaciones que hice y me funciono el Script:
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(’Content-type: application/xls’);
header (”Content-Disposition: attachment; filename=\”" . $filename . “\”" );
readfile($excelfile);
}
Espero que les ayude a alguien mas!!
Hola, yo ya pude echar a andar la libreria y me funciona a la perfección, el detalle es que ahora ya superé el máximo de lineas permitidos por excel, que es de 65535, ahora me gustaría saber si se pueden hacer 2 hojas de cálculo en el mismo xls, para poder meter el resto de las lineas que me sobran, saludos.
Excelente de verdad me ayudo su site!
Muy buen ejemplo espero sigan así
ke tal, oye tu ejemplo me sirve pero necesito saber komo podria pasar esto a unas variables ke sako de una base de datos, es decir, presentar cierta cantidad de datos de cada tabla de una base de datos, me puedes ayudar? gracias
gracias por el ejemplo!
aunque no me ha funcionado para lo que queria, ya que he tenido problemas a la hora de poner unas filas personalizadas que no fueran indices
si alguien le sirve encontre esto:
http://www.phpsimple.net/tutorials/mysql_to_excel/
La solución que dio DDCw.. es la que me soluciono el problema.. mas que nada por la ruta donde lo crea.. es distinto en Linux que en Windows.. como ya sabemos xDD
mover excel.php de la siguiente manera:
$this->xlsfilename = ‘/’ . $url['host'] . $url['path'];
por
$this->xlsfilename = $url['host'] . $url['path'];
y listo! solo confirmo para que sepan porque el error ^^
TKS! por el ejemplo me saco de un gran apuro ^^
xoxo ;)

