Escribir y Leer Archivos Excel en Java

lunes, 17 de mayo de 2010

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);

        }

    }



}

Artículos relacionados


Comments

32 Responses to “ Escribir y Leer Archivos Excel en Java ”
Post a Comment | Enviar comentarios ( Atom )

Linextelia dijo...

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

18 de mayo de 2010, 1:58
Anónimo dijo...

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

"writeExcel ->java.lang.NullPointerException"

Sabes como podria solucionarlo??

8 de julio de 2010, 1:25
Marta dijo...

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

9 de julio de 2010, 12:30
Anónimo dijo...

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

20 de julio de 2010, 22:32

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

Un saludo,

21 de julio de 2010, 8:13

Muy bueno, gracias por compartirlo.

2 de septiembre de 2010, 18:44
Anónimo dijo...

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??

15 de octubre de 2010, 18:26
Anónimo dijo...

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

2 de noviembre de 2010, 23:34
Marta dijo...

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.

3 de noviembre de 2010, 19:24
angel dijo...

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.

24 de noviembre de 2010, 13:11
Anónimo dijo...

Muchas gracias, muy buena aportación.

7 de abril de 2011, 0:02
Anónimo dijo...

Muy buen ejemplo! Gracias!!!

2 de mayo de 2011, 2:30
Anónimo dijo...

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

12 de mayo de 2011, 1:43
Anónimo dijo...

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!!

28 de octubre de 2011, 16:55
Anónimo dijo...

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

9 de enero de 2012, 5:13

Hola saludos después de buscar un rato como corregir la excepción lo resolví modificando un poco el código, modificando esto

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);
------------------------------------------------
Por:

WritableWorkbook workbook = Workbook.createWorkbook(new File(excel_file));
WritableSheet sheet = workbook.createSheet(sheet_name,0);

Lo demás queda igual, espero que a alguien le sirva ya que igual yo estoy empezando xD

21 de junio de 2012, 5:08
alfredo dijo...

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

28 de junio de 2012, 18:55

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

** necesito ayuda **

10 de julio de 2012, 5:43

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

5 de septiembre de 2012, 23:16

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");

28 de noviembre de 2012, 4:56
Macarro dijo...

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?

5 de diciembre de 2012, 12:14

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

8 de enero de 2013, 6:19
Anónimo dijo...

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

9 de marzo de 2013, 23:18
Anónimo dijo...

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?

5 de abril de 2013, 23:03
Anónimo dijo...

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

16 de junio de 2013, 6:37

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

24 de agosto de 2013, 0:39

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?

4 de septiembre de 2013, 19:09
Anónimo dijo...

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

14 de diciembre de 2013, 22:48

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

6 de mayo de 2014, 4:14
Anónimo dijo...

Gracias por el codigo, tendran alguno que solo actualice?

11 de agosto de 2015, 15:25

Publicar un comentario en la entrada

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