Exportar datos de jTable a Excel

Les dejo para que puedan exportar los datos de un jTable a Excel:

1) Descarga de la librería necesaria: jExcelApi

2) Creamos "Exporter.java", les dejé como comentario el for sin titulos de columnas por si lo necesitan así:

package bco2.ClasesGenericas;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.swing.JTable;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
 *
 * @author JP Blanco
 */
public class Exporter {
    private File file;
    private List<JTable> tabla;
    private List<String> nom_files;

    public Exporter(File file, List<JTable> tabla, List<String> nom_files) throws Exception {
        this.file = file;
        this.tabla = tabla;
        this.nom_files = nom_files;
        if (nom_files.size()!=tabla.size()) {
            throw new Exception ("Error");
        }
    }
   
    public boolean export() {
       
        try {
            DataOutputStream out=new DataOutputStream (new FileOutputStream(file));
            WritableWorkbook w = Workbook.createWorkbook(out);
            for (int index=0; index<tabla.size(); index++){
                JTable table=tabla.get(index);
                WritableSheet s=w.createSheet(nom_files.get(index),0);
               //Para que salga el titulo de las columnas
for (int i = 0; i < table.getColumnCount(); i++) {
      for (int j = 0; j < table.getRowCount(); j++) {
            Object titulo = table.getColumnName(i);
            s.addCell(new Label(i+1, j+1, String.valueOf(titulo)));
       }
}
for (int i = 0; i < table.getColumnCount(); i++) {
      for (int j = 0; j < table.getRowCount(); j++) {
            Object object = table.getValueAt(j, i);
            s.addCell(new Label(i+1, j+2, String.valueOf(object)));
      }
    }
             /*
            *    for sin titulo de columnas:
            *
            *  for (int i=0; i<table.getColumnCount(); i++){
            *     for (int j=0; j<table.getRowCount();j++){
            *         Object object=table.getValueAt(j,i);
            *         s.addCell (new Label(i,j,String.valueOf(object)));
            *       
            *     }  
            * }
            **/

            }
            w.write();
            w.close();
            return true;
        }

        catch (IOException | WriteException e) {
            return false;
        }
    }
   
   
}


3) Agregamos un jFrame o en el proyecto que uds ya estén usando y creamos un botón "Exportar":

  private void btnExportarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        if (this.tabla.getRowCount()==0) {
            JOptionPane.showMessageDialog (null, "No hay datos en la tabla para exportar.","BCO",
                JOptionPane.INFORMATION_MESSAGE);
            this.cmbConsorcio.grabFocus();
            return;
        }
        JFileChooser chooser=new JFileChooser();
        FileNameExtensionFilter filter=new FileNameExtensionFilter("Archivos de excel","xls");
        chooser.setFileFilter(filter);
        chooser.setDialogTitle("Guardar archivo");
        chooser.setMultiSelectionEnabled(false);
        chooser.setAcceptAllFileFilterUsed(false);
        if (chooser.showSaveDialog(null)==JFileChooser.APPROVE_OPTION){
            List<JTable> tb=new ArrayList<>();
            List<String>nom=new ArrayList<>();
            tb.add(tabla);
            nom.add("Detalle de Gastos");
            String file=chooser.getSelectedFile().toString().concat(".xls");
            try {
                bco2.ClasesGenericas.Exporter e=new Exporter(new File(file),tb, nom);
                if (e.export()) {
                    JOptionPane.showMessageDialog(null, "Los datos fueron exportados a excel.","BCO",
                        JOptionPane.INFORMATION_MESSAGE);

                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null,"Hubo un error"+ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
            }
        }

    }


No se olviden de importar "Exporter".

JInternalFrame maximizado y sin barra de titulos

Hoy les dejo para que puedan copiar y pegar en sus proyectos el código para que el jInternalFrame al abrirlo en su programa sea de forma maximizada y también por separado si quieren ocultar la barra de titulos.

1) el jInternalFrame maximizado:

    try {

        NOMBREQUEPUSIERON.setMaximum(true);

        } catch(PropertyVetoException e) { e.printStackTrace(); }

Para que lo vean aplicado, lo que hice fue crear un jFrame principal con un boton que abre mi jInternalFrame maximizado, desde el jFrame principal agregamos:

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)        {                                          
        Ingresos ing = new Ingresos();
        this.escritorio.add(ing);
        ing.show();
        try {

        ing.setMaximum(true);

        } catch(PropertyVetoException e) { e.printStackTrace(); }
    }  

Al boton le puse esa acción, y listo, ahora el jInternalFrame se ejecuta maximizado. Vale aclarar que de nombre a mi jInternalFrame le puse "Ingresos".

2) Ocultar la barra del titulo al jInternalFrame:

((BasicInternalFrameUI) this.getUI()).setNorthPane(null);

Agreguen eso al código de su jInternalFrame y listo.

Conexion con base de datos MySQL


Vamos a realizar una conexión a una base de datos en MySQL. Nosotros utilizamos el ide de Netbeans y wamp para MySQL. El link al ide de netbeans ya lo dejamos en otro post y ahora les dejamos el link para que se descarguen wamp, también es de código libre.

Link de descarga wamp: Wamp Server

Tenemos dos formas de conectarnos a una base de datos, la mas recomendable es generar una clase que se llame "Conexion" o "Conectar" o cualquier nombre que uds quieran para denominar a esta clase que solo va a contener el código para conectarnos y no tener que escribirlo cada vez que lo necesitemos, la otra es conectarnos "manualmente" escribiendo el codigo correspondiente cada vez que lo necesitemos, por las dudas vamos a ver las dos, nuevamente repito es recomendable que utilicen la primera.

Recordatorio: Siempre debemos importar el jar de mysql para poder efectuar este tipo de conexiones.

La forma recomendable:

1) Primer paso: Creamos la clase "Conexion.java"



/**Le puse al paquete "ejemploMySQL" en el caso de uds sería el nombre del paquete de su proyecto */

package ejemploMySQL;

import java.sql.*;

public class Conexion {
   static String login = "root";
   static String password = "";
   static String basededatos = "ACA PONEMOS EL NOMBRE DE LA BASE";
   static String url = "jdbc:mysql://localhost/"+basededatos;

   Connection conn = null;

   /** Constructor de DbConexion */
   public Conexion() {
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            System.out.println("Conección a base de datos NOMBRE_DE_LA_BASE. listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
   }
   /**Permite retornar la conexión*/
   public Connection getConnection(){
      return conn;
   }

   public void desconectar(){
      conn = null;
      System.out.println("La conexion a la  base de datos
NOMBRE_DE_LA_BASE a terminado");
   }
}

Si instalamos wamp, el usuario por defecto es "root" y no tiene contraseña, por lo que ponemos "" (en blanco), ahora si modificamos el usuario y contraseña debemos modificar esos datos, tambien tengan en cuenta que la parte de:


static String basededatos = "ACA PONEMOS EL NOMBRE DE LA BASE";
static String url = "jdbc:mysql://localhost/"+basededatos;

Podemos poner directamente el nombre de la base en el url, asi:

static String url = "jdbc:mysql://localhost/nombre_de_la_bd";

Y borramos la línea:

static String basededatos = "ACA PONEMOS EL NOMBRE DE LA BASE";

Porque ya no nos sirve.

2) Creamos una clase "Principal.java" para probar la conexión, en este caso hicimos un combobox de prueba que nos lista datos de alguna tabla que creemos de ejemplo:


package ejemploMySQL;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JP Blanco
 */
public class Principal extends javax.swing.JFrame {

    /**
     * Creates new form Principal
     */
    public Principal() {
        initComponents();
        jComboBox1();
    }

    /**
     * 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() {

        jComboBox1 = new javax.swing.JComboBox();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Principal");

        jLabel1.setText("Traemos algun dato:");
        jLabel1.setToolTipText("");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 279, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(41, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(50, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                       

    /**
     * @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(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
public void jComboBox1 () {
   
     Conexion con = new Conexion();
    try {
            Statement st=con.getConnection().createStatement();
          
            /** en el ResultSet ponemos el nombre de la tabla de la que nos vamos a conectar
            en nuestro caso es "persona".*/
            ResultSet rs=st.executeQuery("Select * from persona");
            jComboBox1.removeAllItems();
           
            while(rs.next()){
               
            /** lo que está dentro de los parentesis en el getString es el número de la columna
             * de la cual vamos a ver la información, en nuestro caso elegimos que nos muestre el
             * combobox que creamos los datos de la columna 3.
             */   
               
            jComboBox1.addItem(rs.getString(3));
            }
           
      
          rs.close();
          con.desconectar();
         
              } catch (SQLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
       }         
}
   
   
    // Variables declaration - do not modify                    
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                  
}


Les dejo también directamente para que copien y peguen dentro de la clase que uds tengan la conexión con un combobox, mas adelante iremos haciendo las conexiones con cada uno de los componentes para que copien y peguen rapidamente:


 public void jComboBox1 () {
  
     Conexion con = new Conexion();
    try {
            Statement st=con.getConnection().createStatement();
         
            /** en el ResultSet ponemos el nombre de la tabla de la que nos vamos a conectar
            en nuestro caso es "persona".*/
            ResultSet rs=st.executeQuery("Select * from persona");
            jComboBox1.removeAllItems();
          
            while(rs.next()){
              
            /** lo que está dentro de los parentesis en el getString es el número de la columna
             * de la cual vamos a ver la información, en nuestro caso elegimos que nos muestre el
             * combobox que creamos los datos de la columna 3.
             */  
              
            jComboBox1.addItem(rs.getString(3));
            }
          
     
          rs.close();
          con.desconectar();
        
              } catch (SQLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
       }         

}

Lo importante que queremos resaltar es simplemente el llamado a nuestra clase de conexion que creamos anteriormente escribiendo:

Conexion con = new Conexion ();

try {

Statement st=con.getConnection().createStatement();

y terminando la conexión hacemos:

con.desconectar();

Ahora veamos la otra forma realizando la conexión directamente en nuestra clase, la cual no es la que recomiendo:



     public void jComboBox2(){
    Connection con=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost/dbcontactos", "root", "");
            Statement st=con.createStatement();
            ResultSet rs=st.executeQuery("Select * from persona");
            jComboBox2.removeAllItems();
          
            while(rs.next()){
            jComboBox2.addItem(rs.getString(3));
            }
          rs.close();
          con.close();
        
              } catch (ClassNotFoundException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
              } catch (SQLException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
  
    }


Eso es todo, cualquier duda que tengan me pueden preguntar desde los comentarios! Ah antes de que me olvide, para que apenas ejecuten el programa este combobox que hicimos de prueba les muestre los datos tienen que poner:

jComboBox1();

De esta forma:

    public Principal() {
        initComponents();
        jComboBox1();
}


Librerias Java

Les dejo algunas librerías/jar que vamos a estar utilizando y que son muy útiles.

A modo de resumen, las librerías nos ahorrarán el trabajo de tener que programar cada clase que utilicemos, por ese motivo nos descargamos ya librerías que nos faciliten el trabajo además de las que ya vienen instaladas como por ejemplo System o String muy comunes.

Nunca está demás tener la documentación a mano, les dejamos el link a la página de Oracle: Documentación de las Api de Java

Para poder utilizarlas en nuestro programa debemos hacer un llamado en el inicio para que las reconozca:

Ejemplo:

import javax.swing.JFrame;

Ahora no nos vamos a centrar en que es "javax.swing.JFrame" ni para que sirve, solamente en como se hace para poder utilizar cualquier api en nuestro programa. Lo importante ahora es que tenemos "import javax." por un lado y "swing.JFrame" por el otro, vale aclarar que la api es "swing" y JFrame se encuentra dentro de swing, por lo tanto no podemos llamar a JFrame solo, debemos llamar a "swing" primero y después a la sub-clase JFrame, pero como se imaginarán dentro de "swing" hay muchas otras sub-clases como JButton, que pasa si utilizamos todas? Hay una forma de llamarlas más rápido que tener que escribir una por una que sería:

import.javax.swing.*;

El * cumple la función de importar todas las sub-clases dentro de swing. Para los que utilizan MySql el * cumple la misma función de "seleccionar todo".







Primer post, el IDE que voy a utilizar

Voy a comenzar este Blog para ayudar a todos los programadores nuevos que como yo buscaron recursos por internet, la idea es que sean todas cosas simples y rápidamente aplicables y como bien dice el nombre del blog, puedan utilizar el "copy paste" para ya empezar a programar!

Dando comienzo voy a aclarar que utilizo Netbeans, ya que voy a estar subiendo proyectos de este ide igualmente eso no quita que utilicen el que mas les guste.

Les dejo el link de descarga: Netbeans