lunes, 10 de mayo de 2010

Leer un fichero Excel desde Java









Muchas veces puede resultar interesante interactuar con hojas Excel desde nuestra aplicación Java. Ésto es lo que nos permite el API JExcel. Se trata de una librería opensource e independiente de otras librerías que permite leer, crear y editar ficheros de excel. En este ejemplo simplemente se muestra cómo leer un archivo .xls.



Descargar e importar la librería JExcel.


Nos descargamos la librería desde aquí:

http://sourceforge.net/projects/jexcelapi/files/

Luego simplemente incorporamos a nuestro proyecto el archivo "jxl.jar".

Lo haremos pinchando con el botón derecho sobre la carpeta del proyecto; pinchamos en Propiedades; opción "Java Build Path"; pestaña Librerías; finalmente pulsamos en "Add External JAR" y seleccionamos el archivo jxl.jar



La aplicación


Lo que hace es lo siguiente:

Recorre cada hoja del archivo excel. Dentro de cada hoja, recorre todas las columnas de cada fila del archivo excel y muestra su contenido en pantalla.

Para probar la aplicación:

Hay que colocar un archivo excel de prueba con datos. Yo lo he puesto en la misma carpeta que el archivo java con el nombre "archivoPrueba.xls".

A continuación se muestra el código del archivo java:



import jxl.*; 
import java.io.*; 

public class ReadExcel { 
private void leerArchivoExcel(String archivoDestino) { 

try { 
Workbook archivoExcel = Workbook.getWorkbook(new File( 
archivoDestino)); 
System.out.println("Número de Hojas\t" 
+ archivoExcel.getNumberOfSheets()); 
for (int sheetNo = 0; sheetNo < archivoExcel.getNumberOfSheets(); sheetNo++) // Recorre 
// cada    
// hoja                                                                                                                                                       
{ 
Sheet hoja = archivoExcel.getSheet(sheetNo); 
int numColumnas = hoja.getColumns(); 
int numFilas = hoja.getRows(); 
String data; 
System.out.println("Nombre de la Hoja\t" 
+ archivoExcel.getSheet(sheetNo).getName()); 
for (int fila = 0; fila < numFilas; fila++) { // Recorre cada 
// fila de la 
// hoja 
for (int columna = 0; columna < numColumnas; columna++) { // Recorre                                                                                
// cada                                                                                
// columna                                                                            
// de                                                                                
// la                                                                                
// fila 
data = hoja.getCell(columna, fila).getContents(); 
System.out.print(data + " "); 

} 
System.out.println("\n"); 
} 
} 
} catch (Exception ioe) { 
ioe.printStackTrace(); 
} 

} 

public static void main(String arg[]) { 
ReadExcel excel = new ReadExcel(); 
excel.leerArchivoExcel("archivoPrueba.xls"); 
} 
}




Fuentes:


http://www.mindfiresolutions.com/How-to-read-an-excelsheet-from-Java-217.php




133 Comentarios:

PUCH dijo...

De lo más útil sobre el tema que he encontrado.

Muchas gracias!

Un saludo.

Felipe dijo...

Me alegra que te sirviera.

Gracias a tí por comentar.

Anónimo dijo...

gracias me has salvado la vida de verdad gracias funciona a la perfección y fácil de entender

Felipe dijo...

De nada, vuelve por el blog cuando quieras.

Saludos.

Rtome dijo...

una duda con esto como le haces para que en el documento de excel que se crea acepte acentos y la letra ñ, agradeceria infinitamente que pudieras responder

Felipe dijo...

Hola Rtome.

En este ejemplo no se crea ningún documento. Simplemente se lee desde java un archivo excel que previamente he creado.
No obstante, la librería JExcel te premite escribir en hojas excel. Puedes echarle un vistazo al siguiente ejemplo:
http://www.java-tips.org/other-api-tips/jexcel/how-to-create-an-excel-file.html

No creo que tengas problemas con los acentos y la ñ, pero si tienes algún inconveniente, coméntamelo y trataré de ayudarte.

Saludos.

Leo dijo...

Gracias. el código que muestras es efectivo y va directo al punto.
felicidades

Felipe dijo...

De nada Leo. Me alegro de que te fuera útil el post.

Saludos.

Anónimo dijo...

Excelente codigo, es muy facil de entender y era justo lo q andaba buscando. gracias!!

Felipe dijo...

Gracias a tí por comentar.

Saludos.

Anónimo dijo...

Hola perdon estoy iniciando en el mundo de java y estoy trabajando este ejemplo desde netbeans, solo que me sale un error en esta parte
Workbook archivoExcel = Workbook.getWorkbook(new File(archivoDestino));
Me dice algo de que la clase no existe

Felipe dijo...

Buenas.

Ese error ocurre porque no están importadas las librerías. Arriba, en la parte "Descargar e importar la librería JExcel" explico cómo hacerlo en Eclipse. En Netbeans no lo he intentado, pero no debe ser muy complicado.

También tienes que asegurarte en el código de que haces los import:

import jxl.*;
import java.io.*;


Si sigues teniendo dificultades, no dudes en preguntarme.

Saludos.

Alex dijo...

Me gusta un utiliza de un foro de Internet. Este programa asistiò mucho y rapidamente, ademas puede determinar todo complijado por par minutos y este situation tambien a mi todo de ver - recuperar archivo de excel.

Felipe dijo...

Buenas.

No entiendo mucho lo que dices pero parece que te ha servido este posts, de lo cual me alegro.

Saludos.

carolita dijo...

Hola Felipe,

Mira, yo estoy tratando de trabajar con el ejemplo que publicaste, en verdad es muy bueno. Ya importe las librerías e hice en código en Eclipse y no presenta error cuando compilo. Sin embargo, quería preguntarte dónde es exactamente que se debe poner el archivo de excel porque lo he puesto en la carpeta de Java y me genera el siguiente error: "java.io.FileNotFoundException: archivoPrueba.xls (El sistema no puede hallar el archivo especificado)" y nose dónde más ponerlo.

Te agradecería mucho si me pudieras ayudar.

Gracias y éxitos.

carolita dijo...

Hola Felipe,

Ya supe como hacerlo. Muchas Gracias.

Psdta: Lo que publicas en tu blog muy útil y fácil de hacer, felicitaciones. :)

Felipe dijo...

Hola Carolita.

Agradezco mucho tus felicitaciones. Si tienes alguna otra consulta, no dudes en preguntar.

Saludos.

rodanmuro dijo...

La verdad si que se tienen problemas con la ñ al menos. Cuando trato de obtener el contenido de una celda que tiene ñ me devuelve u simple cuadrito. No se si sea la versión del jxl que tengo. Conoces alguna forma para resolver esto??. Gracias por tu aporte.

Felipe dijo...

Hola rodanmuro.

He probado el ejemplo de nuevo guardando el fichero excel con extensión "Libro de Excel 97-2003(*.xls)" y con la versión 2.6.12 de jexcel: me ha funcionado correctamente, tanto la ñ como las palabras que contenían tilde. Compruébalo de nuevo, porque quizás sea un tema de la codificación del excel o de la versión del jexcel.

Espero que te funcione. Cualquier duda que tengas, pregúntame.

Saludos y Feliz Navidad!

Anónimo dijo...

Hola,

En mi caso, para que me lea/escriba bien eñes, acentos y demás caracteres, configuro el WorkbookSettings de esta forma:

WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setEncoding("ISO-8859-1");
wbSettings.setLocale(new Locale("es", "ES"));
wbSettings.setExcelDisplayLanguage("ES"); wbSettings.setExcelRegionalSettings("ES"); wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());

Saludos!

Felipe dijo...

Hola.

Gracias por tu aportación y espero que le sirva a alguien. Como dije anteriormente, yo no tuve ningún problema con los acentos y las eñes, no tuve que configurar nada.

Saludos.

Elisa dijo...

Buen dia:
quisiera saber si puedo leer el contenido de varios exceles y guardarlos en un array usando esta libreria o si solo me lee un archivo

Felipe dijo...

Hola Elisa.

Puedes abrir todos los archivos excel que quieras. Si usamos el ejemplo que he puesto, tendrías que llamar al método tantas veces como archivos quieras leer, pasándole como argumento el nombre del archivo excel. Ejemplo:


public static void main(String arg[]) {

ReadExcel excel = new ReadExcel();
excel.leerArchivoExcel("archivoExcel1.xls");
excel.leerArchivoExcel("archivoExcel2.xls");
excel.leerArchivoExcel("archivoExcel3.xls");
// ...

}



Saludos.

Anónimo dijo...

Saludos Felipe, creo q no t daba problemas con las ñ ni los acentos porq usas SO windows, si usaras Linux si t diera problemas con las ñ y acentos y es donde entra la configuracion posteada por "anónimo" (se ve raro esto jajajaja), q es funciona a la perfección

Felipe dijo...

Hola.

Quizás tengas razón, ya que Eclipse sólo lo tengo instalado en Windows y por tanto, el ejemplo sólo lo he probado ahí. Así que gracias por apuntar el problema y por indicar la solución. Espero que le sirva a más gente.

Saludos.

Anónimo dijo...

Hola, buenos días he probado el codigo en Oracle WebLogic y me da el siguiente error:

jxl.read.biff.BiffException: Unable to recognize OLE stream
at jxl.read.biff.CompoundFile.(CompoundFile.java:116)
at jxl.read.biff.File.(File.java:127)
at jxl.Workbook.getWorkbook(Workbook.java:221)
at jxl.Workbook.getWorkbook(Workbook.java:198)
at ReadExcel.readExcelSheet(ReadExcel.java:11)
at ReadExcel.main(ReadExcel.java:36)
Por favor necesito ayuda!!

Felipe dijo...

Hola.

Éste ejemplo se ha probado como una aplicación Java y desde el IDE Eclipse.

¿Tú como estás ejecutando este código, desde un archivo .java o un .jsp? ¿la aplicación la vas a ejecutar desde el lado del cliente o desde el servidor?

Estas consideraciones son importantes, ya que el código requerirá de algunas modificaciones según desde donde se ejecute.

Saludos.

Mizo dijo...

De tantos tutoriales en internet, este fue el mejor! Gracias!

Felipe dijo...

Hola Mizo.

Muchas gracias a tí por comentar.

Saludos.

Anónimo dijo...

hola
Tengo problemas con lo de la ñ y las tíldes.
Donde se debe poner el código del WorkbookSettings que explican arriba?....muchas gracias de antemano

Felipe dijo...

Hola.

Según algunos comentarios, existen errores con la ñ y las tildes si estás utilizando Linux (supongo que por la versión o el idioma del JDK instalado). Para solucionar eso, puedes intentar (tal y como indican en un comentario) sustituir esta línea:

Workbook archivoExcel = Workbook.getWorkbook(new File(
archivoDestino));


Por estas líneas:

WorkbookSettings wbSettings = new WorkbookSettings(new File(
archivoDestino));
wbSettings.setEncoding("ISO-8859-1");
wbSettings.setLocale(new Locale("es", "ES"));
wbSettings.setExcelDisplayLanguage("ES"); wbSettings.setExcelRegionalSettings("ES"); wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());


Yo no lo he probado, así que hazlo tu y nos cuentas si te ha funcionado.

Saludos.

david dijo...

Waoo me salvaste la vida ... usaste metodos que no conocia ya yo me iba a erredar para contar la filas y columnas ....Bueno es que soy nuevo probando el JExcelapi ... ahora me han dejado un proyect que tiene que ver con exportar datos de excel a java(suerte que solo se tiene que leer los datos y no escribirlos) ... muy bueno tus aportes, Felicitaciones ...

Ahora tengo una duda no se si es posible exportar las graficas que se generan en excel hacia java para mostrarlos???

Anónimo dijo...

Gracias viejo...muy buen aporte..lo buscaba desde hace ratooooooooooooooo

Felipe dijo...

Hola David.

No se si se pueden exportar las gráficas desde el archivo excel hacia la aplicación Java. Yo creo que lo mejor es que apartir de los datos que capturas en la aplicación Java, construyas los gráficos. Te recomiendo la librería JFreeChart.

Para Anónimo: me alegro de que te sirviera.

Saludos a los dos.

Anónimo dijo...

Hola david me sale el sgte error:
java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Exception in thread "main"

Sabes porque peude ser?

Saludos

Felipe dijo...

Hola.

A mí nunca me ha aparecido este error. ¿Estás usando Ubuntu?. Si es así, aquí se propone una solución:
http://cirovladimir.wordpress.com/2009/09/11/java-bad-version-number-in-class-file/

Parece ser que al actualizar el JDK desde Ubuntu, Eclipse no encuentra el JRE. En ese artículo explica como solucionarlo. Dime si has podido arreglarlo o si tenemos que buscar otra solución.

Saludos.

John dijo...

Hola, muchas gracias. Funciono perfecto.
Estoy trabajando en una aplciacion que leear datos de una planilla excel, los reuna y luego los inserte en una planilla ya creada en las celdas que yo necesite.
Me recomiendas algun tutorial para guiarme?
O algun metodo facil para escribir en un excel ya existente?
Muchas gracias!

Felipe dijo...

Hola John.

He encontrado este PDF que lo explica de forma clara y sencilla:

http://www.balearsinnovacio.com/blog/wp-content/uploads/2008/05/jexcelapi.pdf

Mira el apartado "Modificación de hoja de cálculo" para abrir un documento ya existente. Y para modificarlo mira el apartado "Creación de hoja de cálculo", en el cual aparece un ejemplo de utilización del método sheet.addCell().

Para más detalles, puedes consultar la API aquí: http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/jxl/write/WritableSheet.html

Si tienes alguna duda, coméntamelo.

Saludos.

Anónimo dijo...

Buenas Felipe:

Me da el siguiente error y no tengo Ubuntu, tengo WinXP professional, pero me da error de todas formas!

java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Exception in thread "main"

Sabes a que puede ser debido? lo metí dentro de un proyecto al azar que tengo y la versión de mi JDK es la 1.5.

Muchas gracias!

Anónimo dijo...

Hola, como podria usar este codigo pero mantiendo el archivo excel fuera de la carpeta del proyecto, por ejemplo: quisiera leer el archivo que se genera por una macro y se guarda en el escritorio, como podria indicar al programa la direccion del archivo excel que esta en el escritorio?

Felipe dijo...

Respondo a los dos últimos comentarios:

Penúltimo comentario: Ese error aparece cuando el código se ejecuta sobre un JDK que no es compatible con otro JDK desde el que se creó. Yo lo he ejecutado sin problemas desde Windows con la versión 1.6 de Java. Yo desinstalaría el JDK que tienes e instalaría otro más actual. Asegúrate de que no tienes ningún JDK por ahí perdido que te esté dando problemas.

Último comentario: Depende del sistema operativo en el que estés. Si estás en Windows tendrías que poner ésto en la línea correspondiente:
excel.leerArchivoExcel("C:\Documents and Settings\\Escritorio\archivoPrueba.xls");


Si estás en Ubuntu:
excel.leerArchivoExcel("/home//Escritorio/archivoPrueba.xls");


Si teneis cualquier duda más, podeis comentármelo.

Saludos.

Anónimo dijo...

Hola, gracias por tu respuesta, de verdad me ha sido de gran ayuda este codigo, soy quien hizo el comentario para indicar la direccion del archivo excel, ciertamente estoy con windows 7 y ya lo intente de esa manera que me indicas pues fue lo mas logico que se me ocurrio al momento, pero no lo leyo.. Alguna idea de cual pudiese ser el motivo?.

Gracias nuevamente!

Felipe dijo...

Hola.

Si estás en Windows 7 puedes probar así:

excel.leerArchivoExcel("C:\Users\nombre_de_usuario\Desktop\archivoPrueba.xls");

Sustituyendo nombre_de_usuario por tu nombre de usuario. Si la unidad en la que tienes carpeta personal no está en la unidad C, debes de poner la correspondiente.

Espero que te sirva.

Saludos.

Anónimo dijo...

Hola.
Fijate que quiero mandar cada dato de cada celda como parametro pero al momento de mandarlo a un metodo en el cual quiero irlos almacenando, no da lugar a hacerlo, al momento de correrlo no me los lee y no entra al try...
Help me plis.

Anónimo dijo...

Hola sabran como puedo saber el nombre de un rango de la hoja de excel con java??

Saludos

Felipe dijo...

Respondo a los dos últimos comentarios:

Penúltimo comentario:
Por favor, muéstrame un fragmento de tu código donde pueda ver qué método estás utilizando para almacenar los datos. También el código donde llamas al método leerArchivoExcel(String archivoDestino). ¿Has hecho un seguimiento de tu código para saber por qué no entra al try?.

Último comentario:
El método Workbook.getRangeNames() devuelve una lista de los nombres de Rangos de ese archivo excel. Creo que es lo que pides. Si no es así, puedes comentármelo.

Saludos a los dos.

veronica dijo...

gracias amigo en efecto es lo que necesitaba, sabrás como puedo evitar este error:
Error: jxl.read.biff.BiffException: Unable to recognize OLE stream
jxl.read.biff.BiffException: Unable to recognize OLE stream
at jxl.read.biff.CompoundFile.(CompoundFile.jav a:116)
at jxl.read.biff.File.(File.java:127)
at jxl.Workbook.getWorkbook(Workbook.java:268)
at jxl.Workbook.getWorkbook(Workbook.java:253)
at com.ramco.rvw.pl.ExcelImport.main(ExcelImport.java :24)

no se si me puedas ayudar por favor me urge.

Anónimo dijo...

BAztantee buenoooo!! graciazz :D

Felipe dijo...

Hola Verónica.

¿Qué versión tiene el archivo excel que quieres leer?. Parece ser que este error aparece con la versión 2007. Guarda tu archivo como "Libro de Excel 97-2003(*.xls)" e inténtalo de nuevo. Si sigues teniendo problemas, no dudes en comentármelo.

Anónimo, gracias a tí por comentar.

Saludos a los dos.

victor dijo...

Hola a todos, Excelente Blog.
Me ha servido de mucho la información que he encontrado aquí, pero tengo un error con las tildes y las eñes, al tratar de usar la siguiente linea:
WorkbookSettings wbSettings = new WorkbookSettings(new File(
archivoDestino));
Me sale un error diciendo que el constructor no existe.
Alguien me puede ayudar???
SO: Win7
JDK: 1.6 update 27
Netbeans 6.9.1
Versión JExcel: 2.6.12

Anónimo dijo...

Hola a todos.
La forma correcta de corregir el error de las tildes es usando el siguiente código:

WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setEncoding("ISO-8859-1");
wbSettings.setLocale(new Locale("es", "ES"));
wbSettings.setExcelDisplayLanguage("ES");
wbSettings.setExcelRegionalSettings("ES");
wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());

Workbook archivoExcel = Workbook.getWorkbook(new File("C:/rutaArchivo.xls"),wbSettings);

ATT: Victor

Felipe dijo...

Hola Víctor.

El problema de las tildes y las eñes se soluciona con el código que han puesto en el comentario anterior.

La siguiente línea es incorrecta y por eso te da ese error de compilación:
WorkbookSettings wbSettings = new WorkbookSettings(new File(archivoDestino))

Pido disculpas porque lo indiqué mal en un comentario anterior.

Saludos a los dos.

Guillermo Espinoza dijo...

Hola a todos,

No conoces una herramienta que lea Excel 2010?

Porque la extensión xlsx no me la permite utilizar. No puedo usar el POI de Apache porque mi servidor es GlassFish.

Saludos a todos

Felipe dijo...

Hola Guillermo.

Según he leido aquí https://groups.google.com/a/teamdev.com/group/jexcel-forum/browse_thread/thread/6cee1b1230f7dc74?pli=1 , JExcel da soporte a archivos excel 2010, aunque no lo he probado. Puedes explicarme más específicamente qué inconvenientes te surgen al utilizar JExcel y si el servidor GlassFish supone alguna limitación para ello. Intentaré ayudarte.

Saludos.

Anónimo dijo...

hola.

Que gran aporte, gracias por compartirlo. Tengo una duda, si trabajo tablas dinamicas, puedo pasar esta informacion tambien.

Felipe dijo...

Hola.

No sabría darte una respuesta 100% veraz porque no lo he intentado. Es una buena pregunta. No obstante, te animo a que lo intentes y lo compartas con todos nosotros. Si lo prefieres, puedes enviarme tu hoja excel por correo electrónico y así poder probarlo yo mismo.

Saludos.

Migueblog dijo...

Muchas gracias!
De mucha utilidad, ya me dieron ganas de travesear esa librería a ver que le encuentro.
Sigue adelante con tu blog, espero que continúes posteando acerca de java

Felipe dijo...

Hola Migue.

Gracias por tu comentario, seguro que seguiré escribiendo posts de Java.

Saludos.

EAPII dijo...

muy buenisimo el aporte aprendi muchi ,, gracias manes. :D
me funciono del modo :

WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setEncoding("ISO-8859-1");
wbSettings.setLocale(new Locale("es", "ES"));
wbSettings.setExcelDisplayLanguage("ES");
wbSettings.setExcelRegionalSettings("ES");
wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());

Workbook archivoExcel = Workbook.getWorkbook(new File("C:/rutaArchivo.xls"),wbSettings);

ATT: Victor

Jeison Nisperuza dijo...

Nunca había hecho interactuar java con excel, Muy Buen post

Anónimo dijo...

Hola Felipe, muchas gracias por este gran aporte, en mi caso me sale lo siguiente cuando lo ejecuto

at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(Unknown Source)
at jxl.Workbook.getWorkbook(Workbook.java:213)
at jxl.Workbook.getWorkbook(Workbook.java:198)
at ReadExcel.leerArchivoExcel(ReadExcel.java:11)
at ReadExcel.main(ReadExcel.java:49)

Anónimo dijo...

Ahora me sale lo siguiente:


Command format: Demo [-unicode] [-csv] [-hide] excelfile
Demo -xml [-format] excelfile
Demo -readwrite|-rw excelfile output
Demo -biffdump | -bd | -wa | -write | -formulas | -features | -escher | -escherdg excelfile
Demo -ps excelfile [property] [output]
Demo -version | -logtest | -h | -help

Anónimo dijo...

Me sale "OUT MEMORY" cuando trato de leer o escribir un archivo excel de mas de 100 filas, como puedo solucionar este problemita.

Felipe dijo...

Hola a todos.

Victor: me alegra de que te sirviera.

Jeison Nisperuza: muchas gracias.

Anónimo: Espero que hayas solucionado los errores que te aparecían en tus dos primeros comentarios (Si no es así, coméntamelo). Sobre el mensaje "OUT MEMORY", lo he buscado y la solución parece ser ésta:

WorkbookSettings wbSetting = new WorkbookSettings();
wbSetting.setUseTemporaryFileDuringWrite(true);
WritableWorkbook wbook = Workbook.createWorkbook(new File("XYZ.xls"wbSetting);

Lo que se hace es usar un archivo temporal durante la generación del wokbook. Si no se hace eso, toda la operación se realiza utilizando la memoria. Por eso te aparece ese error. Pruébalo y dinos si se te solucionó el problema.

Saludos.

juanntorres dijo...

buenos días, tengo win 7, uso net beans y probando el programa me sale el siguiente error: jxl.read.biff.BiffException: Unable to recognize OLE stream
at jxl.read.biff.CompoundFile.(CompoundFile.java:116)
at jxl.read.biff.File.(File.java:127)
at jxl.Workbook.getWorkbook(Workbook.java:221)
at leerexcelfile.LeerExcelFile.leerArchivoExcel(LeerExcelFile.java:27)
at leerexcelfile.LeerExcelFile.main(LeerExcelFile.java:60)

No se como arreglarlo y ya están las librerías registradas e incluidas en el proyecto.

Gracias

Felipe dijo...

Hola Juan.

¿Qué tipo de archivo excel estás intentando leer? ¿Los has guardado como Libro de Excel (*.xlsx) o como Libro de Excel 97-2003 (*.xls)?. Quizás sea ese el problema.

Saludos.

Gonzalo dijo...
Este comentario ha sido eliminado por el autor.
Gonzalo dijo...

Hola, necesito leer 2 ó mas archivos de excel a través de un programa en java, pero ademas necesito generar otro con el resultado del cruce de los anteriores a través de una key que se especifique... Soy nuevo en java, y te agradecería me pudieras orientar como poder hacerlo.

Felipe dijo...

Hola Gonzalo.

¿En qué consiste el cruce de los dos archivos? Pon algún ejemplo con datos reales para que pueda ayudarte.

Saludos.

Anónimo dijo...

Hola muy bueno el aporte pero me sale el error que no encuentra el archivo de excel pese a que lo tengo guardado en la mis carpeta donde esta el .java.

Agradezco su colaboración

Felipe dijo...

Hola.

Si con el código de este ejemplo no te encuentra el fichero excel, puedes intentar indicar la ruta de forma absoluta. Ejemplo:

excel.leerArchivoExcel("/home/usuario/archivoPrueba.xls");

ó

excel.leerArchivoExcel("C:\\archivoPrueba.xls");


Si tienes alguna duda, puedes preguntarme.

Saludos.

alfredo dijo...

hola
leer pero no me lee los decimales completos

Felipe dijo...

Hola Alfredo.

Indica cual es tu caso concreto, qué valores estás intentando leer. Dame más datos para que pueda ayudarte.

Saludos.

Nalder Francisco dijo...

hola estoy tabajando en u proyecto y me funciono super pero no me lee los archivos .xlsx y .xlsm

podir ayudarme con esto, es importante para mi

Nalder Francisco dijo...

cortesía de CODESA S.A.

ya me ayudaron a solucionarla
les dejo las pag de donde se saco la info que se uso para los que les interese.

http://javerosanonimos.blogspot.com/2011/12/leer-archivos-excel-xlsx.html

cuando intentan abrir un archivo xlsx o xlsm muy grande, genera un error de memoria insuficiente, para lo cual se usa una corrección en el código la encuentran aquí.

http://stackoverflow.com/questions/11145323/error-reading-excel-xlsx-with-apache-poi

Felipe dijo...

Hola Nalder Francisco.

Me alegro de que hayas encontrado la solución. Gracias por comentar la solución.

Saludos.

Elio Alvarado dijo...

una pregunta, funcionará tambien para mac?

comprar queso dijo...

Muy util, mil gracias.

Felipe dijo...

Hola

@Elio Alvarado
Creo que en Mac debe de funcionar igualmente, pero no lo he probado. Puedes hacer la prueba y nos lo cuentas.

@comprar queso
Muchas gracias!

Saludos a los dos.

Anónimo dijo...

Hola, agradezco el aporte que hiciste a sido de mucha ayuda para despejar un par de dudas que tenia, pero me sale el siguiente error: El sistema no puede encontrar el archivo especificado
Estoy trabajando en jcreator 4.50 Pro, y ya intenté casi de todo pero no logro arreglar esto, gracias por tu ayuda

Anónimo dijo...

Respecto a mi pregunta anterior, ya pude hacer que lo reconozca. Guardé el archivo .xls en la carpeta en donde me genera las clases el jcreator, espero le sirva a alguien este dato.

Felipe dijo...

Hola.

Me alegro de que solucionaras tu problema y se agradece que aportes la solución.

Saludos.

Trapos y Harapos dijo...

Hola, aparte de crear archivos excel, se puede buscar uno ya creado? como sería?

MUY INTERESANTE el poder interactuar entre java y excel

Felipe dijo...

Hola.

¿A qué te refieres a buscar uno ya creado?. Pon un ejemplo para que pueda entender tu caso y pueda ayudarte. La librería JExcel permite leer, escribir y modificar hojas excel. Si quieres realizar búsquedas, quizás haya que utilizar otras herramientas.

Me alegro de que te haya resultado interesante.

Saludos.

Anónimo dijo...

Excelente

Noa dijo...

Gracias, aprendiendo cosas nuevas. :)

Noa dijo...
Este comentario ha sido eliminado por el autor.
Felipe dijo...

Gracias a ambos por comentar.

Anónimo dijo...

Buenas! Importando las librerías y poniendo este código lee toda la información de un archivo excel o tengo que cambiar algo del código? Como le indico que archivo tiene que leer?
Gracias de antemano

Anónimo dijo...

Y también me gustaría saber si una vez leído el excel ya puedo trabajar con los datos de este sin ningún problema

Felipe dijo...

Hola.

Debes de indicar el archivo que quieres leer, en concreto la siguiente línea:

excel.leerArchivoExcel("archivoPrueba.xls");


Puedes poner la ruta absoluta del archivo así:


excel.leerArchivoExcel("/home/usuario/archivoPrueba.xls");

ó

excel.leerArchivoExcel("C:\\archivoPrueba.xls");


Esta librería también permite escribir / modificar los datos de un archivo excel. Puedes consultar la documentación para más información.

Saludos.

Anónimo dijo...

Buenas tardes, mi nombre es emiliano y como hago para que me lea el documento, mucho no entiendo perdon, lo corro como applet?? Muchas gracias por la amabilidad

Felipe dijo...

Hola Emiliano.

Dame algunos datos del tipo de proyecto con el que estás trabajando. ¿Es una aplicación de escritorio ó una página web?.

Saludos.

Anónimo dijo...

Hola Felipe, es para una aplicación de escritorio, sabes como hacer o donde indagar mejor?

Anónimo dijo...

Hola Felipe tengo una gran duda que se que ya has respondido pero no logro solucionar:
he copiado y pegado tu codigo y pongo en mi metodo main,, cuando invoco el metodo leerArchivoExce asi

excel.leerArchivoExcel("C:\\archivoPrueba.xls")

y me tira el error
java.io.FileNotFoundException: C:\archivoPrueba.xls (El sistema no puede encontrar el archivo especificado)
no se como solucionarlo
por favor si podes explicarme paso a paso como solucionar esto te lo agreadeciria

Anónimo dijo...

Hola felinfo
Gracias por tus aportes.
Me explico, estoy escribiendo en un archivo Excel que es una copia de otro pre-establecido, pero solo me escribe aproximadamente unas 50 celdas, cuando escribo código para la celda 51 me da un error, el cual no sé el porqué, pero si anulo alguna celda anterior, ahí si escribe la celda 51(que ahora pasa a ser la celda 50), lo que ademas demuestra que el código de la celda 51 está bien escrito.
La aplicación la estoy desarrollando para un celular android 2.2 con jxl y eclipse. ¿A qué se debe esto, como le doy solución?.
Me parece buen punto que cuando una persona encuentre una solución por sus propios medios, la publiquen y mal punto para los mezquinos

Gracias Felinfo

Ayudenme por ahora, que yo mas adelante tambien ayudaré.

Anónimo dijo...

Felipe

Soy el mismo del comentario anterior, es para ampliar en lo siguiente, los datos que van al archivo Excel primero se guardan en la base de datos y desde allí se recuperan para ser escritos en las hojas de Excel, sospecho que el error está por ese lado, al parecer falla en alguna nueva instanciación despues de extraer cierta cantidad de datos. Creo en lo anterior porque guardé los datos en una matriz y no hubo problemas al escribir en las hojas de Excel los datos de dicha matriz, la desventaja de las matrices es que solo tienen vida mientras el programa se está ejecutando. ¿Conoces alguna manera de guardar matrices en una BD SQLite u otra forma para ser recuperada después?

Gracias.

Felipe Martínez D. dijo...

Hola a todos.

Voy a responder a los últimos comentarios:

- Error java.io.FileNotFoundException: C:\archivoPrueba.xls (El sistema no puede encontrar el archivo especificado):
-> Debes de comprobar que el archivo archivoPrueba.xls está en C. Se trata del archivo que queremos leer.

- "... solo me escribe aproximadamente unas 50 celdas, ...":
-> Debe de tratarse de alguna limitación o bug de la librería. Quizás en el éste foro https://groups.google.com/a/teamdev.com/forum/?fromgroups#!forum/jexcel-forum puedas encontrar o plantear tu duda.

- ¿Conoces alguna manera de guardar matrices en una BD SQLite u otra forma para ser recuperada después?:
-> No he trabajado con SQLite, lo siento. Si quieres puedes darme más datos acerca del tipo de datos que quieres guardar e intentaré ayudarte.


Saludos a todos.

Anónimo dijo...

Hola!!! muchas gracias por colocar tu código...

Felipe Martínez D. dijo...

Gracias a tí por comentar.

Saludos.

Anónimo dijo...

Hola, soy nuevo programando en java y no sé muy bien dónde se guardará la información leída por este código o si esto es sólo una clase para un código mayor.

El caso es que creé la clase, la ejecuté y me dice en el console de Eclipse:
Command format: Demo [-unicode] [-csv] [-hide] excelfile
Demo -xml [-format] excelfile
Demo -readwrite|-rw excelfile output
Demo -biffdump | -bd | -wa | -write | -formulas | -features | -escher | -escherdg excelfile
Demo -ps excelfile [property] [output]
Demo -version | -logtest | -h | -help

antes me dice algo de algún error o algo y le doy a proceed y sale eso... si alguien supiera explicarme...

Gracias

Antonio

Anónimo dijo...

Felinfo Te Saludo:

Encontré lo siguiente, al parecer no se pueden guardar directamente vectores y/o matrices en SQLite de Android, pero se puede simular, se guardan los datos en forma de texto separados con (,;:.) según nos convenga; recuperamos la variable de texto de la BD y con la función .split(";") por ejemplo, se convierte el texto guardado en un vector cuyos elementos están separados por (;) en este caso, convenientemente con dos funciones for le podemos dar el trato de matriz. Lo anterior es a grosso modo.

Otra cuestión Felinfo, Yo ya logro insertar una imagen mediante código a un archivo Excel, lo que no sé es, y que necesito de verdad es girar esa imagen mediante código (introduciendo el valor del ángulo de rotación), no he encontrado nada de esto en la WEB, ¿Pero es esto posible?
es que tengo el inconveniente de que tengo que abrir el archivo Excel cada vez que necesito rotar la imagen antes de imprimir y sería excelente automatizar esta parte también

Felipe Martínez D. dijo...

Hola.

Antonio: En este ejemplo la información no se guarda. Simplemente leemos un fichero excel y mostramos su contenido en pantalla. Si quieres guardar esa información en una base de datos o un archivo, habría que incluir más código. Debes comprobar que en Console de Eclipse te imprime el contenido del Excel.

Anónimo: Desconozco si es posible rotar la imagen en Excel. Si quieres, indícame el código que estás utilizando para insertar la imagen e intentaré ayudarte.

Saludos.

Jose Mario Barrios Flores dijo...

Hola , a mi me salen este error al momento de ejecutar:

Exception in thread "main" jxl.read.biff.BiffException: Unable to recognize OLE stream
at jxl.read.biff.CompoundFile.(CompoundFile.java:116)
at jxl.read.biff.File.(File.java:127)
at jxl.Workbook.getWorkbook(Workbook.java:221)
at excel.main(excel.java:26)

Jose Mario Barrios Flores dijo...

y este es mi codigo:

import java.io.File;
import java.io.IOException;
import java.util.Locale;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.biff.CountryCode;
import jxl.read.biff.BiffException;
/**
* @author JocLuis
*/
public class excel {
public static void main(String[] args) throws IOException, BiffException {
//ruta de la hoja del calculo

//
WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setEncoding("ISO-8859-1");
wbSettings.setLocale(new Locale("es", "ES"));
wbSettings.setExcelDisplayLanguage("ES");
wbSettings.setExcelRegionalSettings("ES");
wbSettings.setCharacterSet(CountryCode.SPAIN.getValue());

Workbook workbook = Workbook.getWorkbook(new File("C:/arc.xls"),wbSettings);

Sheet sheet = workbook.getSheet(0);//Elegimos la primera hoja
Cell celdaCurso = null;//inicializo el objeto que leerá el valor de la celda
String valorCeldaCurso=null;
celdaCurso= sheet.getCell(7,1);//celda de la columna 7 y fila 1
valorCeldaCurso= celdaCurso.getContents();//obteniendo valor
System.out.println(valorCeldaCurso);
workbook.close();
}
}

Felipe Martínez D. dijo...

Hola José Mario.

Probablemente sea un problema de versiones del archivo excel que quieres leer. Intenta guardar el archivo como "Excel 97-2003 workbook".

Si esto no funciona, coméntamelo y buscamos otra posible solución.

Saludos.

Anónimo dijo...

Hola Felipe, felicitaciones por el código y compartirlo con nosotros.
Bueno, yo estoy en un nivel bastante básico de java, y estoy trabajando en netbeans...
Me podrías decir cómo es que coloco el archivo excel en la misma carpeta que el archivo java con el nombre "archivoPrueba.xls".
Todo lo demás si lo he entendido, sólo ese pequeño detalle.
Saludos.

Felipe Martínez D. dijo...

Hola.

Ultimamente no estoy trabajando con Netbeans pero te diré cómo creo que puedes hacerlo. Para saber el directorio donde está el archivo Java debes de pulsar con el botón derecho sobre el archivo Java y debe de aparecerte una opción "Propiedades" y ahí te aparecerá. Una vez que sepas la ruta, debes de copiar el archivo xls en ese mismo directorio.

Si te surgen más dudas, dímelo.

Saludos.

Elizabeth Meza dijo...

Hola donde exactamente se pone el archivo .xls
porque me marca este error
java.io.FileNotFoundException: archivoPrueba.xls (El sistema no puede encontrar el archivo especificado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:138)
at jxl.Workbook.getWorkbook(Workbook.java:213)
at jxl.Workbook.getWorkbook(Workbook.java:198)
at mapping.ExcelBD.leerArchivoExcel(ExcelBD.java:15)
at mapping.ExcelBD.main(ExcelBD.java:46)
BUILD SUCCESSFUL (total time: 0 seconds)

te agraceria tu ayuda

Elizabeth Meza dijo...

Ya lo puse en esa carpeta pero me sigue marcando lo mismo que otra cosa puede ser?

Felipe Martínez D. dijo...

Hola Elizabeth.

Si vas a utilizar el código de este artículo sin modificar nada, debes poner el archivo de prueba en el mismo directorio en el que tienes el archivo Java. Si necesitas saber su ruta, pincha con el botón derecho sobre el archivo Java, luego pulsa en Propiedades, y en Path te aparecerá.

Si necesitas algo más, dímelo.

Saludos.

Anónimo dijo...

Hola Felipe, soy nuevo en esto de programar y es primera vez que tengo que trabajar con uun archivo excel y este post es lo mas contundente que he pillado, te cuento trabajo en netbeans si yo ingresara un rut en un txt como podria ver si existe en el excel y en caso de existir puediera tomar el resto de los datos de ese rut y llenar el resto de los txt correspondiente a los datos de ese rut? te agradeceria muxo si me puedes ayudar

Luis De Leon dijo...

oye, y para hacer que lea filas y columnas especificas???

Anónimo dijo...

Muy útil, justo lo que buscaba. Mil gracias...

Felipe Martínez D. dijo...

Hola.

@Anónimo: Perdona, no he entendido bien la pregunta. ¿A qué te refieres con rut? ¿Qué es lo que contiene ese txt?.

@Luis De Leon:  En vez de recorrer todas las columnas de cada fila, indicaríamos la celda en concreto. Por ejemplo, si queremos leer la fila 3, columna 4, sería así:


data = hoja.getCell(4, 3).getContents(); //data = hoja.getCell(columna, fila).getContents();
System.out.print(data);


@Anónimo: Gracias a tí por comentar.


Saludos a todos.

Felipe Martínez D. dijo...

Hola.

@Anónimo: Perdona, no he entendido bien la pregunta. ¿A qué te refieres con rut? ¿Qué es lo que contiene ese txt?.

@Luis De Leon:  En vez de recorrer todas las columnas de cada fila, indicaríamos la celda en concreto. Por ejemplo, si queremos leer la fila 3, columna 4, sería así:


data = hoja.getCell(4, 3).getContents(); //data = hoja.getCell(columna, fila).getContents();
System.out.print(data);


@Anónimo: Gracias a tí por comentar.


Saludos a todos.

sixto antonio contreras florian dijo...

Buenos días
Una pregunta sobre un problema que se me esta presentando al momento de hacer un reporte de excel aplicando en una columna una formula que necesito el codigo que tengo es el siguiente:

String Rango1 = " \"2% ~ 5%\" ";
String FormulaRango = "=SI(MAX(E" + NumRowDetalle + ":G" + NumRowDetalle + ")<5;"+ Rango1 +"; SI(MAX(E" + NumRowDetalle + ":G" + NumRowDetalle + ")<10; \"5% ~ 10%\"; SI(MAX(E" + NumRowDetalle + ":G" + NumRowDetalle + ")<20; \"10% ~ 20%\"; SI(MAX(E" + NumRowDetalle + ":G" + NumRowDetalle + ")<50; \"20% ~ 50%\";\"> 50%\"))))";

Formula sFormula = new Formula(7, (NumRowDetalle - 1), FormulaRango);
sheet.addCell(sFormula);

el codigo se ejecuta sin ningun problema pero al momento de ver el archivo sale un error como =#NA

entonces quisiera saber si alguien de ustedes a usado funciones SI aplicandolos con la libreria jxl de java.

muchas gracias,


Felipe Martínez D. dijo...

Hola Sixto Antonio.

Lo siento, pero no he trabajado con funciones mediante esta librería. Lo único que te puedo decir es que pruebes primero la función en Excel, para ver si está construida correctamente. Una vez que estés seguro de que es correcta, pásala a tu aplicación Java.

Saludos.

Anónimo dijo...

Hola Felipe: Tienes algún ejemplo de código que recorra un directorio en la máquina del cliente y lea todos los archivos de Excel que estén colocados ahí?

Felipe Martínez D. dijo...

Hola.

No tengo ningún ejemplo que haga lo que pides. Pero lo que puedes hacer es obtener el nombre de los archivos Excel del directorio así:

http://stackoverflow.com/questions/5694385/getting-the-filenames-of-all-files-in-a-folder

Y una vez que tengas los nombres de los archivos, puedes aplicar lo que explico en éste artículo. Puedes preguntarme si tienes dudas.

Espero haberte ayudado.

Saludos.

seguridad informatica dijo...

BUENOS NOCHES MUCHAS GRACIAS POR EL POS

tengo una consulta; tengo una informacion en una hoja de excel la que tengo que hacer es leerla despues acuerdo a la informacion leida generar un reporte en PDF de siertas filas; como me puedes ayudar, gracias

Felipe Martínez D. dijo...

Hola.

Lo que quieres hacer se podría dividir en dos:

La parte de lectura del Excel, se puede hacer como indico en este post.

Para la parte de generacón del PDF puedes utilizar el paquete iText JAR, tal y como indico aquí: http://felinfo.blogspot.com.es/2009/07/generar-un-pdf-en-java-usando-itext-jar.html

Si tienes alguna duda, puedes preguntarme.

Saludos.

Anónimo dijo...

Muy completo muchas gracias por el aporte.

Felipe Martínez D. dijo...

Gracias a tí por comentar.

Saludos.

Alejandro Ballesteros dijo...

Hola Felipe tengo problemas con
WorkbookSettings archivoExcel = new WorkbookSettings(new File(archivoDestino));

Estoy en NetBeans 6.9.1 no se si importe mal las librerias que podrias ayudarme saludos.

Felipe Martínez D. dijo...

Hola Alejandro.

Debes indicarme qué error te aparece e intentaré ayudarte.

Saludos.

Diego andres de la cruz dijo...

Muchas gracias, justo lo que necesito.

Felipe Martínez D. dijo...

Hola Diego Andrés. Gracias a tí por comentar.

Anónimo dijo...

Me sirvió mucho el codigo para si¡olucionar el encoding utf-8 con los codigos:

WorkbookSettings wbs = new WorkbookSettings();
wbs.setEncoding("ISO-8859-1");
wbs.setLocale(new Locale("es", "ES"));
wbs.setExcelDisplayLanguage("ES");
wbs.setExcelRegionalSettings("ES");
wbs.setCharacterSet(CountryCode.SPAIN.getValue());
Workbook wb = Workbook.getWorkbook(new File(destFile),wbs);


Gracias. buen aporte.

Felipe Martínez D. dijo...

Gracias por tu comentario y aportación.

Saludos.

Abraham Fernandez dijo...

Excelente codigo Felipe, funciona 100%, pero queria preguntarte si estos datos obtenidos pueden colocarse dentro de un JTable?

Felipe Martínez D. dijo...

Hola Abraham.

Sí, pueden colocarse dentro de un JTable. En este ejemplo se recorren todas las celdas y se obtiene el valor de cada una en la línea siguiente:

data = hoja.getCell(columna, fila).getContents();

Puedes insertar ese valor en un jtable o en cualquier otra estructura de datos.

Saludos.

Anónimo dijo...

Hola. Me sirvio bastante. Muchas Gracias.
Y ahora, cómo le hago para escribir en el archivo en una celda en específico??

Publicar un comentario en la entrada

Felinfo: Java, Linux, Virtualización. Open Source.  ©Template Blogger Green by Dicas Blogger .

TOPO