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.

php
  1. 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:

php
  1. require_once("excel.php");  
  2. 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.

php
  1. $assoc = array(  
  2.             array("Nombre"=>"Mattias", "IQ"=>250),  
  3.             array("Nombre"=>"Tony", "IQ"=>100),  
  4.             array("Nombre"=>"Peter", "IQ"=>100),  
  5.             array("Nombre"=>"Edvard", "IQ"=>100)
  6.          );

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

php
  1. require_once("excel.php");  
  2. require_once("excel-ext.php");
  3. $assoc = array(  
  4.             array("Nombre"=>"Mattias", "IQ"=>250),  
  5.             array("Nombre"=>"Tony", "IQ"=>100),  
  6.             array("Nombre"=>"Peter", "IQ"=>100),  
  7.             array("Nombre"=>"Edvard", "IQ"=>100)
  8.          );
  9. createExcel("excel-array.xls", $assoc);
  10. 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.

php
  1. require_once("excel.php");
  2. require_once("excel-ext.php");
  3. // Consultamos los datos desde MySQL
  4. $conEmp = mysql_connect("localhost", "userDB", "passDB");
  5. mysql_select_db("sampleDB", $conEmp);
  6. $queEmp = "SELECT nombre, direccion, telefono FROM empresa";
  7. $resEmp = mysql_query($queEmp, $conEmp) or die(mysql_error());
  8. $totEmp = mysql_num_rows($resEmp);
  9. // Creamos el array con los datos
  10. while($datatmp = mysql_fetch_assoc($resEmp)) {
  11.     $data[] = $datatmp;
  12. }
  13. // Generamos el Excel  
  14. createExcel("excel-mysql.xls", $data);
  15. 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 191 comentarios


luman
Publicado: 14/10/2007 4:05 pm

Qué tal es esta clase para añadir imágenes, unir celdas… vamos, aplicar formatos a celdas y poner fórmulas?

unijimpe
Publicado: 14/10/2007 9:38 pm

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.

links for 2007-10-15 « D e j a m e S e r
Publicado: 15/10/2007 8:19 pm

[...] Generar Excel con PHP » unijimpe (tags: php xml) [...]

oidacra
Publicado: 20/10/2007 6:27 am

tremendo ejemplo…. hace años atras trate de hacer esto… y nunk encontre un ejemplo digno para hacerlo…. esta clase es lo maximo

leo
Publicado: 23/10/2007 2:55 am

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

luis
Publicado: 02/11/2007 12:10 pm

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

Carlos
Publicado: 04/11/2007 8:33 pm

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.

diego
Publicado: 07/11/2007 9:54 am

compliementi per l’articoli, saluti dall’italia

Jonathan
Publicado: 09/11/2007 1:55 pm

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

Cuitlahuac #9
Publicado: 12/11/2007 1:20 pm

Muy chido el codigo, no entiendo todo, pero lo puede hechar a andar, gracias.

Kacrism
Publicado: 13/11/2007 1:25 pm

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

Kacrism
Publicado: 13/11/2007 5:22 pm

Tengo un problema el archivo solo me muestra 22 registros a lo maximo, es esto correcto o tendria que configurar algun otro parametro?

gracias

luis ul
Publicado: 16/11/2007 10:26 am

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

lilia
Publicado: 26/11/2007 12:02 pm

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

Nancy
Publicado: 27/11/2007 8:04 pm

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

jose
Publicado: 29/11/2007 8:15 pm

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

Salo
Publicado: 07/12/2007 5:55 pm

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

mingo
Publicado: 26/12/2007 3:56 pm

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

quijote_shin
Publicado: 28/12/2007 6:52 am

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

quijote_shin
Publicado: 28/12/2007 7:15 am

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

quijote_shin
Publicado: 28/12/2007 7:30 am

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

fernando gibert
Publicado: 15/01/2008 1:41 pm

el ejemplo va pero tarda una barbaridad en bajar el fichero!!!!

xp sp2 2.00 GB
servidor unix va rapido en php + js . . .

gracias !!!!!

Eve
Publicado: 15/01/2008 9:55 pm

Hola, chicos quizas no he entendido pero hago la modificacion y me sigue dando el error
Error al crear xlsfile:……
me pueden ayudar?

mariano
Publicado: 17/01/2008 8:28 pm

hola, me interesa mucho el ejemplo, pero no me funciona, crea un archivo excel, pero con datos erroneos, como hago? Muchas gracias

wladtepes
Publicado: 22/01/2008 10:37 am

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

DDCw
Publicado: 22/01/2008 11:40 pm

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/

joel
Publicado: 25/01/2008 11:16 pm

la verdad no he podido hechar a andar el script, haber si alguien me puede hechar una mano,,,,

NG
Publicado: 30/01/2008 1:53 am

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

Tuxinga!
Publicado: 04/02/2008 12:25 pm

Muchas gracias, justo lo que necesitaba y funciona perfecto. Ahora veré si puedo buscar otra class que aplique formato.

nelson eduardo gomz correa
Publicado: 14/02/2008 10:09 am

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

Rodrigo Jaque
Publicado: 19/02/2008 5:44 pm

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.

rocesvinto
Publicado: 21/02/2008 1:54 pm

prueba esto:
$excelfile = “xlsfile://../tmp”.$filename;

Samuel
Publicado: 21/02/2008 3:18 pm

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

rocesvinto
Publicado: 22/02/2008 1:28 pm

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.

onlygoliat
Publicado: 28/02/2008 6:43 pm

Alguien solucionó el error de que el resultado solo salga en una celda???

Gracias

NASH
Publicado: 06/03/2008 4:02 pm

yaya, despues de mucho batallar, lo hice funcionar….
muchisimas gracias, excelentes librerias

Manuel
Publicado: 19/03/2008 10:51 am

Muchísimas gracias,, era lo que necesitaba.

Danilo Meneses Loaisiga
Publicado: 24/03/2008 1:54 pm

Aqui les dejo las modificaciones que hice y me funciono el Script:

Danilo Meneses Loaisiga
Publicado: 24/03/2008 1:54 pm

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

}

Danilo Meneses Loaisiga
Publicado: 24/03/2008 1:58 pm

Espero que les ayude a alguien mas!!

Rull
Publicado: 25/03/2008 12:38 pm

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.

Rolf Struppek
Publicado: 07/04/2008 4:04 pm

Excelente de verdad me ayudo su site!

Felipe Oyarzun
Publicado: 24/04/2008 2:40 pm

Muy buen ejemplo espero sigan así

ivan
Publicado: 28/04/2008 1:08 pm

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

gafeman
Publicado: 08/05/2008 5:02 am

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/

silvanha
Publicado: 09/05/2008 2:16 pm

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

Gustavo
Publicado: 15/05/2008 3:33 pm

A mi me ha salido un error que no puedo encontrar se a que se debe que no logro saber de donde, estoy en windows, y sale el clasico
Warning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\guerrero\admin\lib\excel-ext.php:20) in C:\xampp\htdocs\guerrero\admin\lib\excel-ext.php on line 10

No tengo ninguna salida cone cho ni nada, no encuentro porque.
i alguien le paso.
Saludos

Gustavo
Publicado: 15/05/2008 3:36 pm

Ya encontre el probelma unas lineas en blanco en el codigo al final,

Yenny
Publicado: 22/05/2008 11:32 pm

Alguien resolvio el hecho de que salen todos los datos en una misma casilla??? =S

Saludos.

Yranac
Publicado: 05/06/2008 6:57 am

Me has salvado la vida, un millón de gracias.

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

maria
Publicado: 10/06/2009 1:37 pm

hola me gustaria que me ayudaran en php. necesito comparar datos que esta en un archivo de txt extraido de excel

zerts
Publicado: 14/06/2009 5:01 pm

muy bueno el script
pero no e podido con las tildes y las ñ
alguien me puede ayudar lo estoy trabajando con mysql
gracias

zerts
Publicado: 16/06/2009 7:51 pm

Bueno ya pude arreglar lo del las tildes y las ñ

Toca cambiar en el archivo excel.php
en la linea 162 en la variable $val
por utf8_decode($val)
por lo cual la liea queda
“$size += $this->_xlsWriteCell($row, $col, utf8_decode($val));”

y eso es todo

Me di cuenta gracias lo q digo “gak”

Carla Figueroa
Publicado: 19/06/2009 8:37 pm

Excelente, me funciono de maravilla, gracias por tan valioso aporte, Dios los bendiga!!!!

johan
Publicado: 14/07/2009 2:47 pm

descargue la clase pero no viene esta clase
excel-ext.php
donde la baje o ke onda

michel
Publicado: 23/07/2009 9:53 am

justo lo que necesito pero la pregunta del millon es si puedo modificar el xls agregando datos y luego guardando en una BD

elbeto
Publicado: 27/07/2009 12:23 pm

Jenial aportacion.. tu funcion ademas hace que sea muy facil crear un excel sencillo para volcados de informacion.

Gracias…

Ivan
Publicado: 05/08/2009 10:09 pm

esta excelente y funciona a la perfeccciòn mi consulta es como puedo exportar en word con esta explicacion.

gracias y excelente sitio muchos exitos.

rodo
Publicado: 07/08/2009 12:49 pm

A mi me ha funcionado de maravilla el detalle es que deje de usarla unos meses y ahora que intente usarla nuevamente me genera el archivo en excel pero vacio, no me manda ningun error ni basura en el archivo.
ya probe la consulta en el manejador de bd y funciona sin problemas, alguien tiene alguna pista de que puede ser?

Gonzalo
Publicado: 10/09/2009 6:50 pm

tengo una duda dudosa

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

como hago para meter datos dinamicamente al array?? ya que tengo otro array ejemplo con el campo nombre y un array con el campo IQ
como lo puedo hacer? trate con un foreach pero no me resulto u.u

Vic
Publicado: 11/09/2009 7:40 am

Buenas, estoy intentando utilizar esto pero me da un error que he visto en estos comentarios:

Los datos creados me los mete dentro del explorador¿?
¿Que tengo que hacer para que me dalga la ventanita del abrir y guardar?
Gracias

Ana
Publicado: 19/09/2009 1:35 pm

Hola, estoy tratando de utilizar el código que es fácil de enteder pero tengo un problema

primero en el excel-ext.php cambie la sentencia
$excelfile = “xlsfile://tmp/”.$filename;
por
$excelfile = “xlsfile://”.$filename;
para evitar este error
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

Se supone que sale la ventana para direccionar y guardar el archivo pero me sale el siguiente mensaje “Internet explorer no puede descargar mysql.php de localhost Internet explorer no puede abrir este sitio internet. El sitio solicitado no esta disponible o no se encuentra. Intente de nuevo mas tarde”, lo curioso es que el archivo se genera bien y se guarda en la raiz de mi unidad.

Se debe efectuar alguna configuración en el internet explorer o en el php.ini ???? …………Espero que alguien me pueda ayudar …… NO soy experta en php recien me inicio en este lenguaje de programación

Saludos,
Ana

pablo
Publicado: 23/09/2009 10:37 pm

AMIGazooo!!!
MUCHAS GRACIAS POR SU TUTORIAL EL ARCHIVO EXCEL NO ME FUNCIONO.. PERO ME FUNCIONO EL DE MYSQL QUE ERA EL QUE NECESITABA… MIL GRACIAS AMIGO

CHAU!!!

jhonoo
Publicado: 27/09/2009 5:11 pm

Gracias por esta información. Me ha sido de gran utilidad. Pero también sugiero que echen un vistazo a:

http://www.tutores.org/?codigo=1512&Exportar-php-a-un-archivo-Excel&q=exportar%20php%20excel

¡Hasta pronto!

Adriana
Publicado: 14/10/2009 8:20 pm

Notice: Undefined index: path in C:\wamp\www\muestras\excel\excel.php on line 74

Notice: Undefined variable: size in C:\wamp\www\muestras\excel\excel.php on line 162

Son los dos errores que me salen y no se porq!!

ayuda plis!!

Eowyn
Publicado: 15/10/2009 6:02 pm

hola mi duda es ke si tengo un formato en excel y quiero realizar consultas de mysql y quiero k esas consultas salgan en el formato de excel…
mediante php

alguien me ayudaria??

Oscar
Publicado: 16/10/2009 4:13 am

Hola , si que funciona, en windows hay que hacer algún cambio.

En excel.php linea 74 hay que poner esto, cosa que está comentado con anterioridad en este foro.

$this->xlsfilename = $url['host'] . $url['path'];

Y en createExcel

$excelfile = “xlsfile://”.$filename;
Para dejarlo en el mismo directorio.

Así que gracias a todos los aportes anteriores.

Dori
Publicado: 30/10/2009 5:05 pm

Gracias, por el codigo me sirvio mucho

Francisco Garmendia
Publicado: 01/11/2009 3:33 pm

No se si alguien pueda ayudarme, el codigo esta muy bien pero no he podido adaptarlo, en si lo que quiero que haga es que cada vez que ingrese una información en mi pantalla de ingresos me lo refleje inmediatamente en el archivo xls, lo he logrado hacer con txt y un html pero con este script simplemente se me encima la primer fila con el ultimo dato introducido no me baja la fila anterior y no respeta la informacion anterior, se encima en la misma fila, abra forma de hacer que siempre escriba en la primer fila mandando el dato anterior a la fila anterior con este script…saludos

Esteban
Publicado: 08/11/2009 9:50 pm

Excelente !!! Muchisimas gracias y la verdad felicitaciones !! Gracias nuevamente..

Esteban
Publicado: 08/11/2009 11:54 pm

Para solucionar el error en SErvidor Remoto, yo directamente le puse un nombre estatico al archivo. Habria que probar de trabajarlo variable, no creo que haya problema. Las lineas a cambiar serian asi:

en excel-ext.php
linea 3
$excelfile = “xlsfile://inst_d74.xls”; //mio
linea 18
header (“Content-Disposition: attachment; filename=inst_d74.xls” );//mio

en excel.php
linea 74
$this->xlsfilename = “inst_d74.xls”;//mio

Lo simplifica pero anduvo. Saludos y gracias por los aportes a todos

Juan Carlos Altan
Publicado: 09/11/2009 3:38 pm

alguien me puede explicar si tengo que instalar la clase en un directorio en especifico. Gracias

Luis
Publicado: 19/11/2009 11:03 pm

example_export.php

<?php
/**
* MS-Excel stream handler
* Excel export example
* @author Ignatius Teo
* @copyright (C)2004 act28.com
* @date 21 Oct 2004
*/
require_once "excel.php";
$filexls="file.xls";
$export_file = "xlsfile://".$filexls;
$fp = fopen($export_file, "wb");
if (!is_resource($fp))
{
die("Cannot open $export_file");
}

// typically this will be generated/read from a database table
$data= array(
array("Sales Person" => "Sam Jackson2", "Q1" => "$3255", "Q2" => "$3167", "Q3" => 3245, "Q4" => 3943),
array("Sales Person" => "Jim Brown", "Q1" => "$2580", "Q2" => "$2677", "Q3" => 3225, "Q4" => 3410),
array("Sales Person" => "John Hancock", "Q1" => "$9367", "Q2" => "$9875", "Q3" => 9544, "Q4" => 10255),
);

fwrite($fp, serialize($data));
fclose($fp);

header ("Content-type: application/x-msexcel;charset=iso-8859-1");
header ("Content-Disposition: attachment; filename=\"" . $filexls . "\"" );
readfile($filexls);

?>

excel.php

= 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 xlsStream
{
/* private */
var $position = 0; // stream pointer
var $mode = "rb"; // default stream open mode
var $xlsfilename = null; // stream name
var $fp = null; // internal stream pointer to physical file
var $buffer = null; // internal write buffer
var $endian = "unknown"; // little | unknown | big endian mode
var $bin = array(
"big" => "v",
"little" => "s",
"unknown" => "s",
);

/**
* detect server endian mode
* thanks to Charles Turner for picking this one up
* @access private
* @params void
* @returns void
* @see http://www.phpdig.net/ref/rn45re877.html
*/
function _detect()
{
// A hex number that may represent 'abyz'
$abyz = 0x6162797A;

// Convert $abyz to a binary string containing 32 bits
// Do the conversion the way that the system architecture wants to
switch (pack ('L', $abyz))
{
// Compare the value to the same value converted in a Little-Endian fashion
case pack ('V', $abyz):
$this->endian = "little";
break;

// Compare the value to the same value converted in a Big-Endian fashion
case pack ('N', $abyz):
$this->endian = "big";
break;

default:
$this->endian = "unknown";
break;
}
}

/**
* called by fopen() to the stream
* @param (string) $path file path
* @param (string) $mode stream open mode
* @param (int) $options stream options (STREAM_USE_PATH |
* STREAM_REPORT_ERRORS)
* @param (string) $opened_path stream opened path
*/
function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path);
$this->xlsfilename = $url['host'] . @$url['path'];
$this->position = 0;
$this->mode = $mode;

$this->_detect(); // detect endian mode

//@TODO: test for invalid mode and trigger error if required

// open underlying resource
$this->fp = @fopen($this->xlsfilename, $this->mode);
if (is_resource($this->fp))
{
// empty the buffer
$this->buffer = "";

if (preg_match("/^w|x/", $this->mode))
{
// write an Excel stream header
$str = pack(str_repeat($this->bin[$this->endian], 6), 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
fwrite($this->fp, $str);
$opened_path = $this->xlsfilename;
$this->position = strlen($str);
}
}
return is_resource($this->fp);
}

/**
* read the underlying stream resource (automatically called by fread/fgets)
* @todo modify this to convert an excel stream to an array
* @param (int) $byte_count number of bytes to read (in 8192 byte blocks)
*/
function stream_read($byte_count)
{
if (is_resource($this->fp) && !feof($this->fp))
{
$data .= fread($this->fp, $byte_count);
$this->position = strlen($data);
}
return $data;
}

/**
* called automatically by an fwrite() to the stream
* @param (string) $data serialized array data string
* representing a tabular worksheet
*/
function stream_write($data)
{
// buffer the data
$this->buffer .= $data;
$bufsize = strlen($data);
return $bufsize;
}

/**
* pseudo write function to manipulate the data
* stream before writing it
* modify this to suit your data array
* @access private
* @param (array) $data associative array representing
* a tabular worksheet
*/
function _xls_stream_write($data)
{
$size=0;
if (is_array($data) && !empty($data))
{
$row = 0;
foreach (array_values($data) as $_data)
{
if (is_array($_data) && !empty($_data))
{
if ($row == 0)
{
// write the column headers
foreach (array_keys($_data) as $col => $val)
{
// next line intentionally commented out
// since we don't want a warning about the
// extra bytes written
// $size += $this->write($row, $col, $val);
$this->_xlsWriteCell($row, $col, $val);
}
$row++;
}

foreach (array_values($_data) as $col => $val)
{
$size += $this->_xlsWriteCell($row, $col, utf8_decode($val));
}
$row++;
}
}
}
return $size;
}

/**
* Excel worksheet cell insertion
* (single-worksheet supported only)
* @access private
* @param (int) $row worksheet row number (0...65536)
* @param (int) $col worksheet column number (0..255)
* @param (mixed) $val worksheet row number
*/
function _xlsWriteCell($row, $col, $val)
{
if (is_float($val) || is_int($val))
{
// doubles, floats, integers
$str = pack(str_repeat($this->bin[$this->endian], 5), 0x203, 14, $row, $col, 0x0);
$str .= pack("d", $val);
}
else
{
// everything else is treated as a string
$l = strlen($val);
$str = pack(str_repeat($this->bin[$this->endian], 6), 0x204, 8 + $l, $row, $col, 0x0, $l);
$str .= $val;
}
fwrite($this->fp, $str);
$this->position += strlen($str);
return strlen($str);
}

/**
* called by an fclose() on the stream
*/
function stream_close()
{
if (preg_match("/^w|x/", $this->mode))
{
// flush the buffer
$bufsize = $this->_xls_stream_write(unserialize($this->buffer));

// ...and empty it
$this->buffer = null;

// write the xls EOF
$str = pack(str_repeat($this->bin[$this->endian], 2), 0x0A, 0x00);
$this->position += strlen($str);
fwrite($this->fp, $str);
}

// ...and close the internal stream
return fclose($this->fp);
}

function stream_eof()
{
$eof = true;
if (is_resource($this->fp))
{
$eof = feof($this->fp);
}
return $eof;
}
}

stream_wrapper_register("xlsfile", "xlsStream")
or die("Failed to register protocol: xlsfile");
?>

Esto es para los q usan windows

Mi problema es ahora como puedo poner estilo al excel,por ejmplo q algunas celdas tengan el background azul,como lo hago?

ObjetivoPHP
Publicado: 25/11/2009 5:37 pm

En el sitio http://objetivophp.esp.st, tengo una rutina que nos permite exportar desde excel a mysql y tambien generar archivos excel a partir de una consulta mysql. La rutina se llama deame3p y necesita la libreria php_zip instalada y activada….
Como dato utiliza la clase phpexcel de codeplex…
Saludos y Suerte

Toolszigfrit
Publicado: 17/12/2009 4:45 pm

Bueno amigos, aquí les dejo un pequeño script para que puedan exportar desde la BD (mysql)…
<?php
header('Content-type: application/vnd.ms-excel');
header("Content-Disposition: attachment; filename=archivo.xls");
header("Pragma: no-cache");
header("Expires: 0");

$conEmp = mysql_connect("localhost", "root", "");
mysql_select_db("Nombre de la base de datos", $conEmp);
$queEmp = "consulta a la base de datos";
$resEmp = mysql_query($queEmp, $conEmp) or die(mysql_error());
$totEmp = mysql_num_rows($resEmp);

while ($reg=mysql_fetch_array($resEmp)){
echo "\n”;
echo “\n”;
echo “”.$reg["RUT"].”\n”;
echo “”.$reg["NOMBRES"].”\n”;
echo “”.$reg["APELLIDO"]. “\n”;
echo “”.$reg["DIRECCION"]. “\n”;
}
echo “\n”;
echo “$resEmp”;
?>

Saludos desde chile..

Juanra
Publicado: 24/12/2009 3:34 am

Buenas!

Está genial el script, pero alguien sabe como hacerlo funcionar sin usar fopen, es decir, sin guardar el archivo temporalmente en el server, estoy buscando soluciones como tenerlo en el buffer y después pasarlo a la salida estandar pero de momento no lo consigo.

Gracias!

Abraham Segura
Publicado: 02/01/2010 4:23 pm

para Toolszigfrit, oye tu script me deja descargar el excel pero no traigo nada en el archivo, me podrias ayudar???

toolszigfrit
Publicado: 04/01/2010 1:27 pm

Abraham Segura
EN QUE TE PUEDO AYUDAR……

egL86bcn
Publicado: 11/01/2010 10:21 am

Me sale todo en una sola celda :( !

es correcto esto ¿?¿? (teniendo en cuenta que $row va aumentando..)

$assoc[$row]['nombre'] = $nombre;
$assoc[$row]['fecha'] = $fecha1;
$assoc[$row]['hora'] = $hora;
$assoc[$row]['duracion'] = $duracion;

Jpatrick
Publicado: 15/01/2010 4:25 pm

Hola lo que me presentas me sirve, pero ahora hablemos de cuestiones de licencia.

Sin licencia no puedo utilizar esto en mi proyecto esta por demás decirlo es algo del mundo real. No me gustaría usar este recurso que me parece bueno pero después meterme en líos legales por cuestiones de autor

Adrián
Publicado: 28/01/2010 6:04 am

Yo he modificado el método createExcel añadiendo otra variable correspondiente a la ruta completa que a mí me interesa. Todo funciona ok y me crea el archivo xls, pero CONTINÚA EL PROBLEMA DE LOS DATOS EN UNA SOLA CELDA.
He probado a hacer cambios en las sentencias header pero no llego a ningún resultado óptimo. ¿Alguien ha solucionado este problema?
Gracias.

JEp
Publicado: 09/02/2010 6:09 am

Excelente

Andres
Publicado: 16/02/2010 1:02 pm

Gracias DDCw!!!!!

Hice los cambios y funciono perfactamente.

Eduardo
Publicado: 17/02/2010 1:17 pm

Hola buen día a todos
me corre y me genera el archivo excel sin ningun problema excel-ext.php
pero cuando hago una consulta a la base de datos no me corre mysql.php
alguien fuera tan amable si ya le corrio de poner el codigo o donde descargarlo el que funciona correctamente para generarl el excel consultando una base de datos
saludos dios los bendiga

Eduardo
Publicado: 18/02/2010 6:27 pm

ya me corrio saludos posteo ajala a alguien le sirva
god bless you

Aldo
Publicado: 22/02/2010 1:30 pm

hola…
el script me funciona pero todos los datos me aparecen en una sola celda
alguien me puede ayudar a corregir eso ?

sir homer
Publicado: 23/02/2010 10:37 am

Buenas aca te paso otro codigo es mucho mas rapido y facil de usar

$excel = new COM("excel.application");
//creas nuevo libro
$excel->Visible = 1;
$excel->DisplayAlerts = 0;

$excel->Workbooks->Add();
//Agregas nueva hoja
$sheet =$excel->Worksheets(1);
$sheet->activate;
//Elegis la celda que queres modificar
$cell = $sheet->Cells(2,4);
$cell->Activate;
$cell->Interior->ColorIndex = 3;
$cell->BORDERS->Weight = 2;
$cell->value = 'myvalue';
$cell = $sheet->Cells(1,1);
$cell->Activate;
$cell->Interior->ColorIndex = 15;
$cell->value = 'myvalue3';
$sheet =$excel->Worksheets(2);
$sheet->activate;
$cell = $sheet->Cells(2,4);
$cell->Activate;
$cell->Interior->ColorIndex = 4;
$cell->value = "Chr(193)";
$filename = tempnam(sys_get_temp_dir(), "excel");
$excel->Workbooks(1)->SaveAs($filename);

$excel->ActiveWorkBook->Close();
$excel->Quit();
readfile($filename);
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment;Filename=document_name.xls");
unset( $excel );

unlink($filename);

jobu
Publicado: 03/03/2010 1:49 am

que tal como estan ??

la aplicacion de la consulta a la base de datos me funciona bien, me genera el archivo correctamente pero solo en unos casos.

cuando hago consultas que obtienen muchos registros, no se me genera el archivo excel y me sale este error de memoria:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 10 bytes) in C:\AppServ\www\excel.php on line 208

que puedo hacer para solucionarlo ??
les agradezco !

jobu
Publicado: 03/03/2010 1:58 am

ya supe como solucionar el problema de memoria que tenia !

elproblema es que el limite de memoria por defecto es de 8 MB, entonces se debe aumentar con la siguiente linea de codigo al inicio del programa :

ini_set(“memory_limit”,”20M”);

espero que le sirva a alguien !

Viridiana
Publicado: 08/03/2010 2:42 pm

Hola esta muy bueno tu foro y me ayudado bastante, gracias y saludos

Oscar
Publicado: 18/03/2010 9:16 am

Hola usé la solución de Toolszigfrit

Se crea el archivo Excel, es decir se abre con los datos de my query pero no se guarda automáticamente en ninguna carpeta, ese es el problema que me falta resolver, tienen alguna sugerencia?

Este es el código:

= (DATE_SUB(now(), INTERVAL 35 DAY)) and REGISTROS_FS.FECHA_INI

New Document

Mes
TIPO
CANT_EVENTOS
TOTAL_HORAS

0){
do
{ ?>

0) {
mysql_data_seek($resEmp, 0);
$reg = mysql_fetch_assoc($resEmp);

}
}
?>

Oscar
Publicado: 18/03/2010 9:20 am

NO ME COPIA TODO EL CODIGO.
BASICAMENTE EL PROBLEMA ES QUE NECESITO QUE EL EXCEL GENERADO SE GUARDE EN UNA CARPETA DADA.

SE PUEDE HACER ESO?

Luis Enrique Fdez. G.
Publicado: 07/04/2010 1:08 pm

Muy bueno me fallo al principio por el enrutado despues el asunto de que me ponia todo en una sola celda pero leyendo los comentarios uni ideas y lo heche ha andar, asi quedo el excel-ext.php todo lo demas igual, si ha alguien le sirve ahi esta

NOTA: El archivo excel lo guarda en C: obvio eso se puede cambiar dandole la ruta especifica al $excelfile

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 . “.xls\”" );
readfile($excelfile);
}

percy
Publicado: 15/05/2010 4:43 pm

Hola gracias por la explicacion pero la pagina del contenedor de tu codigo (box.net) no se puede descargar si lo subieras a otro contenedor te agradeceria….graxias

Carlos
Publicado: 14/06/2010 4:11 am

el script me crea el excel pero todos los datos me aparecen en una sola celda
alguien me puede ayudar a corregir eso por favor?
gracias de antemano.

Alex Salazar
Publicado: 16/06/2010 1:37 pm

Excelente script me fue de mucha ayuda Gracias!!

emphasis034
Publicado: 09/07/2010 5:57 pm

Mi amigo OSCARIN me ayudo con los warnings que me aparecian y la solucion fue inicializar las variables XD.

ivan
Publicado: 13/07/2010 12:28 pm

me enterega los datos serializados en el archivo quien me puede ayudar con esto

Tony
Publicado: 19/07/2010 1:59 pm

Hola a todos,

Alquien ha solventado el problema de todos los datos en una sola celda?

Tony
Publicado: 19/07/2010 2:13 pm

En excel aparecen en la primera celda datos como

a:4:{i:0;a:2:{s:11:”First name;s:8:Mattias;s:3:IQ;i:250;}i:1;a:2:{s:11:First name….etc.

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.

 

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