java

Escribir archivo de Excel con Java

En el tutorial de hoy veremos cómo crear un archivo de Excel (xlsx) con Java, usando la librería Apache POI que es la más antigua pero a su vez la más estable.

Yo usaré maven como gestor de dependencias y NetBeans como IDE, pero recuerda que al final estarás programando en Java así que puedes usar las herramientas de tu preferencia.

Importando librerías para escribir xlsx

Para escribir en un archivo de Excel con Java primero debemos agregar las dependencias a nuestro proyecto. Para ello agregamos las siguientes al apartado de dependencias en nuestro pom.xml:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.2</version>
</dependency>

Fíjate que estoy usando las mismas versiones de poi-ooxml y poi. Lo hago así porque en caso contrario se generaban algunos errores.

Recuerda que puedes ver las últimas versiones de las librerías en https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml y https://mvnrepository.com/artifact/org.apache.poi/poi

Solo como referencia, así se ve todo mi pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>me.parzibyte.escribirexcel</groupId>
    <artifactId>EscribirExcel</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <exec.mainClass>me.parzibyte.escribirexcel.EscribirExcel</exec.mainClass>
    </properties>
</project>

Crear libro de Excel con Java

Vayamos al código. Esto lo puedes usar en cualquier lugar ya que al final es Java; yo lo he hecho simplemente en una aplicación de consola.

Comenzamos importando lo necesario:

import java.io.File;
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;

Necesitamos File y esas cosas para escribir nuestro archivo o Workbook en el disco duro.

Luego estamos importando cosas de la librería como Cell (para celdas), Row (para filas), Sheet (hojas), etcétera.

Ahora veamos el siguiente código que realmente crea un libro de trabajo y luego lo escribe:

Workbook libro = new XSSFWorkbook();
final String nombreArchivo = "Mi archivo creado con Java.xlsx";
Sheet hoja = libro.createSheet("Hoja 1");
Row primeraFila = hoja.createRow(0);
Cell primeraCelda = primeraFila.createCell(0);
primeraCelda.setCellValue("Yo voy en la primera celda y primera fila");
File directorioActual = new File(".");
String ubicacion = directorioActual.getAbsolutePath();
String ubicacionArchivoSalida = ubicacion.substring(0, ubicacion.length() - 1) + nombreArchivo;
FileOutputStream outputStream;
try {
    outputStream = new FileOutputStream(ubicacionArchivoSalida);
    libro.write(outputStream);
    libro.close();
    System.out.println("Libro guardado correctamente");
} catch (FileNotFoundException ex) {
    System.out.println("Error de filenotfound");
} catch (IOException ex) {
    System.out.println("Error de IOException");
}

Creamos un libro en la línea 1, y creamos una hoja en la línea 3. Luego trabajamos todas las celdas y filas sobre esa hoja, si tú quieres puedes crear más hojas e ir agregando filas y celdas a la misma.

Fíjate en que una hoja tiene varias filas y que debes obtener referencia a cada una de ellas a través de su índice para crear celdas.

En la línea 6 estoy escribiendo realmente dentro de la celda, y después en la línea 13 escribimos el archivo en el directorio actual con el nombre definido en la 2.

Libro de Excel creado con Java

En el directorio donde el código se ejecuta ahora estará un archivo XLSX que creamos fácilmente con Java. En mi caso se ve así:

Libro de Excel creado con Java y Apache POI

Fíjate en que se está respetando el nombre del archivo y de la hoja, además del contenido.

Código completo

Veamos todo el código que necesitamos para crear este archivo de Excel con Java:

/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Project/Maven2/JavaApp/src/main/java/${packagePath}/${mainClassName}.java to edit this template
 */package me.parzibyte.escribirexcel;

import java.io.File;
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;

/**
 *
 * @author parzibyte
 */public class EscribirExcel {

    public static void main(String[] args) {
        Workbook libro = new XSSFWorkbook();
        final String nombreArchivo = "Mi archivo creado con Java.xlsx";
        Sheet hoja = libro.createSheet("Hoja 1");
        Row primeraFila = hoja.createRow(0);
        Cell primeraCelda = primeraFila.createCell(0);
        primeraCelda.setCellValue("Yo voy en la primera celda y primera fila");
        File directorioActual = new File(".");
        String ubicacion = directorioActual.getAbsolutePath();
        String ubicacionArchivoSalida = ubicacion.substring(0, ubicacion.length() - 1) + nombreArchivo;
        FileOutputStream outputStream;
        try {
            outputStream = new FileOutputStream(ubicacionArchivoSalida);
            libro.write(outputStream);
            libro.close();
            System.out.println("Libro guardado correctamente");
        } catch (FileNotFoundException ex) {
            System.out.println("Error de filenotfound");
        } catch (IOException ex) {
            System.out.println("Error de IOException");
        }
    }
}

Nota: recuerda que tú puedes manejar las excepciones en la manera que creas conveniente.

Bonus: escribir datos dinámicos en archivo de Excel

Te voy a mostrar cómo crear un xlsx con Java pero usando datos de un ArrayList, de este modo verás que es fácil escribir datos de manera dinámica traídos desde una base de datos o de cualquier otro lugar.

Lo he colocado en un método estático para separar el concepto pero tener ambas cosas en un mismo archivo. Definimos la clase del ArrayList:

class Persona {

    private String nombre, web;
    private int edad;

    public Persona(String nombre, String web, int edad) {
        this.nombre = nombre;
        this.web = web;
        this.edad = edad;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getWeb() {
        return web;
    }

    public void setWeb(String web) {
        this.web = web;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

}

Y luego tenemos el método que escribe, dinámicamente, un archivo de Excel con Java:

public static void crearAPartirDeArrayList() {

    ArrayList<Persona> personas = new ArrayList<>();
    personas.add(new Persona("Luis", "https://parzibyte.me", 50));
    personas.add(new Persona("Rasmus Lerdorf", "https://toys.lerdorf.com/", 53));
    personas.add(new Persona("Brian Kernighan", "https://www.cs.princeton.edu/~bwk/", 80));
    Workbook libro = new XSSFWorkbook();
    final String nombreArchivo = "Personas.xlsx";
    Sheet hoja = libro.createSheet("Hoja 1");

    String[] encabezados = {"Nombre", "Web", "Edad"};
    int indiceFila = 0;

    Row fila = hoja.createRow(indiceFila);
    for (int i = 0; i < encabezados.length; i++) {
        String encabezado = encabezados[i];
        Cell celda = fila.createCell(i);
        celda.setCellValue(encabezado);
    }

    indiceFila++;
    for (int i = 0; i < personas.size(); i++) {
        fila = hoja.createRow(indiceFila);
        Persona persona = personas.get(i);
        fila.createCell(0).setCellValue(persona.getNombre());
        fila.createCell(1).setCellValue(persona.getWeb());
        fila.createCell(2).setCellValue(persona.getEdad());
        indiceFila++;
    }

    // Guardamos
    File directorioActual = new File(".");
    String ubicacion = directorioActual.getAbsolutePath();
    String ubicacionArchivoSalida = ubicacion.substring(0, ubicacion.length() - 1) + nombreArchivo;
    FileOutputStream outputStream;
    try {
        outputStream = new FileOutputStream(ubicacionArchivoSalida);
        libro.write(outputStream);
        libro.close();
        System.out.println("Libro de personas guardado correctamente");
    } catch (FileNotFoundException ex) {
        System.out.println("Error de filenotfound");
    } catch (IOException ex) {
        System.out.println("Error de IOException");
    }

}

El resultado es el siguiente:

Archivo de Excel creado con Java y un ArrayList (Datos dinámicos)

Poniendo todo junto

Ya para terminar te dejo el código completo:

package me.parzibyte.escribirexcel;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
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;

class Persona {

    private String nombre, web;
    private int edad;

    public Persona(String nombre, String web, int edad) {
        this.nombre = nombre;
        this.web = web;
        this.edad = edad;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getWeb() {
        return web;
    }

    public void setWeb(String web) {
        this.web = web;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

}

/**
 *
 * @author parzibyte
 */public class EscribirExcel {

    public static void crearAPartirDeArrayList() {

        ArrayList<Persona> personas = new ArrayList<>();
        personas.add(new Persona("Luis", "https://parzibyte.me", 50));
        personas.add(new Persona("Rasmus Lerdorf", "https://toys.lerdorf.com/", 53));
        personas.add(new Persona("Brian Kernighan", "https://www.cs.princeton.edu/~bwk/", 80));
        Workbook libro = new XSSFWorkbook();
        final String nombreArchivo = "Personas.xlsx";
        Sheet hoja = libro.createSheet("Hoja 1");

        String[] encabezados = {"Nombre", "Web", "Edad"};
        int indiceFila = 0;

        Row fila = hoja.createRow(indiceFila);
        for (int i = 0; i < encabezados.length; i++) {
            String encabezado = encabezados[i];
            Cell celda = fila.createCell(i);
            celda.setCellValue(encabezado);
        }

        indiceFila++;
        for (int i = 0; i < personas.size(); i++) {
            fila = hoja.createRow(indiceFila);
            Persona persona = personas.get(i);
            fila.createCell(0).setCellValue(persona.getNombre());
            fila.createCell(1).setCellValue(persona.getWeb());
            fila.createCell(2).setCellValue(persona.getEdad());
            indiceFila++;
        }

        // Guardamos
        File directorioActual = new File(".");
        String ubicacion = directorioActual.getAbsolutePath();
        String ubicacionArchivoSalida = ubicacion.substring(0, ubicacion.length() - 1) + nombreArchivo;
        FileOutputStream outputStream;
        try {
            outputStream = new FileOutputStream(ubicacionArchivoSalida);
            libro.write(outputStream);
            libro.close();
            System.out.println("Libro de personas guardado correctamente");
        } catch (FileNotFoundException ex) {
            System.out.println("Error de filenotfound");
        } catch (IOException ex) {
            System.out.println("Error de IOException");
        }

    }

    public static void main(String[] args) {
        crearAPartirDeArrayList();
        Workbook libro = new XSSFWorkbook();
        final String nombreArchivo = "Mi archivo creado con Java.xlsx";
        Sheet hoja = libro.createSheet("Hoja 1");
        Row primeraFila = hoja.createRow(0);
        Cell primeraCelda = primeraFila.createCell(0);
        primeraCelda.setCellValue("Yo voy en la primera celda y primera fila");
        File directorioActual = new File(".");
        String ubicacion = directorioActual.getAbsolutePath();
        String ubicacionArchivoSalida = ubicacion.substring(0, ubicacion.length() - 1) + nombreArchivo;
        FileOutputStream outputStream;
        try {
            outputStream = new FileOutputStream(ubicacionArchivoSalida);
            libro.write(outputStream);
            libro.close();
            System.out.println("Libro guardado correctamente");
        } catch (FileNotFoundException ex) {
            System.out.println("Error de filenotfound");
        } catch (IOException ex) {
            System.out.println("Error de IOException");
        }
    }
}

Espero que a partir de estos ejemplos puedas lograr lo que necesitas, ya sea guardar los datos de una base de datos, de cosas solicitadas al usuario o cualquier otra cosa.

Por aquí te dejo el proyecto en GitHub y en este enlace puedes leer más tutoriales de Java.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Hola! Quiero hacer para hacer un link que dirija a un xls descargable. Al hacer una búsqueda, me muestra en 1 tabla las filas encontradas (variable) y quiero poner 1 xls que almacene en cada fila del xls, una linea de la tabla!
    muchas gracias!

  • pregunta... hace falta algo en el código, porque me aparece el siguiente mensaje:

    Unexpected element "{http://maven.apache.org/POM/4.0.0}project" {antlib:org.apache.tools.ant}project

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.