lunes, 17 de mayo de 2010

Escribir y Leer Archivos Excel en Java

Hace un tiempo necesité escribir y leer archivos Excel desde Java, tras buscar en "San Google" y un poco de investigación conseguí lo que quería y por eso el post de hoy. Hay que compartir el conocimiento y así espero que el siguiente que necesite lo mismo no le cueste tanto encontrar la solución.

Lo primero que hay que saber es que existe un API para excel, por la tanto lo primero que debemos hacer es ir a la página de sourceforge y descargarlo: jexcelapi_2_6_12.zip.
En el paquete viene mucha información, documentación, código fuente, etc. Pero lo que realmente nos interesa es el archivo jxl.jar que está en el primer nivel tras descomprimir el zip. Incluimos la librería en el proyecto en el que estemos trabajando y listo.

Ahora viene lo complicado, en la librería vienen muchas funciones por lo que su uso para algo tan simple como escribir y leer algunas celdas puede ser complicado. Por eso os dejo una clase Java que tiene dos funciones, una para leer y otra para escribir.

La función ReadExcel devuelve en un String el contenido de una celda. Hay que pasarle el path donde está el archivo excel, el nombre de la hoja y el numero de la celda (Ejemplo: A4).

La función WriteExcel el valor del número que le pasemos en "value" en las columna y filas indicadas (column, row) de la hoja excel (sheet_name) en el archivo excel indicado (excel_file).

Ahora tan solo tienes que llamar a dichas funciones para escribir y leer archivos excel en Java.

Sigue leyendo para ver el código.



import java.io.File;

import jxl.*;

import jxl.write.NumberFormat;

import jxl.write.WritableCell;

import jxl.write.WritableCellFormat;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;




public class ExcelReadWrite {



    public String readExcel(String excel_file, String sheet_name, String cell_num)

    {

        String cellData = new String();

        try{

            Workbook workbook = Workbook.getWorkbook(new File(excel_file));

       

            //Gets the sheet

            Sheet sheet = workbook.getSheet(sheet_name);

            /* Reads cell data*/

            Cell cell = sheet.getCell(cell_num);

            cellData = cell.getContents();



            workbook.close();

        }

        catch(Exception e)

        {

            System.out.println("readExcel ->"+e);

        }

        return cellData;

    }





    public void writeExcel(String excel_file, String sheet_name, int row, int column, Double value)

    {

        String cellData = new String();

        try{

            Workbook target_workbook = Workbook.getWorkbook(new File(excel_file));

            WritableWorkbook workbook = Workbook.createWorkbook(new File(excel_file), target_workbook);



            target_workbook.close();



            WritableSheet sheet = workbook.getSheet(sheet_name);



            jxl.write.Number number = new jxl.write.Number(column, row, value);

            sheet.addCell(number);



            workbook.write();



            workbook.close();

        }

        catch(Exception e)

        {

            System.out.println("writeExcel ->"+e);

        }

    }



}

31 comentarios:

  1. Excelente información estimado, la pondré en práctica

    ResponderEliminar
  2. Muy buen aporte, solo que me marca el siguiente error:

    "writeExcel ->java.lang.NullPointerException"

    Sabes como podria solucionarlo??

    ResponderEliminar
  3. Como no des un poco más de información está complicado.
    ¿Qué parámetros le has pasado?

    ResponderEliminar
  4. Hola disculpen
    Alguno de ustedes sabe como actualizar o modificar un archivo de excel ya existente desde java

    ResponderEliminar
  5. El código que ves es precisamente para eso, la función writeExcel modifica un archivo existente.

    Un saludo,

    ResponderEliminar
  6. Buenas como estas.
    tengo un problema cuando leo una celda con texto y este tiene tildes, el programa me devuelve Vibraci� y lo que me deberia de devolver es Vibración, tengo que configurar el texto a utf8 o que podria ser??

    ResponderEliminar
  7. Una pregunta??? este codigo funciona tambien en ambiente web?? o solo es para aplicaciones de escritorio??

    ResponderEliminar
  8. En principio si, lo único que la lectura y escritura del excel tendrás que hacerlo en el servidor y luego hacer algo para descargar el archivo.

    ResponderEliminar
  9. Hola, sólo un comentario ya que hay gente que lo ha preguntado al principio...
    En el método writeExcel, teneis que poner:
    WritableSheet sheet = workbook.createSheet(sheet_name,0);

    Ya que si no os dará una excepcion, al hacer .getSheet... al escribir teneis que crearla, no obtenerla...

    un saludo. Blacos.

    ResponderEliminar
  10. Muchas gracias, muy buena aportación.

    ResponderEliminar
  11. Muy buen ejemplo! Gracias!!!

    ResponderEliminar
  12. eeeyyy explica como le mandas el parametro excel_file, es la direccion que debes de poner.

    ResponderEliminar
  13. un Exito tu ejemplo papa!!! me re sirvio!! sos groso sabelo!!

    lo unico cambie la fila
    Cell cell = sheet.getCell(cell_num);
    por
    Label number = new jxl.write.Label(column, row, string);

    para poder meterle Strings en vez de Double!

    asi que barbaro justo lo que necesitaba para hacer un programita basico que me pidieron!!

    ResponderEliminar
  14. tengo un problema, se trata que al ejecutar me niega el acceso a la ubicación , si alguien sabe por que le agradecería mucho que me explicara

    ResponderEliminar
  15. ya cree el archivo,ya escribe ya lee pero al leer tengo problemas con los decimales no los lee completos

    ResponderEliminar
  16. Y COMO AGREGO UN STRING A UNA CELDA DE EXCEL
    ¿?¿?¿?

    ** necesito ayuda **

    ResponderEliminar
  17. Hola! Una ayuda por favor:
    ¿COMO AGREGO UN STRING A UNA CELDA DE EXCEL EN VEZ DE UN DOUBLE ?? (METODO ESCRIBIR)

    ResponderEliminar
  18. Leyendo esto con la necesidad de hacer algo similar, me vi obligado a buscarle como es que debía hacer para meter cadenas, y me di cuenta de que podemos hacer lo siguiente:

    import javax.swing.*; ///Para ver el resultado
    import java.io.File;
    import jxl.*;
    import jxl.write.NumberFormat;
    import jxl.write.Label; /// Importamos esto
    import jxl.write.WritableCell;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;

    public String readExcel(String excel_file, String sheet_name, String cell_num)
    {
    String cellData = new String();
    try{
    Workbook workbook = Workbook.getWorkbook(new File(excel_file));

    //Gets the sheet
    Sheet sheet = workbook.getSheet(sheet_name);
    /* Reads cell data*/
    Cell cell = sheet.getCell(cell_num);
    cellData = cell.getContents();
    JOptionPane.showMessageDialog(null,cellData);
    workbook.close();
    }
    catch(Exception e)
    {
    System.out.println("readExcel ->"+e);
    }
    return cellData;
    }

    public void writeExcel(String excel_file, String sheet_name, int row, int column, String string)
    {
    String cellData = new String();
    try{
    WritableWorkbook workbook = Workbook.createWorkbook(new File(excel_file));
    WritableSheet sheet = workbook.createSheet(sheet_name,0);
    Label number = new jxl.write.Label(column, row, string);
    sheet.addCell(number);
    workbook.write();
    workbook.close();
    }
    catch(Exception e)
    {
    System.out.println("writeExcel ->"+e);
    }
    }



    al llamarlos lo hacemos de esta manera:


    writeExcel("datos.xls","dato",2,3,"imbécil");


    y


    readExcel("datos.xls","dato","D3");

    ResponderEliminar
  19. Buenos dias...

    Tengo el siguiente problema:

    En un directorio , por ejemplo C: tengo un documento .xls en el cual ya hay montones de datos introducidos. Utilizando el código que muestran estoy intentando UPDATEAR una de las celdas que yo le indico con el metodo write. Para mi sorpresa lo que ocurre es que borra TODAS las pestañas y Crea una nueva en la que introduce el dato que queria guardar con la consiguiente perdida de datos. ¿hay alguna manera de "Editar" un documento?

    ResponderEliminar
  20. he creado un documento de excel. Como hago para que al modificar no se pierda el formato de las celdas.

    ResponderEliminar
  21. Esta interesante su post, desearía conocer si hay alguna forma de agregar más de una celda, sin perder la información... Gracias..

    ResponderEliminar
  22. Para leer un archivo de excel en el servidor, tengo que tener instalado el office en el servidor o con la libreria lo puede leer el servidor sin problemas?

    ResponderEliminar
  23. nadie parece saber como agregar datos a una hoja de excel existente sin borrar los anteriores....

    ResponderEliminar
  24. alguien sabe como ponerle el tamaño a las celdas?

    ResponderEliminar
  25. Este programa no puede leer achivos de excel con versiones de office mas nuevo.

    Por ejemplo no puede leer achivos con terminacion .xlsx

    Alguien que pueda apoyarme con eso?

    ResponderEliminar
  26. Muchas Gracias, estoy aprendiendo java y me ha sido de mucha ayuda.

    ResponderEliminar
  27. Alguien podria pasarme el codigo entero porque no entendi y me da errores desde ya muchas gracias.

    ResponderEliminar
  28. Gracias por el codigo, tendran alguno que solo actualice?

    ResponderEliminar

Deja tu opinión realizando un comentario interesante. Cualquier intento de Spam no será admitido.