Introducción
El manejo de archivos Excel es una tarea común en muchos proyectos de software, especialmente para la gestión de datos estructurados. En Java, la biblioteca Apache POI proporciona una poderosa API para leer, escribir y modificar documentos de Excel (tanto en formato .xls
como .xlsx
). Este artículo explicará cómo trabajar con documentos Excel en Java utilizando Apache POI, con un ejemplo práctico que incluye la búsqueda de datos y la creación de nuevas hojas.
Configuración del proyecto para usar Apache POI
Para trabajar con Apache POI, primero debemos agregar las dependencias correspondientes en nuestro proyecto. Si estás utilizando Maven, agrega las siguientes dependencias a tu archivo pom.xml
:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
Estas dependencias incluyen las clases necesarias para manipular archivos de Excel tanto en formato .xls
como .xlsx
.
Ejemplo práctico: Búsqueda de datos en un archivo Excel
A continuación, vamos a crear un ejemplo donde abrimos un archivo de Excel, buscamos información basada en criterios específicos, y creamos una nueva hoja con los resultados de la búsqueda.
Código de ejemplo
package excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class EjercicioExcel {
private final static String FILE_PATH = "vehiculosElectricos.xlsx";
private static Workbook wb;
// Método para buscar por marca
private static void buscarMarca(String marca) {
Sheet hoja = wb.getSheetAt(0); // Tomamos la primera hoja del documento
int numFila = 1; // Empezamos desde la segunda fila (índice 1)
Row fila = hoja.getRow(numFila);
// Muestro las ubicaciones de los puntos de carga de la marca especificada
System.out.println("PUNTOS DE RECARGA DE " + marca + " EN CASTILLA Y LEÓN");
while (fila != null) {
Cell celdaBusqueda = fila.getCell(2); // La marca se encuentra en la tercera columna
if (celdaBusqueda != null && celdaBusqueda.getStringCellValue().contains(marca)) {
System.out.println("----> " + fila.getCell(0).getStringCellValue() + " - " +
fila.getCell(1).getStringCellValue());
}
fila = hoja.getRow(++numFila);
}
}
// Método para buscar por ciudad y crear una nueva hoja en el Excel
private static void buscarCiudad(String ciudad) {
Sheet hoja = wb.getSheetAt(0); // Tomamos la primera hoja del documento
Sheet nuevaHoja = wb.createSheet(ciudad); // Creamos una nueva hoja con el nombre de la ciudad
int numFila = 1, newNumFila = 0; // Empezamos desde la segunda fila
Row fila = hoja.getRow(numFila);
// Muestro y almaceno las ubicaciones de los puntos de carga en la ciudad
System.out.println("\nPUNTOS DE RECARGA EN " + ciudad);
while (fila != null) {
Cell celdaBusqueda = fila.getCell(1); // La ciudad está en la segunda columna
if (celdaBusqueda != null && celdaBusqueda.getStringCellValue().contains("(" + ciudad + ")")) {
System.out.println("----> " + fila.getCell(0).getStringCellValue() + " - " +
fila.getCell(1).getStringCellValue());
// Copiamos la fila a la nueva hoja
Row newFila = nuevaHoja.createRow(newNumFila++);
newFila.createCell(0).setCellValue(fila.getCell(0).getStringCellValue());
newFila.createCell(1).setCellValue(fila.getCell(1).getStringCellValue());
}
fila = hoja.getRow(++numFila);
}
try {
// Guardamos los cambios en el archivo de Excel
wb.write(new FileOutputStream(new File(FILE_PATH)));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// Abrimos el archivo Excel
wb = new XSSFWorkbook(new FileInputStream(new File(FILE_PATH)));
// Llamamos a los métodos para buscar por marca y ciudad
buscarMarca("IBERDROLA");
buscarCiudad("ZAMORA");
// Cerramos el archivo
wb.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Explicación del código:
- Apertura del archivo Excel:
Se utilizaXSSFWorkbook
para trabajar con archivos.xlsx
. El archivo es cargado en memoria a través deFileInputStream
. - Método
buscarMarca(String marca)
:
Este método busca los puntos de recarga asociados a una marca específica dentro de la primera hoja del archivo Excel. Recorre las filas de la hoja, busca coincidencias con la marca en la tercera columna y muestra los resultados. - Método
buscarCiudad(String ciudad)
:
Este método busca los puntos de recarga en una ciudad determinada y crea una nueva hoja en el archivo Excel con el nombre de la ciudad. Además, copia las filas correspondientes a esa ciudad en la nueva hoja. - Escritura en el archivo Excel:
Después de agregar la nueva hoja con los resultados de la búsqueda por ciudad, los cambios se guardan en el archivo original utilizandoFileOutputStream
. - Cierre del archivo:
Es importante cerrar el archivo después de terminar la manipulación para liberar los recursos.
Conclusión
Apache POI es una excelente herramienta para trabajar con documentos Excel en Java. En este artículo, vimos cómo abrir un archivo Excel, buscar información por criterios específicos, y cómo modificar el archivo agregando nuevas hojas. La biblioteca es muy flexible y ofrece muchas funcionalidades para trabajar con hojas de cálculo, desde operaciones simples hasta manipulación avanzada de datos. Con este ejemplo práctico, puedes empezar a aplicar Apache POI en tus proyectos para gestionar documentos Excel de manera eficiente.