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 desde nuestro programa en PHP. Bueno, en primer lugar, este truco no nos genera un DOC en realidad sino más bien un archivo RTF, el cual es muy similar al DOC y también, 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 razón de utilizar un RTF (Rich Text Format) es que este es un archivo de texto enriquecido que nos admite prácticamente 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 códigos que nos permitan establecer negritas, títulos, itálicas, tablas, imágenes, etc. Como generar un archivo RTF
En primer lugar, deberemos poner las siguientes líneas al inicio de nuestro programa PHP header ('Content-type: application/msword') application/msword'); header ('Content-Disposition: inline; filename=ejemplo.rtf') filename=ejemplo.rtf' ); Donde ejemplo.rtf es es el nombre del archivo con que se abrirá en Word y también es el nombre con el que se guardará en disco duro si el usuario elige esta opción. Este código lo he probado con las varias versiones de Word como son la 2000, 2002 y XP con buenos
resultados y debería 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 código deberá guardarse dentro de un archivo PHP y ejecutarse desde el navegador.
u plataforma Windows y más tarde para Apple Macintosh. "; $output.= "\\par "; //<-- ENTER /* Parrafo */ $output.= "El 18 de octubre de 2006, Microsoft lanzó la vers ión número 7 de Internet Explorer. Entre otros detalles el progr ama fue renombrado a Windows Internet Explorer, como muestra de la integración de la aplicación 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}"; // <-- Itálica $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 código 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 demostración de como generar en RTF los siguientes estilos o elementos: 1. Titulos o más bien distintos tamaños de fuente 2. Negritas, Italicas y subrayados 3. Saltos de línea o párrafos
4. Alineación a la izquierda, derecha o centrado NOTA: del mismo modo se pueden también utilizar 1. Viñetas 2. Tipos de letras 3. Tablas 4. Colores 5. Imágenes Y prácticamente todos los elementos que soporta un archivo .DOC (En posteriores entregas presentaré más 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 código sirve para abrir el archivo generado desde el explorador header('ContentType: 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("CacheControl: 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 código sirve para abrir el archivo generado desde el explorador header('ContentType: application/rtf');//tipo de archivo header('Contentdisposition: attachment; filename="'.$this>reportC.'.rtf"');//como mostrarlo header("Cache-Control: no-store, no-cache, must-revalidate"); header("CacheControl: 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 código 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: nocache"); header("Cache-Control: must-revalidate, postcheck=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 código sirve para abrir el archivo generado desde el explorador header('ContentType: application/html'); header('Content-disposition: attachment; filename="'.$this->reportC.'.html"'); header("Pragma: no-cache"); header("Cache-Control: mustrevalidate, 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 código sirve para abrir el archivo generado desde el explorador header('ContentType: application/csv'); header('Content-disposition: attachment; filename="'.$this->reportC.'.csv"'); header("Pragma: no-cache"); header("Cache-Control: mustrevalidate, 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 código 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, precheck=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 código sirve para abrir el archivo generado desde el explorador header('ContentType: application/jrpxml'); header('Content-disposition: attachment; filename="'.$this->reportC.'.xml"'); header("Pragma: no-cache"); header("Cache-Control: mustrevalidate, 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 coloración de otras investigaciones como las que mencione anteriormente (aqui) he podido generar todo esto. La clave esta en las librerías. Exitos siempre!
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 1
Tabla de asistencias Pase-gol de los jugadores de Millonarios F. 2
3 4 Pedro Franco | 5 Wilson Carpintero | 6 Álvaro Barros | 7 Mayer Candelo | 8
9 10 20 | 11 80 | 12 10 | 13 34 | 14
15 16 78 | 17 90 | 18 10 | 19 02 | 20
21
con esta tabla, procedemos a insertarle en la parte superior
un código PHP que es el que generará el archivo de
Microsoft Excel: 1
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í: 1 2 header('Content-type: application/vnd.ms-excel'); 3 header("Content-Disposition: attachment; filename=nombre_del_arch
4 header("Pragma: no-cache"); 5 header("Expires: 0");?> 6 7
Tabla de asistencias Pase-gol de los jugadores de Millonarios F. 8 9
10 11 12 Pedro Franco | 13 Wilson Carpintero | 14 Álvaro Barros | 15 Mayer Candelo | 16
17 18 20 | 19 80 | 20 10 | 21 34 | 22
23 24 78 | 25 90 | 26 10 | 27 02 | 28
29
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ó:
y listo
, 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: 1
Datos de Millonarios F.C.
2 3
4 - Puesto histórico: 1º
5 - Temporadas en 1ª: 73 (Todas desde el inicio del profesionalismo 6
- Temporadas en 2ª: Ninguna.
7 - Mayor goleada conseguida:
8 - En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de j 9 En torneos internacionales: 6-0, contra Universidad de Chile (8 de m 10
- Mayor goleada en contra: 11En campeonatos nacionales: 0-6, contra Independiente Medellín (24 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: Néstor Villarreal 17Gol 4.500: Orlando Ballesteros
18 - Mejor puesto en la liga: 1º (13 veces, en 1949, 1951, 1952, 1953, 19
- Peor puesto en la liga: 17º (1 vez, en el 2004-II)53 20Máximo goleador: Alfredo Castillo 133 goles (por Campeonato Colom
21Mejor jugador de su historia: Alfredo Di Stéfano (151 goles en 172 pa 22 - Jugador que ganó más títulos: Francisco "Cobo" Zuluaga con 6 23Colombia (1952-53).
24 - Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y sol 25puntos de la actualidad).9
26 - Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin re y 14 de noviembre de 197155
- Mayor racha sin perder: 29 partidos en 1999 (Récord en el fútbol
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 código quedaría así: 1 2 3 4 5 6 7 8
header('Content-type: application/vnd.ms-word'); header("Content-Disposition: attachment; filename=archivo.doc"); header("Pragma: no-cache"); header("Expires: 0"); ?>
9
Datos de Millonarios F.C.
10 11
12 - Puesto histórico: 1º
13 - Temporadas en 1ª: 73 (Todas desde el inicio del profesionalismo 14
- Temporadas en 2ª: Ninguna.
15 - Mayor goleada conseguida:
16 - En campeonatos nacionales: 8-3, contra Deportes Tolima (7 de j 17 En torneos internacionales: 6-0, contra Universidad de Chile (8 de m 18
- Mayor goleada en contra: 19 En campeonatos nacionales: 0-6, contra Independiente Medellín (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: Néstor Villarreal 25 Gol 4.500: Orlando Ballesteros
26 - Mejor puesto en la liga: 1º (13 veces, en 1949, 1951, 1952, 1953, 27
- Peor puesto en la liga: 17º (1 vez, en el 2004-II)53 28 Máximo goleador: Alfredo Castillo 133 goles (por Campeonato Colo 29 Mejor jugador de su historia: Alfredo Di Stéfano (151 goles en 172 p 30
- Jugador que ganó más títulos: Francisco "Cobo" Zuluaga con 6 31Colombia (1952-53).
32 - Mejor temporada: 1949, en 28 partidos, gano 22, empato 4 y sol 33puntos de la actualidad).9
34 - Portero con mayor invicto: Otoniel Quintana, 1.024 minutos sin re y 14 de noviembre de 197155
- Mayor racha sin perder: 29 partidos en 1999 (Récord en el fútbol
Y listo, es así como podemos generar estos archivos de
forma fácil y sin tanto rodeo. espero que les sirva, cualquier
comentario abajo.