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í:
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:
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.
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