Programación al Extremo

Buscar en este blog

miércoles, 7 de diciembre de 2011

Reportes en java con JasperReports e iReports
Fecha de Publicación:
Publicado por:
Seguir Seguir en twitter
Seguir Seguir en facebook
Seguir Seguir en Google+

Programación al Extremo : Java
Este tutorial tiene la finalidad de facilitar la creación de un reporte en java  utilizando ireport y Jasperreport junto con Mysql
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


creando el proyecto



creando el proyecto

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ías

añadir libreria




Con el nombre jasperreport y agregamos tos los siguientes jars a la nueva libreria


Librerias reporte Java

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



jasperreport


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


conexion

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
datasource

Luego Clic en New Luego

Jdbc Connection
Le damos en Next y configuramos nuestra conexión

Configuración conexión Ireport

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
Elementos ireport




creacion del reporte





Consulta para el reporte


select * from empleado ;









Asi quedaría el reporte


vista del reporte

Probamos el reporte


vista del 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 :

Anónimo dijo...

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

Anónimo dijo...

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

Jesus Antonio Cabarcas Gomez dijo...

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

Jesus Antonio Cabarcas Gomez dijo...
Este comentario ha sido eliminado por el autor.
Jesus Antonio Cabarcas Gomez dijo...

Se me olvidaba debes agregar el .jar al proyecto y listo solucionado el problema

jorge dijo...

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.)

jesus antonio cabarcas gomez dijo...

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

jorge dijo...

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.

Jesus Antonio Cabarcas Gomez dijo...

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

jorge dijo...

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

Jesus Antonio Cabarcas Gomez dijo...

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

jorge dijo...

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.

jorge dijo...

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

Jesus Antonio Cabarcas Gomez dijo...

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.

jorge dijo...

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?

Jesus Antonio Cabarcas Gomez dijo...

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

jdtobon dijo...

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

Jesus Antonio Cabarcas Gomez dijo...

Debes utilizar irreport y las librerías jasperreeport de la misma versión