Generar archivos de Excel y Word desde PHP casi por arte de magia

excel y word php arte de magia

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>&Aacute;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>&Aacute;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ó:

Tabla ejemplo jugadores millonarios

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.

About these ads
Acerca de

Programador, usuario Linux e hincha de Millonarios de Colombia

Tagged with: , , , , , , , , , , , , , , ,
Publicado en General, html, office, php
49 comments on “Generar archivos de Excel y Word desde PHP casi por arte de magia
  1. Ariel dice:

    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.

    • Don Estándares dice:

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

      • azucena dice:

        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

  2. Hola, muy buen dato este.
    Una pregunta ¿Para incluír imágenes hay que ponerlas tal cual como lo hacemos en html?

    Saludos!

  3. Eduardo dice:

    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.

  4. JUAN DAVID dice:

    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

    • Tipazo dice:

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

  5. PNG dice:

    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?

  6. Hugo dice:

    Cmo puedo hacer para que guarde el archivo automaticamente sin preguntarme si abrir o guardar. gracias

    • Tipazo dice:

      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.

  7. Erika dice:

    Hola lo he probado y no funciono no realiza la descarga del archivo, lo copie tal cual.

    • Tipazo dice:

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

  8. Tipazo dice:

    Brother me sirvio a la perfeccion, gracias por compartirlo. Exitos siempre.

  9. Carlos dice:

    ¡¡¡ Que capo !!!
    Mirá que le dí vueltas al tema… Que lo tiró…
    Excelente solución… Funciona de reyes…

  10. joaquinphi dice:

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

  11. el martirius dice:

    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.

  12. Marcos dice:

    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:

  13. sadejega dice:

    hay alguna forma igual a esta para cnvertir a pdf?

  14. Luis dice:

    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

  15. richard dice:

    Funciona de perlas!!!!!!!!!!! , gracias amigazo me salvaste la vida!!!!!!!!!!!!!!!!!!!!!!!!!

  16. Marco Sosa dice:

    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,

  17. Lupita dice:

    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

  18. Alex Madrid dice:

    Hola, creo que el código para word no funciona para word 2007 pero si para 2003 como se puede solucionar,saludos

  19. Julio Cesar dice:

    Hola puedo poner la hoja de manera horizontal con php

  20. snich dice:

    de funcionar funciona, pero me escribio con todo y etiquetas
    entonces no funciona tanto tanto
    pero la idea es esa, asi que gracias

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

  22. Roger dice:

    Hola tengo una plantilla quisiera saber como puedo modificarla desde php
    Muchas gracias

  23. Hola. Muy buen aporte, tengo una consulta como podria agregar una nueva sheet ?

  24. Juan dice:

    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…

  25. Luis Gonzalo dice:

    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

  26. Dota 6.78 AI dice:

    Dota map

    [...]you made running a blog glance[...]

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

  28. Quisiera saber como hago para crear un header y un footer con este tipo de codigo en word directamente desde php

  29. Alejandro dice:

    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

  30. sttull dice:

    hola, gracias, un dato faltan los archivos:
    application/vnd.ms-exce
    application/vnd.ms-word

  31. Marconi dice:

    muy bueno

  32. adolfo rios dice:

    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…

  33. mario dice:

    UN espectáculo- muchas gracias

  34. Luis dice:

    Es posible configurar o ajustar márgenes o área de impresión de la planilla xls antes de enviarla a descarga.?

  35. Patricio Toala dice:

    como puedo justificar un texto en word…

  36. mari dice:

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

  37. HUNAB dice:

    Todo me funciono Perfectamente, pero si quiero agregar una imagen??

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Sígueme en Twitter
Categorías
Flickr Photos
¡Apareció Linux!

Mirando de lado

Café

Más fotos
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 4.032 seguidores

%d personas les gusta esto: