Para integrar EasyExcel en un proyecto Maven, se añade la siguiente dependencia en el archivo pom.xml:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
Operaciones de lectura desde archivos Excel
EasyExcel permite leer datos de archivos Excel de manera eficiente. Un enfoque básico implica crear un constructor de lector y configurar los parámetros necesarios:
// Inicializar el constructor para lectura
ExcelReaderBuilder constructorLector = EasyExcel.read();
// Establecer la ruta del archivo Excel
constructorLector.file("C:\\ruta\\archivo\\datos.xlsx");
// Seleccionar la hoja específica, si no se define se leen todas
constructorLector.sheet("hoja_datos");
// Activar el cierre automático del flujo de entrada
constructorLector.autoCloseStream(true);
// Definir el formato del archivo Excel
constructorLector.excelType(ExcelTypeEnum.XLSX);
// Registrar un listener para procesar cada fila leída
constructorLector.registerReadListener(new AnalysisEventListener<Object>() {
@Override
public void invoke(Object filaActual, AnalysisContext contexto) {
// Lógica al recibir una fila completa
System.out.println("Fila procesada: " + filaActual);
}
@Override
public void doAfterAllAnalysed(AnalysisContext contexto) {
// Confirmar la finalización de la lectura
System.out.println("Todas las filas han sido leídas");
}
});
// Construir el lector y ejecutar la lectura
ExcelReader lectorExcel = constructorLector.build();
lectorExcel.readAll();
lectorExcel.finish();
Para manejar datos genéricos, se puede utilizar un Map como tipo de dato. Esto permite acceder a celdas por índice:
List<Map<Integer, String>> registros = new ArrayList<>();
EasyExcel.read("C:\\ruta\\archivo\\datos.xlsx")
.sheet("hoja_datos")
.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
@Override
public void invoke(Map<Integer, String> mapaFila, AnalysisContext contexto) {
// Almacenar cada fila en la lista
registros.add(mapaFila);
}
@Override
public void doAfterAllAnalysed(AnalysisContext contexto) {
System.out.println("Lectura completada");
}
}).doRead();
// Iterar sobre los registros recolectados
for (Map<Integer, String> fila : registros) {
for (Map.Entry<Integer, String> entrada : fila.entrySet()) {
System.out.print("Columna " + entrada.getKey() + ": " + entrada.getValue() + "; ");
}
System.out.println();
}
Una simplificación común es enunciar la lectura en una sola cadena de métodos, optimizando el código:
List<Map<Integer, String>> datosLeidos = new LinkedList<>();
EasyExcel.read("C:\\ruta\\archivo\\datos.xlsx")
.sheet("hoja_datos")
.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
@Override
public void invoke(Map<Integer, String> mapa, AnalysisContext ctx) {
datosLeidos.add(mapa);
}
@Override
public void doAfterAllAnalysed(AnalysisContext ctx) {
System.out.println("Proceso de lectura finalizado");
}
}).doRead();
// Mostrar los datos recuperados
for (Map<Integer, String> item : datosLeidos) {
String salida = item.entrySet().stream()
.map(e -> e.getKey() + ":" + e.getValue())
.collect(Collectors.joining(", "));
System.out.println(salida);
}
Para mapear datos a objetos personalizados, se definen clases con anotaciones que corresponden a las columnas del Excel:
// Ejemplo de clase de entidad con anotaciones para mapeo
public class Usuario {
@ExcelProperty("identificador")
private Long id;
@ExcelProperty("nombre_usuario")
private String nombreUsuario;
// Getters y setters omitidos por brevedad
}
// Lectura directa hacia la clase Usuario
List<Usuario> listaUsuarios = new ArrayList<>();
EasyExcel.read("C:\\ruta\\archivo\\datos.xlsx")
.head(Usuario.class)
.sheet("hoja_datos")
.registerReadListener(new AnalysisEventListener<Usuario>() {
@Override
public void invoke(Usuario usuario, AnalysisContext ctx) {
listaUsuarios.add(usuario);
}
@Override
public void doAfterAllAnalysed(AnalysisContext ctx) {
System.out.println("Mapeo a objetos completado");
}
}).doRead();
// Visualizar los objetos resultantes
listaUsuarios.forEach(u -> System.out.println(u.getId() + ": " + u.getNombreUsuario()));
Escritura de datos en archivos Excel
La escritura con EasyExcel sigue un patrón similar. Primero se preparan los datos, luego se configuran los parámetros de escritura:
// Supongamos que tenemos una lista de objetos Usuario ya poblada
List<Usuario> usuariosParaEscribir = new ArrayList<>();
// Agregar datos de ejemplo
usuariosParaEscribir.add(new Usuario(1L, "ejemplo1"));
usuariosParaEscribir.add(new Usuario(2L, "ejemplo2"));
// Escribir en un archivo Excel
EasyExcel.write("C:\\ruta\\archivo\\salida.xlsx")
.head(Usuario.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet("datos_exportados")
.doWrite(usuariosParaEscribir);
System.out.println("Archivo Excel generado exitosamente");
Integración con Spring Boot para exportación desde base de datos
En aplicaciones Spring Boot, se puede combinar EasyExcel con servicios de persistencia para exportar datos. Por ejemplo, usando MyBatis-Plus para obtener datos y luego escribirlos en Excel:
@RestController
@RequestMapping("/api")
public class ControladorExportacion {
@Autowired
private ServicioUsuario servicioUsuario;
@GetMapping("/exportar/usuarios")
public ResponseEntity<String> exportarUsuarios() {
// Obtener datos desde el servicio
List<Usuario> listaCompleta = servicioUsuario.listarTodos();
// Definir ruta de salida
String rutaArchivo = "C:\\exports\\usuarios_exportados.xlsx";
// Configurar y ejecutar la escritura
EasyExcel.write(rutaArchivo, Usuario.class)
.sheet("Usuarios")
.doWrite(listaCompleta);
return ResponseEntity.ok("Exportación completada: " + rutaArchivo);
}
}