Exportar JTable a Excel (Enviar datos de JTable a Hoja de Excel)

jtable

Obtener información de una aplicación se hace necesario en muchos casos, es por ello que debemos dotar de estas funciones para que el usuario final pueda acceder u obtener a la información que esta visualizando, en esta entrada veremos como exportar JTable a Excel mostrando un cuadro de dialogo con el que capturaremos la ruta en la cual deseamos crear nuestro archivo, veamos:

Exportar JTable a Excel (Enviar datos de JTable a Hoja de Excel)

Primero que todo necesitamos importar la libreria jxl.jar, como ya saben [Clic derecho sobre libraries — add Jar Folder ], Luego creamos una clase yo la llamaré Exporter y tiene el siguiente código:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 package Clases;

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

/**
 *
 * @author IdlhDeveloper
 */
 public class Exporter {
 private File file;
 private List tabla;
 private List nom_files;

public Exporter(File file, List tabla, List 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);
 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 (Exception e) {
 return false;
 }
 }
 }

 

Boton Exportar:

 if (jTable1.getRowCount() > 0) {
 JFileChooser chooser = new JFileChooser();
 FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivos de excel", "xls");
 chooser.setFileFilter(filter);
 chooser.setDialogTitle("Guardar archivo");
 chooser.setAcceptAllFileFilterUsed(false);
 if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
 List tb = new ArrayList();
 List nom = new ArrayList();
 tb.add(jTable1);
 nom.add("Compras por factura");
 String file = chooser.getSelectedFile().toString().concat(".xls");
 try {
 Clases.Exporter e = new Exporter(new File(file), tb, nom);
 if (e.export()) {
 JOptionPane.showMessageDialog(null, "Los datos fueron exportados a excel en el directorio seleccionado", "Mensaje de Informacion", JOptionPane.INFORMATION_MESSAGE);
 }
 } catch (Exception e) {
 JOptionPane.showMessageDialog(null, "Hubo un error " + e.getMessage(), " Error", JOptionPane.ERROR_MESSAGE);
 }
 }
 }else{
 JOptionPane.showMessageDialog(this, "No hay datos para exportar","Mensaje de error",JOptionPane.ERROR_MESSAGE);
 }

Para este ejemplo he creado un JTable y le he ingresado algunos datos de forma manual:

Exportar JTable
El en código anterior vemos como lanzamos el dialogo para guardar el archivo en la ruta seleccionada y hacemos llamado a la clase Exporter a la cual le pasamos nuestro JTable como parámetro, sin mas ni mas solo queda ejecutar nuestra aplicación y probar que todo esté en orden.
Puedes descargar el código completo en
GitHub

¡Suscríbete a mi canal, para acceder a más contenidos gratuitos!

7 comentarios

  1. Juan C. Horna Contestar

    para casos en que se necesite exportar el titulo de cada columna habria que hacer el siguiente cambio.

    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);
    for (int i = 0; i < table.getColumnCount(); i++) {
    String NomCol = table.getColumnName(i);
    s.addCell(new Label(i, 0,NomCol));

    for (int j = 0; j < table.getRowCount(); j++) {
    Object object = table.getValueAt(j, i );
    s.addCell(new Label(i, j + 1, String.valueOf(object))); //lo pone en la fila 0+1
    }
    }
    }
    w.write();
    w.close();
    out.close();
    return true;
    } catch (IOException | WriteException e) {
    System.out.println("Error al exportar a Excel:" + e.getMessage() );
    return false;
    }
    }

  2. JULIO Contestar

    Hola buenas tarde tengo el siguiente problema realize un proyecto que funciona a la perfeccion desde el equipo que se realizo la codificacion ahora hice un archivo JAR y lo lleve a otro equipo lo cual tambien funciona bien no marca ningun error de codigo pero al guardar mi archivo en formato xls ya no guarda nada(o sea no genera el archivo *.xls), cuando en el primer equipo funciona al 100%

    • Ivan David Lopez Autor de la entradaContestar

      Que más Julio, posiblemente estés usando alguna ruta establecida en tu equipo para realizar el guardado del archivo, si no es así verifica también que exista la librería en el directorio de tu aplicación, así mismo realiza un paso a paso para verificar en que momento esta fallando tu programa.
      Saludos!.

  3. Leo Contestar

    si quiero exportar este segmento de código el cuál me genera un arbol a un libro de excel ?

    @RequestMapping(value = “/load”, method = RequestMethod.GET)
    public void getNodes(HttpServletRequest request, HttpServletResponse response, Model model, Locale locale,
    @RequestParam(required = false, value = “idHierarchyCustomer”)Long idHierarchy)
    throws IOException{

    List children=new ArrayList();
    children.add(customerTreeService.findChildrenByParent(idHierarchy));
    TreeNode treeNode1=new TreeNode();
    treeNode1.setData(children);
    treeNode1.setTreeNode(jsonHelper.SerializeToString(children));
    this.serializeToResponse(response, treeNode1);

    }

    //////////////////////////////////////////////////////////////////////////////////////

    el método que exporta el xls es este…

    @RequestMapping(value = “exportClients”, method = RequestMethod.GET)
    public void exportClients(Model model, Locale locale, Authentication auth,
    @RequestParam(value = “load”, required = false) Long code,
    HttpServletResponse response) {
    try {
    CustomerFilterVO filter = new CustomerFilterVO();
    filter.setCustomerCode(code);
    String reportType = TypeReport.XLS.getExtension();
    LocalizedMessageResolver resolver = new LocalizedMessageResolverImpl(this, locale);
    customerTreeReporter.setMessageResolver(resolver);
    customerTreeReporter.setName(resolver.getMessage(“customerTree.report.title”));
    customerTreeReporter.setFilter(filter);
    customerTreeReporter.setLocale(locale);
    customerTreeReporter.setContext(context);
    reporter.setReportBuilder(customerTreeReporter);
    reporter.buildReport();
    response.setHeader(“Content-Disposition”, “attachment; filename=” + reporter.getNameFile(reportType)); // just works for Excel meanwhile
    ServletOutputStream outputStream = response.getOutputStream();
    TypeReport typeReport = reporter.export(reportType, outputStream);
    response.setContentType(typeReport.getContentType());
    outputStream.flush();
    } catch(Exception e) {
    e.printStackTrace();
    }
    }

  4. Josué Contestar

    Hola, quiero exportar los datos de una tabla pero con un formato especifico (plantilla) su ejemplo me funciona muy bien, pero tengo esa duda de como llenar el excel con mi formato… espero me den una ideas 😀

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *