ElTicus.com

Programación, lenguajes y recursos para programadores

Truco
Como generar un archivo .DOC/.RTF de WORD desde PHP (Incluyendo tablas)
Mandar la salida de un reporte directamente al Microsoft Word (2a entrega)
Publicado por JL Fecha: 2007-02-27 19:31:02 Idioma: Español Tipo de documento: Truco

Como generar un archivo DOC desde PHP


Segunda parte


NOTA: En la entrega anterior se explicaba como generar un archivo RTF desde PHP directamente manipulando el código fuente.
En esta versión, se amplió el código y se incluyó la generación de una tabla.
Cabe señalar que el código está bastante explicado y es facil pasarlo a otros lenguajes como es ASP o JAVA.

La idea consiste en generar un archivo de WORD y que este archivo se abra en el Microsoft WORD tal como si se tratara de un archivo .DOC, pero en realidad lo estaremos creando "al vuelo" desde nuestro programa en PHP.


Para generar una tabla

Para generar una tabla en RTF, se siguen los siguientes pasos:

  1. Se indica el margen izquierdo y la posición de la tabla.
  2. Se define la cantidad de Columnas y las características de cada celda (líneas y anchura)
  3. Se coloca el encabezado como un renglón con un fuente mas grande y negritas
  4. Se introducen en un ciclo el resto de las celdas

Cabe mencionar que el ancho de cada celda se determina indicando la posición del bordo derecho de la misma. y este se cuenta desde la posición 0 (cero) de la tabla. Por ejemplo si quiero tener 3 celdas del mismo tamaño y cada una de 1000 twips definiría los tamaños como 1000, 2000 y 3000.y con esto tendré 3 celdas iguales de 1000 cada una.

<?PHP



/*  Comenzamos a armar el documento  */
$output="{\\rtf1";   //<-- Iniciamos un documento RTF

$output.= "{\\fs48 Libros publicados}"; //<-- Texto de tamaño 48 para el Título
$output.= "\\par ";  //<-- ENTER       

$output.= "{\\fs30 Material didáctico}"; //<-- Texto de tamaño 30 para el Subtítulo
$output.= "\\par ";  //<-- ENTER
$output.= "\\par ";  //<-- ENTER

/* INICIO DE LA TABLA */

$output.= "{ ";  //<-- Inicio de la tabla

$output.= "\\trgaph70"; //<-- márgenes izquierdo y derecho de las celdas=70
$output.= "\\trleft-10"; // <-- Posición izquierda la primera celda = -10

/*  Definición de las celdas de datos. Se definen 4 columnas */
$output.= "
\\clbrdrl\\brdrw10\\brdrs
\\clbrdrt\\brdrw10\\brdrs
\\clbrdrr\\brdrw10\\brdrs
\\clbrdrb\\brdrw10\\brdrs 
\\cellx500

\\clbrdrl\\brdrw10\\brdrs
\\clbrdrt\\brdrw10\\brdrs
\\clbrdrr\\brdrw10\\brdrs
\\clbrdrb\\brdrw10\\brdrs 
\\cellx2500

\\clbrdrl\\brdrw10\\brdrs
\\clbrdrt\\brdrw10\\brdrs
\\clbrdrr\\brdrw10\\brdrs
\\clbrdrb\\brdrw10\\brdrs 
\\cellx5000

\\clbrdrl\\brdrw10\\brdrs
\\clbrdrt\\brdrw10\\brdrs
\\clbrdrr\\brdrw10\\brdrs
\\clbrdrb\\brdrw10\\brdrs 
\\cellx8700
"
;


/*Introducción de los títulos en el primer renglón*/
$output.= "{\\fs24\\b ";  //<-- Fuente de tamaño 24 y en negrita
$output.= "
No \\cell 
Título \\cell 
Autor \\cell 
Descripción \\cell 
}"
; 
$output.= " \\row "; //<-- Fin del renglón de encabezado

/* Introducción de los datos */
 $datos= array();
 $datos[]= array("1", "PHP para tontos" , 
                        "Brizuela, Guillermina" , 
                        "Este es un libro ficticio utilizado como Demo");
 $datos[]= array("2", "La inversión prudente" , 
                      "Luis Carlos Jemio" , 
                      "Impacto del bonosol sobre la familia, la equidad social.");
 $datos[]= array("3", "Diseño de proyectos de tecnología educativa" , 
                      "Victor de la Rocha" , 
                      "Con una propuesta totalmente visual, el video se convierte en ...");
                                                                   
foreach($datos as $v)
{
 $output.= " {$v[0]}\\cell {$v[1]}\\cell {$v[2]}\\cell {$v[3]}\\cell \n";
 $output.= "\\row "; //<-- Fin del renglón
}

$output.= "} ";  //<-- fin de la tabla

$output.= "\\par ";  //<-- ENTER


$output.="}"; //<-- Terminador del RTF


/* En los encabezados indicamos que se trata de un documento de MS-WORD
  y en el nombre de archivo le ponemos la extensión RTF.            */

header('Content-type: application/msword');
header('Content-Disposition: inline; filename=ejemplo1.rtf'); 
/*  Enviamos el documento completo a la salida  */
echo $output; 
?>


Como resultado de este código nos parecerá una ventanita como la siguiente

Y si elegimos "guardar" nos lo guardará como archivo con el nombre ejemplo2.rtf y si elegimos abrir con Microsoft Word nos invocará al mismo y nos aparecerá como se ve en la siguiente imagen

NOTA(8 de Marzo de 2007): Corregí el error que provocaba que el Word tuviera un desbordamiento al momento de despelgar el RTF en tablas demasiado grandes. La solución fue agregar un "\n" (ENTER) entre renglones en el ciclo for.

También pasé los encabezados al final. Esto permite que si hay algún error en el código, se muestre el error en el navegador y no truene en el Word.


NOTA(13 de Marzo de 2007): Corregido el problema de las dimensiones de la tabla. Cuando se trataba de poner más de una tabla, la segunda tabla tomaba los mismos atributos que la primera.

La solución fué encerrar el código de la tabla entre llaves {} para de este modo independizar cada una.




Hay 3 comentarios sobre este tema por parte de los lectores


Haz un comentario sobre este tema
Nombre email (no se muestra)
comentario:
Escribe las 2 letras que ves aquí: Imagen anti-spam =

Comentarios de parte de los lectores:

1. Comentario de Jose el 2016-04-24 13:51:33
Hola muy buenos días. Para generar un archivo rtf pero que la orientación del archivo sea horizontal, como podríamos lograrlo?

2. Comentario de Diego el 2015-07-20 14:54:04
Muchas gracias por la información, tengo una duda, como podemos agregar un encabezado y pie de pagina a un documento?

3. Comentario de Diego el 2015-07-20 14:53:54
Muchas gracias por la información, tengo una duda, como podemos agregar un encabezado y pie de pagina a un documento?


Artículos relacionados:
Truco Como generar un archivo XLS desde PHP Truco Como generar un archivo .DOC de WORD desde PHP artículo ¿Que es la integridad referencial?