Implementación de EasyExcel para manejo de archivos Excel en Java

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

Etiquetas: EasyExcel java Spring Boot procesamiento de Excel lectura y escritura de archivos

Publicado el 6-3 18:01