Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Arrastrar y abrir archivo Excel

Arrastrar y abrir archivo Excel

Por 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

Artículos similares

Criba de Eratóstenes animado

Eratóstenes era un matemático griego del siglo  III a.C. el cual ideó una manera rápida de obtener todos los números pri[...]

Cifrado del Cesar en C Sharp

En criptografía, el cifrado César, también conocido como cifrado por desplazamiento, código de César o desplazamiento de[...]

Detección de rostros con android

La API de Android ha ido evolucionado rápidamente y cada vez contiene más funcionalidades que hacen que desarrollar sist[...]

WordPress: Crear un nuevo tema de bloques con Create Block Theme

Create Block Theme es el plugin oficial de WordPress para la creación y exportación de «Temas de Bloques» (Block Themes)[...]

Manejo de excepciones: Uso de Throw Exception en Laravel 11

El manejo correcto de excepciones permite que nuestras aplicaciones sean robustas, tolerante a fallos y amigable con el[...]

Imprimir Swing

Java Printing nos permite hacer uso de las impresoras del sistema para, valga la redundancia 🙂 imprimir los gráficos de[...]