miércoles, 9 de febrero de 2011

iReports y php: word, excel, html, cvs, pdf, txt, xml

hola a tod@s. Bueno quisiera compartir con ustedes algo que he estado aprendiendo y es a generar reportes desde php utilizando iReportes mediante la libreria JavaBridge, comparto con ustedes el código generado, me he basado en la informacion encontrada aqui: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=GeneracionJasperReportsPHP
funcionesFormatosExportacion


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\\dependencias\\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('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");//libreria 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('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.JRXlsExporterParameter"); $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: 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");//libreria 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('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");//libreria 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('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");//libreria para rtf documentos word $parametrosExportados = java("net.sf.jasperreports.engine.JRExporterParameter"); $exportadorParametrosTxt = java("net.sf.jasperreports.engine.export.JRTextExporterParameter"); $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, 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");//libreria 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('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 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!

7 comentarios:

Anónimo dijo...

me gusta.. gracias

Anónimo dijo...

hola soy eduardo de sistemas de perru muchas gracias es justo lo que ando buscado , ojala todos compartiran tambein sus conocimientos sobre codeigniter jaja seria genial saludos desde peru

Kt!k dijo...

Hola chic@s!! gracias por sus comentarios, me alegra mucho que les haya servido, ahora ya esta mas presentadito para mayor entendimiento, he hecho unas mejoras en cuanto a las querys que no generan ningun resultado para que no les salga el error "documento sin paginas" o algo así, pueden revisar lo posteare, con cosillas sacandole el jugo al iReport con JavaBridge!!


Eduardo que es codeigniter??... si me ayudas con alguna pista. Y si me gusta programar jejeje... Saludos desde Ecuador!!

Exitos Siempre! Ktyk

Mopri dijo...
Este comentario ha sido eliminado por el autor.
@marcocevallos dijo...

Interesante, ahora porque no lo actualizas con una entrada sobre la automatización de pruebas de QA? sería muy útil.

saludos

lcevallo dijo...

Hola perdona que te pregunte se ve interesante pero si tu reporte necesita parametros que se le deben de enviar al query que usa internamente como lo haria.

Por fis tu ayuda.

Muchas Gracias

lcevallo dijo...

Hola disculpa yo tambien soy de Ecuador soy de Guayaquil la verdad que me vendria mucho algun tipo de tutoria de tu parte se interesante lo que haces y me gustaria hacerlo en mis aplicativos por fis si me puedes ayudar.

Sueños de Informáticos!!

A veces... bueno no... siempre me he preguntado porque elegimos algo, la carrera, tu pareja, tus amig@s, mentir o decir la verdad, bueno siempre elegiges... para que???ahora he comprendido que los sueños son los responsables... elegiges algo porque quieres algo, elegiges no engañar porque no quieres que hagan lo mismo contigo, eliges estar con alguien porque crees y sientes que vas a pasar bien junto a su lado, y bueno, eliges tu carrera para ser alguien... no verdad??? eliges porque tu sueño es el de crear, diseñar construir algo mejor, mas sofisticado... y por eso eres un informático porque analizas todo y sabes lo importante que es escalar paso a paso....

Sistemas 2009

Sistemas 2009
disfrutnado con mis amig@s en la cena de sistemas...