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 [liga a="index.php?contenido=49"]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

[imagen en="/archivos/rtf1.jpg"]

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

[imagen en="/archivos/rtf3.jpg"]

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韈ulos relacionados:
Truco Como generar un archivo XLS desde PHP Truco Como generar un archivo .DOC de WORD desde PHP Recurso no clasificado 驴Que es la integridad referencial?