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
¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames[...]
Un CardView es parte de los estilos de Material Design y nos permite mostrar información dentro de tarjetas (Card), esta[...]
Gson es una biblioteca de código abierto para Java desarrollado por Google Inc que permite la serialización y deserializ[...]
Geany es un editor de texto para Sistemas Operativos Linux, windows y MAC que utiliza el kit de herramientas GTK+ con ca[...]
En tutoriales pasados creábamos demasiadas líneas de código en el mismo lugar para dibujar en la pantalla, cosa que nos[...]
A continuación tenemos una clase que nos permite arrastrar un archivo de Excel (*.xlsx) y cargar su contenido en una tab[...]