Você está na página 1de 25

Como generar un archivo DOC desde PHP

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.
Bueno, en primer lugar, este truco no nos genera un
DOC en realidad sino ms bien un archivo RTF, el cual
es muy similar al DOC y tambin, de igual modo, el
sistema nos lo va a abrir con el Word e incluso si
guardamos el archivo en el disco duro, lo veremos con el
mismo logito (o muy similar) al que nos muestra un
archivo .DOC real.
La razn de utilizar un RTF (Rich Text Format) es que
este es un archivo de texto enriquecido que nos
admite prcticamente las mismas propiedades que un
archivo DOC pero internamente se guarda en formato
ASCII, tal como si fuera un archivo de texto.
Para crear un archivo RTF simplemente tenemos que
conocer los cdigos que nos permitan establecer
negritas, ttulos, itlicas, tablas, imgenes, etc.
Como generar un archivo RTF
En primer lugar, deberemos poner las siguientes lneas
al inicio de nuestro programa PHP

header('Content-type: application/msword');
header('Content-Disposition: inline; filename=ejemplo.rtf');

Donde ejemplo.rtf es el nombre del archivo con que se


abrir en Word y tambin es el nombre con el que se
guardar en disco duro si el usuario elige esta opcin.
Este cdigo lo he probado con las varias versiones de
Word como son la 2000, 2002 y XP con buenos
resultados y debera de funcionar con cualquiera.
Tambien si una PC no tiene office instalado deber
funcionar con el WordPad de Windows tambien sin
problema.
Ejemplo completo:
El siguiente cdigo deber guardarse dentro de un
archivo PHP y ejecutarse desde el navegador.

<?PHP

/* En los encabezados indicamos que se trata de un docum


ento de MS-WORD
y en el nombre de archivo le ponemos la extensin RTF.
*/
header('Content-type: application/msword');
header('Content-Disposition: inline; filename=ejemplo.rtf');

/* Comenzamos a armar el documento */


$output="{\\rtf1"; //<-- Iniciamos un documento RTF

$output.= "{\\fs48 Internet Explorer 7}"; //<--


Texto de tamao 48 para el Ttulo
$output.= "\\par "; //<-- ENTER

$output.= "{\\fs30 El navegador Nmero 1}"; //<--


Texto de tamao 30 para el Subttulo
$output.= "\\par "; //<-- ENTER
$output.= "\\par "; //<-- ENTER

/* Parrafo */
$output.= "Windows Internet Explorer (tambin conocido an
tes como Internet Explorer, IE o MSIE)
es un navegador de Internet producido por Microsoft para s
u plataforma
Windows y ms tarde para Apple Macintosh. ";
$output.= "\\par "; //<-- ENTER

/* Parrafo */
$output.= "El 18 de octubre de 2006, Microsoft lanz la vers
in
nmero 7 de Internet Explorer. Entre otros detalles el progr
ama fue
renombrado a Windows Internet Explorer, como muestra de

la integracin de la aplicacin con el Sistema Operativo.


IE7 esta disponible solamente para Windows XP Service P
ack 2,
Windows Server 2003 Service Pack 1 y ";
$output.= "{\\b Windows Vista}."; //<-- Poner negritas

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


$output.= "\\par "; //<-- ENTER
$output.= "{\\qr Tomado de wikipedia\\par}"; // <--
Alineado a la derecha

$output.= "{\\i Bill Gates III}"; // <-- Itlica


$output.= "\\par "; //<-- ENTER
$output.= "{\\ul Fundador de Microsoft}"; // <-- Subrayado

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

/* Enviamos el documento completo a la salida */


echo $output;
?>

Como resultado de este cdigo nos parecer una


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

En este ejemplo incluyo una demostracin de como


generar en RTF los siguientes estilos o elementos:

1. Titulos o ms bien distintos tamaos de fuente


2. Negritas, Italicas y subrayados
3. Saltos de lnea o prrafos
4. Alineacin a la izquierda, derecha o centrado

NOTA: del mismo modo se pueden tambin utilizar

1. Vietas
2. Tipos de letras
3. Tablas
4. Colores
5. Imgenes

Y prcticamente todos los elementos que soporta un


archivo .DOC (En posteriores entregas presentar ms
ejemplos con estos elementos)
+

Este seria mi archivo de


funcionesFormatosExportacion.php Abarca las funciones
que se deben ejecutar dependiendo * del formato en el que
se desee presentar (PDF, HTML, DOCX, EXCEL, CVS,
XML, TEXTO PLANO) */ //incluimos librerias
require_once("C:\\xampp\\htdocs\\Basico_001\\dependenci
as\\JavaBridge\\java\\Java.inc"); //include_once
'conexionBD'; class jasperReport { public function iniciar(){
$this--->javaOutputStream = new
java("java.io.ByteArrayOutputStream"); }

public function rellenarReporte($reporte, $direccionReporte,


$parametros){ $this->reporteC = $reporteC; $Conn = new
java("org.altic.jasperReports.JdbcConnection"); $Conn-
>setDriver("com.mysql.jdbc.Driver"); $Conn-
>setConnectString("jdbc:mysql://127.0.0.1/encuestas");
$Conn->setUser("root"); $Conn->setPassword(""); if
(is_string($reporte)) { $this->reportC = $reporte; $reporte =
$direccionReporte . "/". $reporte . ".jasper"; }
$parametrosMap = new Java("java.util.HashMap");
$parametrosMap->put("parameter1", new
Java('java.lang.String', "$parametros" )); $objRellenar =
new
JavaClass("net.sf.jasperreports.engine.JasperFillManager")
; $salida = $objRellenar-
>fillReport($reporte,$parametrosMap,$Conn-
>getConnection()); return $salida; }

//funcion para el formato pdf

public function formatoPDF($reporte) {


java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRPdfExporter");
$parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportador->setParameter($parametrosExportados-
>JASPER_PRINT, $reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->exportReport(); //Este cdigo sirve para abrir
el archivo generado desde el explorador header('Content-
Type: application/pdf'); header('Content-disposition:
attachment; filename="'.$this->reportC.'.pdf"');//forzar
almacenar o abrir automaticamente header("Cache-Control:
no-store, no-cache, must-revalidate"); header("Cache-
Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); header("Expires: 0"); echo
java_cast($this->javaOutputStream->toByteArray(),"S");//se
escribe en el formato la informacion del reporte }

//funcion para el formato docx


public function formatoWord($reporte) {
java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRRtfExporter");//lib
reria para rtf documentos word $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportador->setParameter($parametrosExportados-
>JASPER_PRINT, $reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->exportReport(); //Este cdigo sirve para abrir
el archivo generado desde el explorador header('Content-
Type: application/rtf');//tipo de archivo header('Content-
disposition: attachment; filename="'.$this-
>reportC.'.rtf"');//como mostrarlo header("Cache-Control:
no-store, no-cache, must-revalidate"); header("Cache-
Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); header("Expires: 0"); echo
java_cast($this->javaOutputStream->toByteArray(),"S");//se
escribe en el formato la informacion del reporte }

//funcion para el formato excel

public function formatoExcel($reporte) {


java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JExcelApiExporter")
; $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportadorParametrosExcel =
java("net.sf.jasperreports.engine.export.JRXlsExporterPara
meter"); $exportador-
>setParameter($parametrosExportados->JASPER_PRINT,
$reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->setParameter($exportadorParametrosExcel-
>IS_ONE_PAGE_PER_SHEET, true); $exportador-
>setParameter($exportadorParametrosExcel-
>IS_DETECT_CELL_TYPE, true); $exportador-
>exportReport(); //Este cdigo sirve para abrir el archivo
generado desde el explorador header('Content-Type:
application/xls'); header('Content-Transfer-Encoding:
binary'); header('Content-disposition: attachment;
filename="'.$this->reportC.'.xls"'); header("Pragma: no-
cache"); header("Cache-Control: must-revalidate, post-
check=0, pre-check=0"); header("Expires: 0"); echo
java_cast($this->javaOutputStream->toByteArray(),"S");//se
escribe en el formato la informacion del reporte }

//funcion para el formato html

public function formatoHtml($reporte) {


java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRHtmlExporter");//l
ibreria para html $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportador->setParameter($parametrosExportados-
>JASPER_PRINT, $reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->exportReport(); //Este cdigo sirve para abrir
el archivo generado desde el explorador header('Content-
Type: application/html'); header('Content-disposition:
attachment; filename="'.$this->reportC.'.html"');
header("Pragma: no-cache"); header("Cache-Control: must-
revalidate, post-check=0, pre-check=0"); header("Expires:
0"); echo java_cast($this->javaOutputStream-
>toByteArray(),"S");//se escribe en el formato la informacion
del reporte }

//funcion para el formato CSV (formato en donde los


valores son separados por comas)

public function formatoCsv($reporte) {


java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRCsvExporter");//li
breria para rtf documentos word $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportador->setParameter($parametrosExportados-
>JASPER_PRINT, $reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->exportReport(); //Este cdigo sirve para abrir
el archivo generado desde el explorador header('Content-
Type: application/csv'); header('Content-disposition:
attachment; filename="'.$this->reportC.'.csv"');
header("Pragma: no-cache"); header("Cache-Control: must-
revalidate, post-check=0, pre-check=0"); header("Expires:
0"); echo java_cast($this->javaOutputStream-
>toByteArray(),"S");//se escribe en el formato la informacion
del reporte }

//funcion para el formato texto plano

public function formatoTextoPlano($reporte) {


java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRTextExporter");//l
ibreria para rtf documentos word $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportadorParametrosTxt =
java("net.sf.jasperreports.engine.export.JRTextExporterPar
ameter"); $exportador-
>setParameter($parametrosExportados->JASPER_PRINT,
$reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->setParameter($exportadorParametrosTxt-
>CHARACTER_WIDTH, 5); $exportador-
>setParameter($exportadorParametrosTxt-
>CHARACTER_HEIGHT, 5); $exportador->exportReport();
//Este cdigo sirve para abrir el archivo generado desde el
explorador header('Content-Type: application/txt');
header('Content-disposition: attachment; filename="'.$this-
>reportC.'.txt"'); header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-
check=0"); header("Expires: 0"); echo java_cast($this-
>javaOutputStream->toByteArray(),"S");//se escribe en el
formato la informacion del reporte }

//funcion para el formato xml

public function formatoXml($reporte) { //utililiza la libreria


DTD para generar reportes en XML
java_set_file_encoding("UTF-8"); $exportador = new
java("net.sf.jasperreports.engine.export.JRXmlExporter");//li
breria para reportes en xml $parametrosExportados =
java("net.sf.jasperreports.engine.JRExporterParameter");
$exportador->setParameter($parametrosExportados-
>JASPER_PRINT, $reporte); $exportador-
>setParameter($parametrosExportados-
>OUTPUT_STREAM, $this->javaOutputStream);
$exportador->exportReport(); //Este cdigo sirve para abrir
el archivo generado desde el explorador header('Content-
Type: application/jrpxml'); header('Content-disposition:
attachment; filename="'.$this->reportC.'.xml"');
header("Pragma: no-cache"); header("Cache-Control: must-
revalidate, post-check=0, pre-check=0"); header("Expires:
0"); echo java_cast($this->javaOutputStream-
>toByteArray(),"S");//se escribe en el formato la informacion
del reporte } } ?>
REPORTERIA
este seria la parte en donde llamo a las funciones del
archivo anterior dependiendo del tipo de archivo en el
que se desee exportar iniciar();

$print = $objetoReport-
>rellenarReporte($_REQUEST['reporte'], $dirReporte,
$_REQUEST['param']);//llamo a mi funcion rellenar Reporte
en donde se llenara la plantilla switch ($_REQUEST['tipo']){
case "pdf": $objetoReport->formatoPDF($print); break; case
"docx": $objetoReport->formatoWord($print); break; case
"xls": $objetoReport->formatoExcel($print); break; case
"txt": $objetoReport->formatoTextoPlano($print); break;
case "html": $objetoReport->formatoHtml($print); break;
case "xml": $objetoReport->formatoXml($print); break; case
"csv": $objetoReport->formatoCsv($print); break; default :
throw new Exception("tipo incorrecto"); break; } } catch
(JavaException $ex) { $trace = new
Java("java.io.ByteArrayOutputStream"); $ex-
>printStackTrace(new Java("java.io.PrintStream", $trace));
print "java stack trace: $trace\n"; } ?>

Saludos y espero que les sirva, yo sufr mucho intentando


sacar todos estos formatos. Gracias a la coloracin de
otras investigaciones como las que mencione
anteriormente (aqui) he podido generar todo esto. La clave
esta en las libreras. Exitos siempre!
Generar archivo EXCEL desde PHP
Lo primero que tenemos que entender, es que una hoja de

clculo 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


1 <h1>Tabla de asistencias Pase-gol de los jugadores de Millonarios F.
2 <table cellspacing="0" cellpadding="0">
3 <tr>
4 <th>Pedro Franco</th>
5 <th>Wilson Carpintero</th>
6 <th>&Aacute;lvaro Barros</th>
7 <th>Mayer Candelo</th>
8 </tr>
9 <tr>
10 <td>20</td>
11 <td>80</td>
12 <td>10</td>
13 <td>34</td>
14 </tr>
15 <tr>
16 <td>78</td>
17 <td>90</td>
18 <td>10</td>
19 <td>02</td>
20 </tr>
21</table>

con esta tabla, procedemos a insertarle en la parte superior

un cdigo PHP que es el que generar el archivo de

Microsoft Excel:
1<?php
2header('Content-type: application/vnd.ms-excel');
3header("Content-Disposition: attachment; filename=nombre_del_archiv
4header("Pragma: no-cache");
5header("Expires: 0");
6?>
Lo nico que tens que cambiarle es donde dice:

nombre_del_archivo.xls y ya, ese es el nombre del

archivo que genera.

El cdigo final nos quedara as:


1 <?
2 header('Content-type: application/vnd.ms-excel');
3 header("Content-Disposition: attachment; filename=nombre_del_archi
4 header("Pragma: no-cache");
5 header("Expires: 0");?>
6
7 <h1>Tabla de asistencias Pase-gol de los jugadores de Millonarios F.
8
9 <table cellspacing="0" cellpadding="0">
10 <tr>
11
12 <th>Pedro Franco</th>
13 <th>Wilson Carpintero</th>
14 <th>&Aacute;lvaro Barros</th>
15 <th>Mayer Candelo</th>
16 </tr>
17 <tr>
18 <td>20</td>
19 <td>80</td>
20 <td>10</td>
21 <td>34</td>
22 </tr>
23 <tr>
24 <td>78</td>
25 <td>90</td>
26 <td>10</td>
27 <td>02</td>
28 </tr>
29</table>
Guards el archivo .php con el nombre que mirs

adecuado, ejemplo tabla_jugadores_excel.php y lo abrs

desde el la url normal, lo que te mostrar un cuadro de

descarga del archivo excel que gener:


y listo , el entender cualquier modificacin que le hags

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 necesits


manejar tablas las pods poner que el las formatear y las

mostrar), vamos a ver un cdigo de ejemplo:


1 <h1>Datos de Millonarios F.C.</h1>
2
3 <ul>
4 <li>Puesto histrico: 1</li>
5 <li>Temporadas en 1: 73 (Todas desde el inicio del profesionalismo
6 <li>Temporadas en 2: Ninguna.</li>
7 <li>Mayor goleada conseguida:</li>
8 <li>En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de ju
9 En torneos internacionales: 6-0, contra Universidad de Chile (8 de ma
10 <li>Mayor goleada en contra:
11En campeonatos nacionales: 0-6, contra Independiente Medelln (24 d
12En torneos internacionales: 1-5, contra Independiente de Avellaneda (
13Gol 1.000: Marino Klinger
14Gol 2.000: scar Villano
15Gol 3.000: Juan Gilberto Funes
16Gol 4.000: Nstor Villarreal
17Gol 4.500: Orlando Ballesteros</li>
18 <li>Mejor puesto en la liga: 1 (13 veces, en 1949, 1951, 1952, 1953,
19 <li>Peor puesto en la liga: 17 (1 vez, en el 2004-II)53
20Mximo goleador: Alfredo Castillo 133 goles (por Campeonato Colom
21Mejor jugador de su historia: Alfredo Di Stfano (151 goles en 172 par
22 <li>Jugador que gan ms ttulos: Francisco "Cobo" Zuluaga con 6 C
23Colombia (1952-53).</li>
24 <li>Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y solo
25puntos de la actualidad).9</li>
26 <li>Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin re
y 14 de noviembre de 197155</li>
<li>Mayor racha sin perder: 29 partidos en 1999 (Rcord en el ftbol
</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


1<?
2header('Content-type: application/vnd.ms-word');
3header("Content-Disposition: attachment; filename=millonarios_fc.doc")
4 header("Pragma: no-cache");
5header("Expires: 0");
6?>

Lo nico que tenemos que hacer es cambiar el nombre de:

millonarios_fc.doc por el que deseemos y ya.

el cdigo quedara as:


1 <?
2 header('Content-type: application/vnd.ms-word');
3 header("Content-Disposition: attachment; filename=archivo.doc");
4 header("Pragma: no-cache");
5 header("Expires: 0");
6
7 ?>
8
9 <h1>Datos de Millonarios F.C.</h1>
10
11<ul>
12 <li>Puesto histrico: 1</li>
13 <li>Temporadas en 1: 73 (Todas desde el inicio del profesionalismo
14 <li>Temporadas en 2: Ninguna.</li>
15 <li>Mayor goleada conseguida:</li>
16 <li>En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de ju
17 En torneos internacionales: 6-0, contra Universidad de Chile (8 de ma
18 <li>Mayor goleada en contra:
19 En campeonatos nacionales: 0-6, contra Independiente Medelln (24
20 En torneos internacionales: 1-5, contra Independiente de Avellaneda
21 Gol 1.000: Marino Klinger
22 Gol 2.000: scar Villano
23 Gol 3.000: Juan Gilberto Funes
24 Gol 4.000: Nstor Villarreal
25 Gol 4.500: Orlando Ballesteros</li>
26 <li>Mejor puesto en la liga: 1 (13 veces, en 1949, 1951, 1952, 1953,
27 <li>Peor puesto en la liga: 17 (1 vez, en el 2004-II)53
28 Mximo goleador: Alfredo Castillo 133 goles (por Campeonato Colom
29 Mejor jugador de su historia: Alfredo Di Stfano (151 goles en 172 pa
30 <li>Jugador que gan ms ttulos: Francisco "Cobo" Zuluaga con 6 C
31Colombia (1952-53).</li>
32 <li>Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y solo
33puntos de la actualidad).9</li>
34 <li>Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin re
y 14 de noviembre de 197155</li>
<li>Mayor racha sin perder: 29 partidos en 1999 (Rcord en el ftbol
</ul>
Y listo, es as como podemos generar estos archivos de

forma fcil y sin tanto rodeo. espero que les sirva, cualquier

comentario abajo.

Você também pode gostar