Autor Tema: Leer ficheros Excel desde Java  (Leído 700 veces)

drate

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Leer ficheros Excel desde Java
« en: 29 de Abril 2024, 20:51 »
Buenas tardes,
Necesito acceder y manipular un atributo de un fichero Excel desde Java. Podéis echarme una mano?
Muchas gracias.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Leer ficheros Excel desde Java
« Respuesta #1 en: 01 de Mayo 2024, 12:40 »
Hola.
La API de Java no incluye librerías para acceder a tipos de datos de Microsoft, así que hay que usar librerías de terceros.

Para esto, la más conocida(al menos la que yo conozco) es Apache Poi.
Desde su web puedes obtener la última versión, documentación sobre su API, etc....

Sin embargo, para usar su última versión hay que construir la librería usando Gradle y es más complicado y hasta yo me pierdo con eso.

Tengo unos archivos .jar de esta librería listos para ser usados. Son una versión antigua, pero bueno, sirven igualmente.
Se pueden descargar desde este enlace Drive

Para usarlos en tu proyecto Java, lo que tienes que hacer es copiarlos a una carpeta dentro de tu proyecto. Puedes llamar a esa carpeta como quieras, lo habitual es llamarla "lib", para indicar que ahí contenemos unas librerías.
Luego, para que tu proyecto pueda usarlas, tienes que "construir una ruta"(build path) hacia ellas.

La forma de hacer esto puede variar según el IDE que estés usando. Por ejemplo en Eclipse, el que yo uso, la opción es "Build Path" > "Add External Archives"



Y entonces se abre un explorador de archivos donde seleccionar los .jar de Apache Poi.

Una vez hecho esto, ya podemos hacer import de las clases que necesitemos para interactuar con el Excel.

Un archivo Excel es bastante complejo, a parte de que los hay de distintos tipos(si son Excel antiguos de antes de mediados del año 2000 hay que usar la clase HSSF, si no hay que usar XSSF para los posteriores más actuales), un archivo Excel es como un libro que se compone de una o más hojas.
Y cada hoja se compone de filas.
Y cada fila se compone de celdas.

Así que para trabajar con el Excel, hay que crear objetos que representen cada uno de esos elementos.

Dejo un ejemplo muy sencillo para leer un Excel y volcar los datos en pantalla.

Fíjate que la lógica es muy simple.
Creamos un libro a partir del fichero y de este libro obtenemos un "iterador" para recorrer las hojas que pueda tener.
Por cada hoja, obtenemos otro "iterador" para recorrer las filas que pueda tener.
Y por cada fila, otro "iterador" para recorrer las celdas.

Cada "iterador" lo recorremos mediante un bucle while, así que tenemos tres bucles anidados.

Código: [Seleccionar]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class LectorExcel {

public static void main(String[] args) {

File fichero = new File("e:/clientes.xlsx");
try {
//Leemos los bytes del fichero Excel y creamos un "libro de trabajo"
FileInputStream datosExcel = new FileInputStream(fichero);
XSSFWorkbook libroDeTrabajo = new XSSFWorkbook(datosExcel);

/*
* El "libro de trabajo" Excel está compuesto
* de una o más hojas(sheets).
* Creamos un Iterador para recorrerlas
*/
Iterator<Sheet> hojasLibro = libroDeTrabajo.sheetIterator();
while(hojasLibro.hasNext()) {
XSSFSheet hojaExcel = (XSSFSheet) hojasLibro.next();
System.out.println("\n\n\t\tNUEVA HOJA EXCEL. FILAS: " + hojaExcel.getPhysicalNumberOfRows());
System.out.println("\t\t----- ---- ------ ----------\n");
/*
* Cada hoja se compone de filas y cada fila se compone de celdas
* Habrá que iterar cada fila, y por cada fila iterar sus celdas
*/
Iterator<Row> filasExcel = hojaExcel.iterator();
while(filasExcel.hasNext()) {
Row fila = filasExcel.next();
//Tenemos una fila, vamos a por sus celdas
Iterator<Cell> celdasExcel = fila.cellIterator();
while(celdasExcel.hasNext()) {
Cell celda = celdasExcel.next();
/*
* Vamos a mostrar los datos de cada celda de esta fila.
* Pero antes de mostrar, tenemos que preguntar de qué tipo
* de dato se trata, pues puede ser numérico, cadena, fórmula, boolean...
* Y cada tipo de dato exige un método distinto para ser mostrado.
*
* En este ejemplo solo tendremos numéricos y cadenas.
*/
switch(celda.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(celda.getStringCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(celda.getNumericCellValue() + "\t\t");
break;
}
}
System.out.println();//Final de esta fila
}
}
libroDeTrabajo.close();
System.out.println("\n\n\t\tFIN DE PROGRAMA");

} catch (FileNotFoundException e) {
System.err.println("Fichero Excel no encontrado");
} catch (IOException e) {
System.err.println("Error al acceder archivo Excel");
}
}
}


Esto es solo un ejemplo básico. La librería Apache Poi es muy extensa y permite hacer muchas cosas.
Ahora que ya sabes lo que necesitas, sigue buscando tú mismo más ejemplos de uso para leer y modificar datos, y que sean más actualizados que el que yo he puesto.

Por ejemplo, el método que uso en el switch para comprobar el tipo de dato que contiene la celda, está obsoleto. Funciona, pero tiene que haber otro método o manera de hacerlo más actualizada.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".