En algunos proyectos sea personales o de oficina, necesitamos generar archivos Excel y Word desde PHP. a diferencia de formatos abiertos (los que comúnmente maneja Libre Office y otras offimáticas libres) que tienen mayor documentación, los archivos de propiedad de Microsoft son muy cerrados lo que dificulta la documentación.
Generar archivo EXCEL desde PHP
Lo primero que tenemos que entender, es que una hoja de cálculo es una tabla gigante, por lo tanto cuando vayamos a exportar, lo que exportaremos es una tabla HTML.
Una tabla de ejemplo de algunos jugadores de mi equipo del alma Millonarios FC
<h1>Tabla de asistencias Pase-gol de los jugadores de Millonarios F.C.</h1> <table cellspacing="0" cellpadding="0"> <tr> <th>Pedro Franco</th> <th>Wilson Carpintero</th> <th>Álvaro Barros</th> <th>Mayer Candelo</th> </tr> <tr> <td>20</td> <td>80</td> <td>10</td> <td>34</td> </tr> <tr> <td>78</td> <td>90</td> <td>10</td> <td>02</td> </tr> </table>
con esta tabla, procedemos a insertarle en la parte superior un código PHP que es el que generará el archivo de Microsoft Excel:
<?php header('Content-type: application/vnd.ms-excel'); header("Content-Disposition: attachment; filename=nombre_del_archivo.xls"); header("Pragma: no-cache"); header("Expires: 0"); ?>
Lo único que tenés que cambiarle es donde dice: «nombre_del_archivo.xls» y ya, ese es el nombre del archivo que genera.
El código final nos quedaría así:
<? header('Content-type: application/vnd.ms-excel'); header("Content-Disposition: attachment; filename=nombre_del_archivo.xls"); header("Pragma: no-cache"); header("Expires: 0");?> <h1>Tabla de asistencias Pase-gol de los jugadores de Millonarios F.C.</h1> <table cellspacing="0" cellpadding="0"> <tr> <th>Pedro Franco</th> <th>Wilson Carpintero</th> <th>Álvaro Barros</th> <th>Mayer Candelo</th> </tr> <tr> <td>20</td> <td>80</td> <td>10</td> <td>34</td> </tr> <tr> <td>78</td> <td>90</td> <td>10</td> <td>02</td> </tr> </table>
Guardás el archivo .php con el nombre que mirés adecuado, ejemplo tabla_jugadores_excel.php y lo abrís desde el la url normal, lo que te mostrará un cuadro de descarga del archivo excel que generó:
y listo :D, el entenderá cualquier modificación que le hagás a la tabla.
Generar archivo WORD desde PHP
Es el mismo proceso del archivo Excel, la diferencia es que acá ya no manejamos tablas (igualmente si necesitás manejar tablas las podés poner que el las formateará y las mostrará), vamos a ver un código de ejemplo:
<h1>Datos de Millonarios F.C.</h1> <ul> <li>Puesto histórico: 1º</li> <li>Temporadas en 1ª: 73 (Todas desde el inicio del profesionalismo 1948-2011).4</li> <li>Temporadas en 2ª: Ninguna.</li> <li>Mayor goleada conseguida:</li> <li>En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de julio de 1963). En torneos internacionales: 6-0, contra Universidad de Chile (8 de mayo de 1960) y Espanyol de Barcelona (11 de febrero de 1953).</li> <li>Mayor goleada en contra: En campeonatos nacionales: 0-6, contra Independiente Medellín (24 de julio de 1966) En torneos internacionales: 1-5, contra Independiente de Avellaneda (7 de junio de 1964). Gol 1.000: Marino Klinger Gol 2.000: Óscar Villano Gol 3.000: Juan Gilberto Funes Gol 4.000: Néstor Villarreal Gol 4.500: Orlando Ballesteros</li> <li>Mejor puesto en la liga: 1º (13 veces, en 1949, 1951, 1952, 1953, 1959, 1961, 1962, 1963, 1964, 1972, 1978, 1987 y 1988).</li> <li>Peor puesto en la liga: 17º (1 vez, en el 2004-II)53 Máximo goleador: Alfredo Castillo 133 goles (por Campeonato Colombiano)54 Mejor jugador de su historia: Alfredo Di Stéfano (151 goles en 172 partidos disputados del 14 de agosto de 1949 al 19 de febrero de 1953).</li> <li>Jugador que ganó más títulos: Francisco "Cobo" Zuluaga con 6 Campeonatos de la Primera A (1949, 1951, 1952, 1953, 1959 y 1961) y 1 Copa Colombia (1952-53).</li> <li>Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y solo perdió 2, marco 107 goles y tan solo le marcaron 37, para sumar 48 puntos (70 puntos de la actualidad).9</li> <li>Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin recibir gol (Récord en el fútbol profesional colombiano). Entre el 12 de septiembre y 14 de noviembre de 197155</li> <li>Mayor racha sin perder: 29 partidos en 1999 (Récord en el fútbol profesional colombiano)56</li> </ul>
Como podemos ver, ese es un ejemplo html normal con el que vamos a trabajar, ahora le agregamos la parte php que es la que nos generará el archivo para Microsoft Word
<? header('Content-type: application/vnd.ms-word'); header("Content-Disposition: attachment; filename=millonarios_fc.doc"); header("Pragma: no-cache"); header("Expires: 0"); ?>
Lo único que tenemos que hacer es cambiar el nombre de: millonarios_fc.doc por el que deseemos y ya.
el código quedaría así:
<? header('Content-type: application/vnd.ms-word'); header("Content-Disposition: attachment; filename=archivo.doc"); header("Pragma: no-cache"); header("Expires: 0"); ?> <h1>Datos de Millonarios F.C.</h1> <ul> <li>Puesto histórico: 1º</li> <li>Temporadas en 1ª: 73 (Todas desde el inicio del profesionalismo 1948-2011).4</li> <li>Temporadas en 2ª: Ninguna.</li> <li>Mayor goleada conseguida:</li> <li>En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de julio de 1963). En torneos internacionales: 6-0, contra Universidad de Chile (8 de mayo de 1960) y Espanyol de Barcelona (11 de febrero de 1953).</li> <li>Mayor goleada en contra: En campeonatos nacionales: 0-6, contra Independiente Medellín (24 de julio de 1966) En torneos internacionales: 1-5, contra Independiente de Avellaneda (7 de junio de 1964). Gol 1.000: Marino Klinger Gol 2.000: Óscar Villano Gol 3.000: Juan Gilberto Funes Gol 4.000: Néstor Villarreal Gol 4.500: Orlando Ballesteros</li> <li>Mejor puesto en la liga: 1º (13 veces, en 1949, 1951, 1952, 1953, 1959, 1961, 1962, 1963, 1964, 1972, 1978, 1987 y 1988).</li> <li>Peor puesto en la liga: 17º (1 vez, en el 2004-II)53 Máximo goleador: Alfredo Castillo 133 goles (por Campeonato Colombiano)54 Mejor jugador de su historia: Alfredo Di Stéfano (151 goles en 172 partidos disputados del 14 de agosto de 1949 al 19 de febrero de 1953).</li> <li>Jugador que ganó más títulos: Francisco "Cobo" Zuluaga con 6 Campeonatos de la Primera A (1949, 1951, 1952, 1953, 1959 y 1961) y 1 Copa Colombia (1952-53).</li> <li>Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y solo perdió 2, marco 107 goles y tan solo le marcaron 37, para sumar 48 puntos (70 puntos de la actualidad).9</li> <li>Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin recibir gol (Récord en el fútbol profesional colombiano). Entre el 12 de septiembre y 14 de noviembre de 197155</li> <li>Mayor racha sin perder: 29 partidos en 1999 (Récord en el fútbol profesional colombiano)56</li> </ul>
Y listo, es así como podemos generar estos archivos de forma fácil y sin tanto rodeo. espero que les sirva, cualquier comentario abajo.
Hola Don Estándares!
Excelente artículo el que has publicado! Te felicito!
Una observación en el ejemplo de word. Para que me funcione correctamente tuve agregar los tags HTML y BODY…
Y me gustaría consultarte si sabes como insertar un Salto de pagina?
Saludos
A.
¡Hola!.
Lo del salto de página lo veo complicado :S. aunque podrías hacerlo con tablas y calcular aproximadamente hasta dónde darle el height a una tabla para que calce exactamente con el salto de página.
¡Saludos!
hola. me manda el archivo a guardar.. pero A mi me interesa ke tambien guatrde los datos que tiene la pagina por ejemplo el nombre de usuario, los gastos ke tiene en este caso, la pagina es sobre utilidades, so baja el archivo en 0, sin datos podrias ayudarme….
mi email
angelus_moon911@hotmail.com
Hola hago una consulta para mostrar datos en el word y no me los muestra
hola buenos dias, respecto a este tema, esta muy interesante, lo probé y me funcionó el programa solo, pero si lo mando llamar de otro programa php, me genera el reporte en la misma pantalla del programa que lo manda llamar
Supongo que con \n
Hola, muy buen dato este.
Una pregunta ¿Para incluír imágenes hay que ponerlas tal cual como lo hacemos en html?
Saludos!
Ese es un punto en contra, él no te incluye eso :(. lo siento.
Se pueden agragar imagenes, solo que debes sacarla de un enlace web, por ejemplo midominio/imagenes/gatitos.png
Una forma de gestionar de forma mucho más sofisticada la inserción de HTML en Word mediante PHP es con PHPDocX puedes ver un jemplo de uso en esta entrada de blog: Convert HTML to Word with PHP.
Gracias por tu aporte.
NO ME FUNCIONO ME BOTO ESTOS ERRORES
Warning: Cannot modify header information – headers already sent by (output started at c:\program files\easyphp1-8\www\practica\imsalud\principal.php:1) in c:\program files\easyphp1-8\www\practica\imsalud\principal.php on line 18
Warning: Cannot modify header information – headers already sent by (output started at c:\program files\easyphp1-8\www\practica\imsalud\principal.php:1) in c:\program files\easyphp1-8\www\practica\imsalud\principal.php on line 19
Warning: Cannot modify header information – headers already sent by (output started at c:\program files\easyphp1-8\www\practica\imsalud\principal.php:1) in c:\program files\easyphp1-8\www\practica\imsalud\principal.php on line 20
Warning: Cannot modify header information – headers already sent by (output started at c:\program files\easyphp1-8\www\practica\imsalud\principal.php:1) in c:\program files\easyphp1-8\www\practica\imsalud\principal.php on line 21
QUE AHGO GRACIAS
Juan Tienes asegurarte que antes de poner el codigo php de los header, no tienes que tener un echo, espacio en blanco o caracteres basuras, ese erro es comun cuando sucede algo asi. =)
hola una consulta,
segui el ejemplo, pero cuando tengo dentro de una celda y lo abro en excel, se genera una fila combinada, lo que provoca que despues no se pueda filtrar el excel… alguna idea de como evitar esto?
aaaa me elimino lo que puse… era «cuando tengo dentro de una celda tengo una lista desordenada»
Cmo puedo hacer para que guarde el archivo automaticamente sin preguntarme si abrir o guardar. gracias
Para guardar el archivo php generado lo podes hacer asi file_put_contents(nombre_archivo, $codigo), yo asi lo tengo funciona bien, busca documentacion de file_put_contents para empaparte mas.
Hola lo he probado y no funciono no realiza la descarga del archivo, lo copie tal cual.
La descarga no se realiza solo asi, tienes que digitar en el browser el nombre del archivo.php generado, o simplemente agregale un link en tu codigo, con el nombre del archivo generado y listo. =)
Brother me sirvio a la perfeccion, gracias por compartirlo. Exitos siempre.
¡¡¡ Que capo !!!
Mirá que le dí vueltas al tema… Que lo tiró…
Excelente solución… Funciona de reyes…
Excelente codigo viejo….Otra consulta: se puede hacer un formulario donde se pida ingresar los datos y despues introcudirlos asi a excel:
$_POST[«goleador1»];
Por ejemplo, el usuario introdujo que el goleador fuera Pedro Franco y por tanto el valor de $_POST[«goleador1»]; es Pedro Franco y esto ultimo se guardaria en Excel.
He probado hacerlo asi obviamente con todo el resto de codigo que hace falta y nada, me crea el archivo en Excel pero no me guarda nada.
Como puedo solucionar esto?….Gracias.¡¡¡¡
una solucion muy confiable, la he puesto en pratica y funciona muy bien. claro con sus respectivas limitantes (hojas de estilo, imagenes) , y problemas para abrirlo con office 2012 y office 2013 diciendo que la extension no es correta que si deseamos abrir, le dice uno que si y funciona de maravilla son solo «pecatta minuta» gracias por el aporte.
Si no le anda deben abrir el tag php del código completo. de la forma simple asi como esta en este código a mi no me funciona.
Así no:
Así si:
No se ven los tags en mi comentario, ahora pongo con espacio:
//correcto
//incorrecto
hay alguna forma igual a esta para cnvertir a pdf?
Hola, me gusta mucho esta solución, sin embargo cuando el documento que quieres guardar, tiene imágenes, estas imágenes no se guardan y no salen en el doc.
puedes ayudarme con esto?
gracias
Funciona de perlas!!!!!!!!!!! , gracias amigazo me salvaste la vida!!!!!!!!!!!!!!!!!!!!!!!!!
Alguien me puede decir qué tengo que cambiar en los header para poder guardar el archivo en el servidor o para que la información que tengo agregarla a un correo y evitar que me mande el pop up para «save» en la computadora del usuario??
Gracias!!!
Saludos,
Alguien me puede ayudar yo tengo todas las indicaciones y en el primero funciono bien,tengo que realizar otros 2 y en segundo:
header(«Content-Disposition: attachment; filename=nombre_del_archivo.xls»); fue esta linea con otro nombre y otra informacion y no resulto
tiene que ver con permisos¿?, les agradesco su atención
Hola, creo que el código para word no funciona para word 2007 pero si para 2003 como se puede solucionar,saludos
Hola puedo poner la hoja de manera horizontal con php
de funcionar funciona, pero me escribio con todo y etiquetas
entonces no funciona tanto tanto
pero la idea es esa, asi que gracias
Lo hice tal como lo propones, pero tanto el archivo .xls como el .doc me los muestra como texto plano (sin formato). ¿Habrá algo que estoy haciendo mal=
Hola tengo una plantilla quisiera saber como puedo modificarla desde php
Muchas gracias
Hola. Muy buen aporte, tengo una consulta como podria agregar una nueva sheet ?
Buenas noches,
al generar un archivo con estos headers me aparece el siguiente mensaje cuando intento abrirlo:
El archivo que intenta abrir tiene otro formato que el especificado por la extension de archivo….
Como puedo hacer para que este mensaje no salga?
Gracias…
NO ME PÈRMITE MOSTRAR IMAGENES POR FA A VER SI ME AYUDAS CON ESO, QUIERO PONER UN LOGO EN EL WORD QUE SE GENERA
Hey There. I found your blog using msn. This is an extremely well written article.
I will be sure to bookmark it and return to read more of your useful
information. Thanks for the post. I’ll certainly comeback.
Quisiera saber como hago para crear un header y un footer con este tipo de codigo en word directamente desde php
saben como volver a leer el archivo que se generó con extension xls con el php ? necesito importar el archivo que se exportó y no encuentro la solucion. Gracias.
estoy utilizando http://sourceforge.net/projects/phpexcelreader pero dice que archivo xls no es legible.
die(‘The filename ‘ . $sFileName . ‘ is not readable’);
linea 390 – termina aca
hola, gracias, un dato faltan los archivos:
application/vnd.ms-exce
application/vnd.ms-word
perdon el nombre es:
application/vnd.ms-excel
muy bueno
amigo, una consulta, he realizado el ejemplo de pasar una consulta a Excel, coloco las dos líneas de código:
header(‘Content-type: application/vnd.ms-excel’);
header(«Content-Disposition:attachment; filename:reporte.xls»);
y solamente me muestra en pantalla la consulta pero no logro que salga la ventana que me permita grabarlo o abrirlo, algún consejo?
gracias por tu aporte y ayuda…
UN espectáculo- muchas gracias
Es posible configurar o ajustar márgenes o área de impresión de la planilla xls antes de enviarla a descarga.?
como puedo justificar un texto en word…
hola muchas gracias, probe y sale perfecto
el unico inconveniente que tengo es que , realizo mi consulta y directamente me abre un cuadro de dialogo en el que me dice si abro o guardo el archivo excel, que esto loq ue queria, pero no me muestra la consulta en mi sitio web. yo lo que quiero es ingresar un apellido y que me muestre todos los usuarios con ese apellido y ahi recien que el usuario si quiere elija la opcion de abrir en excel como hago eso???
Todo me funciono Perfectamente, pero si quiero agregar una imagen??
Hola Don Estandares, he seguido tu ejemplo y ejecute el archivo desde una url y no me muestra nada, solo veo la tabla y no me genero el excel.
Es posible formatear las celdas de excel? es que tengo valores que empiezan por cero y son texto y al abrir el excel los considera números, se puede hacer algo? gracias
buen aporte me sivio de mucho pero como se hace mediante una url y no por filename (archivo local) sino dandole una direccion url y que esa pagina la cambie a word gracias
Estoy utilizando el excel, me ha funcionado muy bien hasta el punto que necesito una gran cantidad de registros en una tabla, al exportarlo solo me muestra «» ¿Como puedo solucionar?
Hola, si quisiera agregar varias tablas en el mismo archivo, pero en diferentes hojas, es posible????
es posible pero con una libreria que se llama PhpExel (https://phpexcel.codeplex.com/)
es un poco mas complicado pero genera un archivo exel verdadero
Gracias!
Muy bueno…..solo que me descarga todo el contenido del sitio en el excel
Gracias, me quedé colgado en el último paso.
De la parte «y lo abrís desde el la url normal, lo que te mostrará un cuadro de descarga del archivo excel que generó» no entendí nada. Abrir desde la url normal? Y eso cómo se hace?
Muy bueno, solo una consulta. Si solo quisiera exportar una parte del documento, como puedo hacer esa referencia?
Hola, no me funciona
Hola, funciona perfecto, es posible que al filtrar la tabla solo me exporte lo filtrado. Saludos
Hola buenos días, alguien que me pueda ayudar, tengo un programa que genera un archivo en word y funciona cuando lo ejecuto solo, pero si lo mando llamar desde otro por medio de un botón no descarga nada
hola, pudiste solucionarlo?
realice cambios añadiendo nuevos datos a una tabla, en una web que usa esto para generar el excel, y ahora, abre todo en el navegador como web, no descarga el excel
No toque headers ni nada, solo añadi mas td al documento que debe generar
Muchas gracias, pude solucionar parcialmente una necesidad que tenía, me quedaron pendientes las imágenes; lo resolví guardando en la celda la url de la imagen en vez de la imagen, para que los usuarios presionen la direccion y le aparezca la imagen. Si alguien tiene resuelto el tema de imagenes, agradezco sus aportes.