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:
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.
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
Para terminar el tutorial, debemos unir tanto la VISTA como el MODELO y para eso esta el CONTROLADOR. o.O El controlador[...]
Cuando queremos presentar un programa hecho en java y darle un toque de profesionalidad, a veces no queremos que el clie[...]
Como dice un viejo dicho, «La practica hace al maestro» y en el mundo de la programación no es diferente, por eso siempr[...]
Cuarta parte de esta pequeña serie de tutoriales sobre [Crea tu blog con el patrón MVC y php] En esta cuarta entrega ver[...]
Desde que Google anuncio de que dejara de dar soporte al plugin de Eclipse y se concentrara en Android Studio, quienes t[...]
El JTable de Java es un gran componente para mostrar datos en una tabla de una forma rápida y sencilla, sin embargo en v[...]