Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Arrastrar y abrir archivo Excel

Arrastrar y abrir archivo Excel

Autor jc mouse domingo, febrero 23, 2014

En este post, crearemos una aplicación java que nos permita arrastrar un archivo excel hacia la aplicación, abrirlo y cargar sus datos en un JTable. Pero mejor ve el siguiente video para despejar dudas.

Necesitamos

– Java 1.6 / Netbeans 7.3+

– Librería JExcelApi

Nivel: Intermedio

Tiempo: 15 minutos

Proyecto

1. Crea un proyecto en Netbeans con la siguiente estructura:

drop excel

Debes añadir también la librería JExcel al proyecto.

2. La Interfaz

La interfaz de usuario comprende un JFrame: JGUIForm que contiene a su vez un JTable, no necesitamos nada más.

GUI Excel 2003

3. Clase DropExcel.java

Esta clase es quien realiza el trabajo de arrastre implementando DropTargetListener, así también se encargara de leer el archivo excel una vez que este sea arrastrado a la interfaz.

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class DropExcel implements DropTargetListener{
    private DropTarget dt;
    private JTable jtable;
    private DefaultTableModel TableModel = new DefaultTableModel();

    public DropExcel( JTable jtable ){
        this.jtable = jtable;
        dt = new DropTarget( jtable , this );  
    }

  @Override
  public void dragEnter(DropTargetDragEvent dtde) {}

  @Override
  public void dragExit(DropTargetEvent dte) {}

  @Override
  public void dragOver(DropTargetDragEvent dtde) {}

  @Override
  public void dropActionChanged(DropTargetDragEvent dtde) {}

  @Override
  public void drop(DropTargetDropEvent dtde) {
     try {
            /* proporciona datos para operaciones de transferencia en swing */
            Transferable tr = dtde.getTransferable();
            /* Devuelve una array de objetos DataFlavor */
            DataFlavor[] flavors = tr.getTransferDataFlavors();                        
            if( flavors.length > 0 ){                    
                /* Si existe una lista de objetos de archivo */
                if ( flavors[0].isFlavorJavaFileListType() ) {                     
                    dtde.acceptDrop( DnDConstants.ACTION_COPY );                    
                    /* obtiene un List con los archivos arrastrados al componente */
                    java.util.List list = (java.util.List) tr.getTransferData( flavors[0] );                    
                    if( !list.isEmpty() ){ /* abre el primer archivo */                        
                        File file = new File( list.get(0).toString() );
                        if ( file.exists() ){     
                            /* SI el archivo corresponde a un archivo excel */
                            if( file.getName().endsWith("xls") )
                            {
                                readXLS( file );
                            }else{
                                JOptionPane.showMessageDialog(null,"No es un archivo *.xls valido","Error", JOptionPane.ERROR_MESSAGE );                                
                            }                            
                        }else{ System.err.println( "error archivo no existe " ); }
                    }                    
                    dtde.dropComplete(true);
                    return;
                }
            }
            System.err.println("Drop failed: " + dtde );
            dtde.rejectDrop();
        } catch (Exception ex) {
            System.err.println( ex.getMessage() );
            dtde.rejectDrop();
        }
  }

  /**
 * Metodo para leer solo la primera hoja de un archivo excel y colocar los datos
 * en un DefaultTableModel
 * @param File xls archivo excel
 */
  private void readXLS( File xls ){               
        try { 
            Workbook workbook = Workbook.getWorkbook( xls );            
            /* Si existen hojas */
            if( workbook.getNumberOfSheets() > 0 ){
                Sheet hoja = workbook.getSheet( 0 ); /* obtiene solo la primera hoja */                
                /* forma el array para los nombres de las columnas del JTable */
                String[] columNames = new String[ hoja.getColumns() ];
                /* Forma la matriz para los datos */
                Object[][] data = new String[ hoja.getRows() ][ hoja.getColumns() ];  
                /* Recorre todas las celdas*/
                for ( int fila = 0; fila < hoja.getRows(); fila++ )
                {   
                    for ( int columna = 0; columna  < hoja.getColumns() ; columna++ )
                    {
                        /* Asigna nombre de columna */
                        columNames[columna]="Columna " + ( columna + 1 );
                        /* Lee celda y coloca en el array */
                        data[ fila ][ columna ] = hoja.getCell(columna, fila).getContents();
                    }                                        
                }
                /* Crea el TableModel y asigna a tabla */
                TableModel = new DefaultTableModel( data, columNames );
                jtable.setModel(TableModel);
            }

        } catch (IOException ex) {
            System.err.println( ex.getMessage() );
        } catch (BiffException ex) {
            System.err.println( ex.getMessage() );
        }
  }

  public DefaultTableModel getTableModel()
  {
      return this.TableModel;
  }

  public DropTarget getDropTarget()
  {
      return this.dt;
  }

}

4. Para terminar el proyecto,  debemos implementar la clase anterior en la interfaz

public class JGUIForm extends javax.swing.JFrame {

    DropExcel de;
    /**
 * Creates new form JGUIForm
 */
    public JGUIForm() {
        initComponents();

        de = new DropExcel( jTable1 );
    }
...

Ejecutamos y listo 🙂

Proyecto en Netbeans 7.3 AQUI

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Hangman: El juego del ahorcado en java

Hangman: El juego del ahorcado en java

El Juego del ahorcado o Hangman, es un clásico juego de mesa que consiste en adivinar la palabra secreta, si no lo consi...

Uso del condicional IF

Uso del condicional IF

En este post conocernos lo que son las Estructuras de Control IF en los script de Bash. Estas estructuras nos ayudan a c...

Material Design: CardView (Tarjetas)

Material Design: CardView (Tarjetas)

Un CardView es parte de los estilos de Material Design y nos permite mostrar información dentro de tarjetas (Card), esta...

Primeros pasos con Vue CLI: Crea tu Entorno de Trabajo

Primeros pasos con Vue CLI: Crea tu Entorno de Trabajo

En un post anterior [Introducción a VueJS framework para el desarrollo FrontEnd] realizamos una breve introducción a Vue...

Ciudadanía digital y seguridad en Internet

Ciudadanía digital y seguridad en Internet

«Be Internet Awesome» (Se genial en Internet) es un recurso de Google para la enseñanza  de conceptos fundamentales sobr...

DOM4J: Creación de archivos XML

DOM4J: Creación de archivos XML

DOM4J es una de las librerías para java más populares para el trabajo con XML ya que nos permite crea, editar y leer doc...

10 comentarios en “Arrastrar y abrir archivo Excel”

  1. vicdan dice:

    hola amigo como estas..? espero recibir tu contestacion, estoy en esto del stock, hize todo y en orden, hasta que al parecer la tabla de producto (nueva compra) estaba contruido como para completar nosotros mismos XD, solo que al darle muchas vueltas no puedo hacer para que se ejecute la consulta..!!

    1. vicdan dice:

      yo de nuevo…. solo te escribía para decirte que ya solucione el problema, ahí en el controlador… igual gracias.. y muy buenos aportes los tuyos….

      1. Mouse dice:

        lo siento men no pude ingresar a revisar los coments muy seguido, me alegro que hallas encontrado la solucion 🙂

  2. Yesica dice:

    Muchas gracias, saludos…

  3. Monica dice:

    Hola me gusto mucho tu aporte,
    Tengo una consulta: Se puede cambiar la alineacion de los datos de una columna de un jtable? sin usar la clase que vos haces para el manejo de celdas?

    Resulta que tengo una tabla ya armada y cargada(con un resultset) con valores tanto caracteres como numericos, y quiero que las columnas que tienen valores numericos, muestren sus valores alineados a la derecha.
    Estos valores hacen referencia a precios, costos, etc.

    Si pudieras ayudarme con esto, ya que no tengo muchos conocimientos sobre el tema. Gracias.

  4. Carlos Sanchez dice:

    Excelente aporte

    Lo quise bajar pero esta roto el link

    Subelo denuevo por fa

    Gracias

    1. Mouse dice:

      esta vivo el link 🙂

  5. Car dice:

    Hola hola, nada mas agradecer la información que proporcionaste JCM, el tuyo es el único que me funcionó, después de indagar por varios días… De verdad muchas gracias 🙂

  6. david dice:

    Hola una pregunta y para guardar estos datos almacenados en el jtable como se haria como un array list o for? o como? si me colaboras te lo agradeceria.

    1. Mouse dice:

      si quieres guardar esos datos en una bd, cada fila de la tabla puede ser un registro, puedes hacer dos cosas: insertar fila por fila a la BD, no recomendable si tienes muchos datos porque se tardaría demasiado, 2) leer cada fila e ir formando en un string el SQL para insertar todos los datos de golpe.

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Quasar es un proyecto Open Source basado en el Framework Vue que nos permite desarrollar proyectos de todo tipo, por eje...

Continuando el post de «Introducción a Retrofit» donde realizamos una breve preparación a lo que es el uso de la librerí...

Editar un documento PDF no es tan sencillo como editar un archivo de texto por ejemplo, para editar archivos PDFs necesi...

¿Alguna vez tuviste la necesidad de hacer una captura de pantalla de una página web? Si es así, seguramente buscaste y d...

Herramientas

Generador de Enlaces a Whatsapp