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.

Publicado por @LasTenga

Programador, usuario Linux e hincha de Millonarios de Colombia

67 comentarios sobre “Generar archivos de Excel y Word desde PHP casi por arte de magia

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  12. Pingback: Dota 6.78 AI
  13. 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.

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

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

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

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

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

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

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

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

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

Replica a Luis Cancelar la respuesta