Subreportes y exportando a diferentes formatos
Tambien te puede interesar : Mi primer reporte en java con Eclipse e ireport Mysql
Lo primero que haremos es crear un proyecto en netbeans: Llamado capacitación
El siguiente paso es descargar la librería jasperreports de la pagina oficial:
http://jasperforge.org/projects/jasperreports
AGREGANDO LA LIBRERIA A NETBEANS
Creamos una nueva librería en Herramientas ->libreríasCon el nombre jasperreport y agregamos tos los siguientes jars a la nueva libreria
Estas son las librerias necesarias :
barbecue-1.5-beta1.jar
barcode4j-2.0.jar
commons-beanutils-1.8.0.jar
commons-collections-2.1.1.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.0.4.jar
groovy-all-1.7.5.jar
iText-2.1.7.jar
jasperreports-4.0.2.jar
jasperreports-applet-4.0.2.jar
jasperreports-fonts-4.0.2.jar
jasperreports-javaflow-4.0.2.jar
jcommon-1.0.15.jar
jdt-compiler-3.1.1.jar
jfreechart-1.0.12.jar
log4j-1.2.15.jar
mondrian-3.1.1.12687.jar
png-encoder-1.5.jar
poi-3.6.jar
rhino-1.7R1.jar
servlet.jar
xalan-2.7.1.jar
Ademas tambien debes descargar el driver JDBC de mysql-conector
Luego de este paso damos click izquierdo en el proyecto y le damos en propiedades y agregamos la librería que hemos creado
Le damos click en agregar librería y ya esta agregada nuestra biblioteca
CREANDO ENTIDAD DE PERSISTENCIA
Para crear la entidad de persistencia le damos click izquierdo al proyecto nuevo -> Persistence
->persistence Unit
Le damos en next y le ponemos un nombre yo le puse : capacitacionPU
Si no tienes creada la conecion la creas donde dice databases connection ,
Escojamos el jar este caso mysql y nos pedirá usuario password host y database.
Le damos en text connection para ver si todo esta bien le damos en finalizar y ya tenemos nuestra entidad de persistencia
Luego creamos un paquete llamado utilidades y dentro de le una clase llamada Reportes:
La cual contiene los siguientes métodos:
package utilidades; //import com.lowagie.text.pdf.PdfWriter; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.Serializable; import java.sql.Connection; import java.util.Locale; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.JRPdfExporterParameter; import net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; import net.sf.jasperreports.engine.util.JRSaver; import net.sf.jasperreports.view.JasperViewer; public class Reportes implements Serializable{ private JasperReport reporte; private JasperPrint print; //exportar reporte a axcel public void reporteExcelImpresion(InputStream rutaJrxml,String rutaArchivoXLS,Map<String, Object> parametros,Connection conexion) throws JRException, FileNotFoundException{ this.reporte=JasperCompileManager.compileReport(rutaJrxml); //luego ponemos los parametros que necesitamos: print = JasperFillManager.fillReport(this.reporte, parametros, conexion); JRXlsExporter exportador = new JRXlsExporter(); exportador.setParameter(JRExporterParameter.JASPER_PRINT,print); exportador.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,rutaArchivoXLS); exportador.setParameter(JRExporterParameter.IGNORE_PAGE_MARGINS,true); exportador.setParameter(JRXlsAbstractExporterParameter.IS_WHITE_PAGE_BACKGROUND, false); exportador.setParameter(JRXlsAbstractExporterParameter.IS_IGNORE_CELL_BORDER,false); exportador.setParameter(JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS,true); exportador.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE ,true); exportador.setParameter(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED,true); exportador.exportReport(); } //metodo para generar el reporte en pdf si que se puedan copiar las imagenes ni el texto public boolean jasperReport(String ruta, InputStream dataSourceName, Map<String, Object> params,Connection conn) throws ClassNotFoundException, JRException { this.reporte=JasperCompileManager.compileReport(dataSourceName); this.print = JasperFillManager.fillReport(this.reporte, params, conn); if(this.print.getPages().isEmpty()){ return false; } //int permisos =PdfWriter.ALLOW_PRINTING; //Esta clase es la encargada de exportar el archivo a pdf final JRExporter jtrtf= new JRPdfExporter(); jtrtf.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE); jtrtf.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE); //jtrtf.setParameter(JRPdfExporterParameter.PERMISSIONS, permisos); jtrtf.setParameter(JRExporterParameter.JASPER_PRINT, this.print); //Gurdamos una copia en el computador Ejemplo c:/reportes.jrprint JRSaver.saveObject(this.print,ruta+".jrprint"); //Gurdamos una copia en el computador Ejemplo c:/reportes.pdf jtrtf.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, ruta+".pdf"); //este metodo exporta a los diferentes formatos en este caso pdf jtrtf.exportReport(); //Metodo que se encarga de mostrar el reporte en la pantalla JasperViewer.viewReport(this.print,false,Locale.getDefault()); return true; } }
CREACION DEL REPORTE
Abrimos irreport y lo primero que haremos es crear un Datasource pero como lo creamos pues fácil
aquí una imagen ilustrativa le damos clic
Luego Clic en New Luego
Le damos en Next y configuramos nuestra conexión
Cuando hagamos esto le damos en test para probar que todo ha salido Bien luego en Save.
creamos un nuevo reporte AsistenciaCapacitaciones dentro de un nuevo paquete llamado reportes
Consulta para el reporte
select * from empleado ;
Asi quedaría el reporte
Probamos el reporte
Este es el codigo fuente del archivo jrxml
<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report name" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <queryString> <![CDATA[select * from empleado]]> </queryString> <field name="emp_id" class="java.lang.Integer"/> <field name="emp_nom" class="java.lang.String"/> <field name="emp_ape" class="java.lang.String"/> <field name="emp_car" class="java.lang.String"/> <field name="emp_dep_id" class="java.lang.Integer"/> <background> <band splitType="Stretch"/> </background> <title> <band height="79" splitType="Stretch"> <staticText> <reportElement x="0" y="25" width="555" height="29"/> <textElement textAlignment="Center"> <font fontName="Arial" size="18"/> </textElement> <text><![CDATA[Empleados de la capacitacion]]></text> </staticText> </band> </title> <pageHeader> <band splitType="Stretch"/> </pageHeader> <columnHeader> <band height="40" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="100" height="20"/> <textElement/> <text><![CDATA[emp_id]]></text> </staticText> <staticText> <reportElement x="128" y="0" width="100" height="20"/> <textElement/> <text><![CDATA[emp_nom]]></text> </staticText> <staticText> <reportElement x="265" y="1" width="100" height="20"/> <textElement/> <text><![CDATA[emp_car]]></text> </staticText> </band> </columnHeader> <detail> <band height="33" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="100" height="20"/> <textElement/> <textFieldExpression class="java.lang.Integer"><![CDATA[$F{emp_id}]]></textFieldExpression> </textField> <textField> <reportElement x="128" y="0" width="100" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{emp_nom}]]></textFieldExpression> </textField> <textField> <reportElement x="265" y="0" width="100" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{emp_car}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band splitType="Stretch"/> </columnFooter> <pageFooter> <band splitType="Stretch"/> </pageFooter> <summary> <band splitType="Stretch"/> </summary> </jasperReport>
El reporte lo vamos a guardar en un paquete llamado reportes
Luego lo llamamos desde la clase capacitación
package capacitacion; import java.io.File; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.swing.JFileChooser; import utilidades.Reportes; import java.util.Calendar; import javax.swing.JOptionPane; import org.apache.log4j.BasicConfigurator; public class Capacitacion implements Runnable{ /*Declaramos una variables de tipo JFileChoser * para escoger la ruta donde guradaremos el archivo*/ private static JFileChooser guardar ; public Capacitacion(){ /*Configuracion basica de los log*/ BasicConfigurator.configure(); } public static void main(String[] args) { //Inicializamos el Objeto guardar= new JFileChooser(); Calendar cal = Calendar.getInstance(); /*Nombre que saldra por defecto del archivo*/ guardar.setSelectedFile(new File("Reportes"+ cal.get(Calendar.YEAR) +"-"+cal.get(Calendar.MONTH) +"-"+cal.get(Calendar.DAY_OF_MONTH))); int selecion=0; //Accion que ejecuta el Usuario selecion=guardar.showSaveDialog(null); if(selecion==JFileChooser.APPROVE_OPTION){ //Cuando selecciona aceptar Capacitacion capacitacion= new Capacitacion(); // Ejecutamos el hilo para poder seguir utilizando la aplicación Thread hilo = new Thread(capacitacion); hilo.start(); }else if(selecion==JFileChooser.CANCEL_OPTION){ // Cuando cancela JOptionPane.showMessageDialog(null,"Operacion Cancelada.","Informacion",JOptionPane.INFORMATION_MESSAGE); }else if(selecion==JFileChooser.ERROR_OPTION){ // Cuando ocurre un error JOptionPane.showMessageDialog(null,"Debe seleccionar un nombre de archivo valido.","Error",JOptionPane.ERROR_MESSAGE ); } } @Override public void run() { start(); } public void start(){ EntityManagerFactory emf= Persistence.createEntityManagerFactory("capacitacionPU"); EntityManager em=emf.createEntityManager(); em.getTransaction().begin(); Connection con; Map mp= new HashMap<Object, Object>(); con=em.unwrap(Connection.class); em.getTransaction().commit(); Reportes reporte= new Reportes(); try { /*Le pasamos la ruta donde quedara guardado nuestro reporte*/ reporte.jasperReport(guardar.getSelectedFile().toString(),Capacitacion.class.getResourceAsStream("/reportes/AsistenciaCapacitaciones.jrxml"), mp, con); } catch (Exception ex) { Logger.getLogger(Capacitacion.class.getName()).log(Level.SEVERE, null, ex); }finally{ try { con.close(); } catch (SQLException ex) { Logger.getLogger(Capacitacion.class.getName()).log(Level.SEVERE, null, ex); } } } }
Query para la creacion de la base de datos
CREATE SCHEMA IF NOT EXISTS `capacitaciones` DEFAULT CHARACTER SET latin1 ; USE `capacitaciones` ; -- ----------------------------------------------------- -- Table `capacitaciones`.`asistencia` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`asistencia` ( `asi_id` INT(11) NOT NULL AUTO_INCREMENT , `asi_cap_id` INT(11) NOT NULL , `asi_emp_id` INT(11) NOT NULL , PRIMARY KEY (`asi_id`) , INDEX `cap_id` (`asi_cap_id` ASC) , INDEX `emp_id` (`asi_emp_id` ASC) ) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARACTER SET = latin1; -- ----------------------------------------------------- -- Table `capacitaciones`.`entidad` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`entidad` ( `ent_id` INT(11) NOT NULL AUTO_INCREMENT , `ent_des` VARCHAR(130) NOT NULL , `ent_tip` INT(11) NULL DEFAULT NULL , PRIMARY KEY (`ent_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = latin1; -- ----------------------------------------------------- -- Table `capacitaciones`.`estado` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`estado` ( `est_id` INT(11) NOT NULL AUTO_INCREMENT , `est_des` VARCHAR(45) NULL DEFAULT NULL , PRIMARY KEY (`est_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = latin1; -- ----------------------------------------------------- -- Table `capacitaciones`.`capacitacion` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`capacitacion` ( `cap_id` INT(11) NOT NULL AUTO_INCREMENT , `cap_tem` VARCHAR(255) NULL DEFAULT NULL , `cap_fecIni` DATETIME NOT NULL , `cap_fecFin` DATETIME NOT NULL , `cap_obs` VARCHAR(255) NULL DEFAULT NULL , `cap_fecReg` DATETIME NOT NULL , `cap_dir` VARCHAR(255) NULL DEFAULT NULL , `cap_est_id` INT(11) NOT NULL , `cap_ent_id` INT(11) NOT NULL , PRIMARY KEY (`cap_id`) , INDEX `cap_ent_id` (`cap_ent_id` ASC) , INDEX `cap_est_id` (`cap_est_id` ASC) , CONSTRAINT `cap_ent_id` FOREIGN KEY (`cap_ent_id` ) REFERENCES `capacitaciones`.`entidad` (`ent_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `cap_est_id` FOREIGN KEY (`cap_est_id` ) REFERENCES `capacitaciones`.`estado` (`est_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 6 DEFAULT CHARACTER SET = latin1; -- ----------------------------------------------------- -- Table `capacitaciones`.`dependencia` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`dependencia` ( `dep_id` INT(11) NOT NULL AUTO_INCREMENT , `dep_des` VARCHAR(255) NOT NULL , PRIMARY KEY (`dep_id`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1; -- ----------------------------------------------------- -- Table `capacitaciones`.`empleado` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `capacitaciones`.`empleado` ( `emp_id` INT(11) NOT NULL , `emp_nom` VARCHAR(60) NOT NULL , `emp_ape` VARCHAR(60) NOT NULL , `emp_car` VARCHAR(120) NOT NULL , `emp_dep_id` INT(11) NOT NULL , PRIMARY KEY (`emp_id`) , INDEX `dep_id` (`emp_dep_id` ASC) , CONSTRAINT `dep_id` FOREIGN KEY (`emp_dep_id` ) REFERENCES `capacitaciones`.`dependencia` (`dep_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1;
Luego insertamos estos dos empleados para ver el resultado
INSERT
INTO `dependencia` (`dep_id`, `dep_des`) VALUES
(1, 'Sistemas');
INSERT INTO `empleado` (`emp_id`, `emp_nom`, `emp_ape`, `emp_car`, `emp_dep_id`) VALUES (73222566, 'juan pablo', 'morales', 'Jefe de sistemas', 1), (75532012, 'carlo', 'Martinez', 'Auxiliar de Sistemas', 1);
18 comentarios:
a mi no me sirbio trate de importar las lobreria y no puedo, el error sale import net <--en es parte me dise que es paquete no existe o cree una clase
bueno resolvi eso, pero me dice que esto no existe parece ser un packege, realmente dice que no existe es el com
import com.lowagie.text.pdf.PdfWriter;
despues lo otro no marca error. si aguien pudiera ayudarme
Hola muy buenas noches esa clase se encuentra en el .jar iText-2.1.7 que lo puedes descargar en el siguiente link
http://olex.openlogic.com/package_versions/download/9141?package_version_id=2802&path=openlogic%2Fitext%2F2.1.7%2Fopenlogic-itext-2.1.7-all-bin-1.zip
que es el encargado de que no copien el texto en el PDF
Se me olvidaba debes agregar el .jar al proyecto y listo solucionado el problema
Obtengo el siguiente error:
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: Provider-does-not-support-the-call (There is no English translation for this message.)
Hola muy buenas
Te dejo el proyecto completo para que veas la configuración
Proyecto Capacitación
Recuerda que si usas Ireport 5 para hacer los archivos de los reportes debes usar la misma versión para las librerías de Jasperreport.
El proyecto esta hecho con Netbeans 7.1
Muchas gracias Jesus, la reinstalación de JasperReport resolvió el error. Una consulta, es posible configurar jasperview para elegir la ruta y el nombre de archivo, en vez de pasarlo como parametro del método jasperReport()?, Atentamente, Jorge.
Buenas Jorge, ya modifique la clase capacitación para que escojas el nombre del archivo y la ruta donde quedara guardado también lo metí dentro de un hilo para que puedas ejecutar otras tareas de la aplicación ya que aveces los reportes se demoran en salir dependiendo de la cantidad de información.
espero haberte ayudado.
cordialmente Jesús Cabarcas
Hola Jesús, perdona la pregunta, la modificación de la clase Capacitacion se encuentra en el mismo archivo .rar, del enlace Proyecto Capacitacion, mencionado anteriormente?.
Me gustaria ver dicha implementación. Me seria muy útil poder decidir donde almacenar los reportes generados. Atentamente, Jorge
Hola Jorge, No esta en el archivo .rar la clase Capacitación la puse en el blog copia y pega y luego compilas
cordialmente,
Jesús Cabarcas
Hola Jesús, maravilloso, nunca había hecho una implementación de hilos, la adaptación al sistema que desarrollamos funciona perfectamente. Tengo otra consulta, el sistema desarrollado es una aplicación de escritorio. En mi trabajo se nos ha pedido implementarlo via web, que herramienta me recomiendas para dicha implementación, saludos, Jorge.
Hola Jesús, intento introducir un gráfico de líneas y me da error Error filling print... java.io.IOException: Acceso denegado
net.sf.jasperreports.engine.JRRuntimeException: java.io.IOException: Acceso denegado
Tienes que estar pendiente que al momento de ingresarlo no se pasa delos bordes en la banda que lo haigas creado.
Es decir sí en la banda detail pusiste el grafico verificac en las propiedades alto, ancho, top que no sea negativo lo cual quiere decir que esta fuera de la banda que le corresponde.
El problema es cuando realizo una consulta a 2 o más tablas con claves foráneas. Cómo genero una vista de dichas tablas para graficar la vista obtenida?
Bueno lo que yo te recomiendo es que tienes que utilizar Dataset, pasarle los parámetros de la consulta principal a los Dataset para que configures el reporte es más o menos lo que te entiendo que quieres hacer
Buenos dias estoy trabajando con reportes desde netbeans 7.2 y cuando o exporto me dice que error al exportar, y cuando abro el pdf me dice estaba mal cifrado o mal codifcado. Si me puedes ayudar te lo agradezco
Debes utilizar irreport y las librerías jasperreeport de la misma versión
Publicar un comentario