Exportación de Datos a Excel con Apache POI en Java

La exportación de archivos Excel usando Apache POI puede implementarse con o sin plantillas. Las plantillas facilitan la configuración de estilos en encabezados, mientras que la creación directa requiere definir todo el contenido manualmente.

Agregar dependencia de POI

Incluya la siguiente dependencia en su proyecto Maven para incluir la biblioteca Apache POI:


<dependency>
    <groupid>org.apache.poi</groupid>
    <artifactid>poi</artifactid>
    <version>4.1.2</version>
</dependency>

Exportación con plantilla Excel

Este método utiliza un archivo Excel predefinido como plantilla para insertar datos. A continuación, se muestra un ejemplo que genera un archivo de salida local:


import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ExportadorConPlantilla {
    public static void main(String[] args) throws IOException {
        generarArchivoConPlantilla();
    }

    static void generarArchivoConPlantilla() throws IOException {
        List<persona> datosPersonas = new Persona().obtenerDatos();
        InputStream recurso = ExportadorConPlantilla.class.getClassLoader().getResourceAsStream("plantilla.xlsx");
        XSSFWorkbook libro = new XSSFWorkbook(recurso);
        Sheet hoja = libro.getSheetAt(0);
        int contadorFilas = 2;
        for (Persona elemento : datosPersonas) {
            Row fila = hoja.createRow(contadorFilas);
            fila.createCell(0).setCellValue(elemento.getNombreCompleto());
            fila.createCell(1).setCellValue(elemento.getGenero().toString());
            fila.createCell(2).setCellValue(elemento.getEdadActual());
            contadorFilas++;
        }
        OutputStream salida = new FileOutputStream("resultado_con_plantilla.xlsx");
        libro.write(salida);
        salida.flush();
        salida.close();
    }

    static class Persona {
        private String nombreCompleto;
        private Integer edadActual;
        private Character genero;

        public Persona() {}

        public Persona(String nombre, Character genero, Integer edad) {
            this.nombreCompleto = nombre;
            this.genero = genero;
            this.edadActual = edad;
        }

        List<persona> obtenerDatos() {
            List<persona> coleccion = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                coleccion.add(new Persona("Usuario" + i, 'M', 25));
            }
            return coleccion;
        }

        public String getNombreCompleto() { return nombreCompleto; }
        public Integer getEdadActual() { return edadActual; }
        public Character getGenero() { return genero; }
    }
}
</persona></persona></persona>

Para integrar con una aplicación web, el flujo de salida puede redirigirse al objeto HttpServletResponse.

Exportación sin plantilla

En este enfoque, se crea un libro Excel desde cero y se define el contenido dinámicamente:


import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ExportadorDirecto {
    public static void main(String[] args) throws IOException {
        crearArchivoDirecto();
    }

    static void crearArchivoDirecto() throws IOException {
        List<elemento> elementos = new Elemento().listarElementos();
        XSSFWorkbook libro = new XSSFWorkbook();
        Sheet hoja = libro.createSheet("DatosExportados");

        int filaActual = 0;
        for (Elemento item : elementos) {
            Row fila = hoja.createRow(filaActual);
            fila.createCell(0).setCellValue(item.getDescripcion());
            fila.createCell(1).setCellValue(item.getCantidad());
            fila.createCell(2).setCellValue(item.getEstado());
            filaActual++;
        }
        OutputStream flujo = new FileOutputStream("resultado_directo.xlsx");
        libro.write(flujo);
        flujo.flush();
        flujo.close();
    }

    static class Elemento {
        private String descripcion;
        private Integer cantidad;
        private String estado;

        public Elemento() {}

        public Elemento(String descripcion, Integer cantidad, String estado) {
            this.descripcion = descripcion;
            this.cantidad = cantidad;
            this.estado = estado;
        }

        List<elemento> listarElementos() {
            List<elemento> lista = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                lista.add(new Elemento("Producto" + i, i * 10, "Activo"));
            }
            return lista;
        }

        public String getDescripcion() { return descripcion; }
        public Integer getCantidad() { return cantidad; }
        public String getEstado() { return estado; }
    }
}
</elemento></elemento></elemento>

Evaluación de fórmulas en plantillas

Si la plantilla contiene fórmulas, es necesario evaluarlas después de insertar los datos para actualizar los cálculos:


// Evaluar todas las fórmulas en el libro de trabajo
FormulaEvaluator evaluador = libro.getCreationHelper().createFormulaEvaluator();
evaluador.evaluateAll();

Al manipular filas o celdas, utilice siempre métodos de creación para evitar excepciones de puntero nulo, especialmente cuando no se conoce la existencia previa de los elementos.

Etiquetas: Apache POI java Excel exportación de datos maven

Publicado el 7-15 21:45