Continuación de la creación de reportes con JasperReport
Para poder convertir a otro formato el documento o reporte y mostrarlo mediante un visor, se
incorporan las librerías necesarias para ello, se aconseja utilizar las que se encuentran en este
enlace LIBRERIAS JAR. (presionar ctrl+click para activar el enlace)
En librerías de la ventana de proyecto se importan estas librerías mediante el menú contextual
que se genera en la carpeta libreries. Se selecciona el comando add jar/folders y en la ventana que
se abre se navega hasta conseguir las librerías, se seleccionan y se presiona el botón abrir
Si se abre la carpeta libreries se pueden visualizar estos documentos.
Ahora se crea en donde está el empaquetado, botón izquierdo y seleccionando new=>Java Class,
se crea una class llamada VisorReporte
En esta clase vamos a crear el código para mostrar el reporte en PDF y enlazarlo al ejemplo
anterior con el botón reporte del formulario.
Ya se habían incorporado a las librerías las necesarias para lograr esto. Si se diseña el código
quedaría algo como esto
public abstract class VisorReporte { private static JasperReport reporte; private static JasperPrint reportecargado; private static JasperViewer visor; public static void crearReporte(String path,Connection c) { try { reporte = (JasperReport) JRLoader.loadObjectFromFile( path ); reportecargado=JasperFillManager.fillReport(reporte,null,c); } catch( JRException ex ) { System.out.println("NO CARGO EL REPORTE"); ex.printStackTrace(); } } public static void MostrarVisor() { visor = new JasperViewer(reportecargado); visor.setVisible(true); JasperViewer ventanaVisor = new JasperViewer(reportecargado,false) ; ventanaVisor.setTitle("LISTADO DE SERVICIOS"); ventanaVisor.setVisible(true); } public static void exportaraPDF( String destination ) { try { JasperExportManager.exportReportToPdfFile(reportecargado,destination); } catch( JRException ex ) { ex.printStackTrace(); } } }
Se pueden observar muchos alertas, esto es debido a las librerías faltantes que hay que importar
para que se puedan ejecutar los métodos.
Si se presiona cada alerta la primera opción es generalmente import librería_que_se_necesita.jar;,
Se clickea esa opción y se va resolviendo el problema.
Si quedan warning (bombillo con triangulito amarillo) no hay problemas
Después de irse incorporando las librerías ya tenemos la clase que permite cargar el reporte con el
método CrearReporte, que lo ensambla con la información de la base de datos. La clase que
monta el reporte PDF ya completo con los datos en el visor, llamada mostrarVisor, y un método
adicional que permite descargarlo en alguna carpeta en el computador , llamado exportaraPDF.
Se vuelve a la class Formulario1, la cual se vio como se creaba en la primera parte de este ejemplo
El botón reporte había sido programado para incorporar un registro a la base de datos, se elimina
ese código (solo el del evento de botón) y se reprograma de la siguiente manera
import java.sql.Connection;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Usuario
*/
public class Formulario1 extends javax.swing.JFrame {
/**
* Creates new form Formulario1
*/
public Formulario1(Connection cn) {
VisorReporte.crearReporte("C:\\Users\\Usuario\\Desktop\\Ejemplo\\src\\reporte.jasper",cn);
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Reporte");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(169, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(160, 160, 160))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(121, 121, 121)
.addComponent(jButton1)
.addContainerGap(156, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
VisorReporte.MostrarVisor();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,
null, ex);
}
//</editor-fold>
/* Create and display the form */
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration
}
El constructor de esta clase no solo se usa para inicializar el JFrame, si se observa el código
public Formulario1(Connection cn) {
VisorReporte.crearReporte("C:\\Users\\Usuario\\Desktop\\Ejemplo\\src\\reporte.jasper",cn);
initComponents();
}
El constructor tiene un parámetro tipo Connection para llenar el reporte con los datos de la base
de datos y la ubicación o path del reporte ejecutable extensión jasper.
Dentro del constructor se aprecia el método que llena el reporte llamado crearReporte, este
método se encuentra antecedido del nombre de la clase abstracta que es VisorReporte, ya que
esta no se instancia.
En el evento del botón Reporte se observa el siguiente código
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
VisorReporte.MostrarVisor();
}
Aquí se llama al método que permite mostrar el reporte a través de un visor, este reporte se
muestra como PDF.
Se eliminan las variables que no son necesarias ya que este ejemplo no modifica los datos de la
base de datos, cosa que ya se ha explicado, sino que genera reportes.
La clase Conexcion, donde se establece la conexión con la base de datos, se puede hacer abstracta
para evitar la instanciación y hacerla global, el código cambia a este, donde solo se establecen las
variables como prívate static y la clase como publis abstract
import java.awt.HeadlessException;
import java.sql.*;
import javax.swing.JOptionPane;
public abstract class Conexcion {
private static Connection con=null;
private static Statement stat=null;
private static ResultSet reg=null;
public static Connection conectar(){
try{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost/bd","root","");
} catch(ClassNotFoundException | SQLException | HeadlessException e){
JOptionPane.showMessageDialog(null,"No Conectado");
System.exit(0);
}
return con;
}
public static void manejar(Connection con, String sql){
try {
stat=con.createStatement();
stat.executeUpdate(sql);
JOptionPane.showMessageDialog(null,"DATOS INCLUIDOS");
}catch(SQLException e){
JOptionPane.showMessageDialog(null,"DATOS NO INCLUIDOS");
}
}
public static ResultSet leer(Connection con,String query) {
try{
stat=con.createStatement();
reg=stat.executeQuery(query);
} catch (SQLException e) {
}
return reg;
}
}
Quedando de esta forma
En la clase principal, llamada public class Main se modifica un poco el código para poder
establecer la conexión a base de datos
import java.sql.Connection;
public class Main {
static Connection c;
public static void main(String[] args) {
c=Conexcion.conectar();
Formulario1 form1=new Formulario1(c);
form1.setVisible(true);
}
}
Y ya está listo
Al ejecutarse el programa se obtiene esto
Top Related