Programa en Java que vuelca un archivo Excel a una base de datos MySQL.
Este programa genérico en java (proyecto Maven) es un ejercicio simple que vuelca un libro Excel (xlsx) a una base de datos (MySQL) y viceversa. El programa lee la configuración de la base de datos de un fichero "properties" de Java y luego, con apache POI, leo las hojas, el nombre de cada hoja será el nombre de las tablas, la primera fila de cada hoja será el nombre de los atributos de cada tabla (hoja) y para saber el tipo de dato, tendré que preguntar a la segunda fila qué tipo de dato tiene.
Procesamos el fichero Excel y creamos una estructura de datos con la información siguiente: La estructura principal es el libro, que contiene una lista de tablas y cada tabla contiene tuplas nombre del campo y tipo de dato.
- Descripción
- Flujo del programa
- Requisitos
- Instalación y compilación
- Ejecutando con Docker
- Archivo de configuración
config.properties - Detección de tipos con Apache POI
- SQL de ejemplo
- Capturas de pantalla
- Conclusión
El programa hace lo siguiente:
- Lee la configuración de la base de datos desde
config.properties. - Analiza un archivo Excel (
.xlsx) y construye un modelo de datos interno:- Cada hoja → tabla en MySQL
- Primera fila → nombres de columnas
- Segunda fila → tipos de datos (INTEGER, DECIMAL, STRING, DATE, BOOLEAN)
- Crea las tablas en la base de datos si no existen.
- Inserta los datos del Excel en la base de datos.
- Exporta los datos de la base de datos a un nuevo archivo Excel (
salida.xlsx).
- Se carga la configuración de la base de datos desde un archivo
config.properties. - Se lee el archivo Excel y se genera una estructura de datos con las tablas y tipos detectados.
- Se crean las tablas en MySQL si no existen.
- Se insertan los datos del Excel en la base de datos.
- Se exportan los datos de la base de datos a un nuevo archivo Excel (
salida.xlsx).
- Java 21 o superior
- Maven 3.8+
- MySQL 8+ o MariaDB
- (Opcional) Docker, para levantar MySQL y Adminer rápidamente
Dependencias principales (gestionadas en pom.xml):
- Apache POI (para manejar Excel)
- MySQL Connector/J
- Log4j
Desde la raíz del proyecto, ejecutar:
mvn clean packageEl archivo JAR se generará en:
target/excel2database-1.0-SNAPSHOT-jar-with-dependencies.jar
Para poder ejecutar el programa desde cualquier carpeta con el comando excel2database, crea un script en /usr/local/bin:
sudo nano /usr/local/bin/excel2databaseContenido del script:
#!/bin/bash
JAR_PATH="tu_ruta_absoluta"
java -jar "$JAR_PATH" "$@"Dar permisos de ejecución:
sudo chmod +x /usr/local/bin/excel2databaseEjemplo de uso:
excel2database -f datos/personas.xlsx -db agendaParámetros:
-f: ruta al fichero Excel a importar.-db: nombre de la base de datos donde se crearán las tablas.
Asegúrate de que el archivo Excel existe en la ruta indicada o usa la ruta absoluta.
Puedes levantar MySQL y Adminer fácilmente con Docker:
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8
docker run --name adminer -p 8080:8080 --link mysql-db:db -d adminer- Adminer:
http://localhost:8080 - Conexión MySQL: host=
localhost, port=3306, usuario=root, password=root
Después de levantar MySQL, crea la base de datos agenda:
CREATE DATABASE agenda COLLATE 'utf16_spanish_ci';Creamos el archivo config.properties:
El programa obtiene los parámetros de conexión a MySQL desde un archivo config.properties, que debe colocarse en el directorio de trabajo.
user=root
password=s83n38DGB8d72
useUnicode=yes
useJDBCCompliantTimezoneShift=true
port=33307
database=agenda
host=localhost
driver=MySQL
outputFile=datos/salida.xlsx
inputFile=datos/entrada.xlsx
useSSL=false
serverTimezone=Europe/Madrid
allowPublicKeyRetrieval=trueAviso:
En producción jamás debemos de usar estos parámetros:
useSSL=false: No encripta la conexión.allowPublicKeyRetrieval=true: No comprueba el certificado (como el candado rojo del navegador)
En este proyecto se utiliza Apache POI para analizar las celdas de un archivo Excel (.xlsx) y determinar su tipo de dato, que se traducirá automáticamente a tipos SQL para crear la base de datos.
Cada celda se inspecciona con cell.getCellType() y se traduce a un tipo de dato de nuestro modelo FieldType (INTEGER, DECIMAL, STRING, DATE, BOOLEAN). Las fechas se detectan con DateUtil.isCellDateFormatted(cell).
| Tipo | Significado |
|---|---|
| NUMERIC | Número (entero, decimal o fecha) |
| STRING | Texto |
| BOOLEAN | Verdadero/Falso |
| FORMULA | Celda con fórmula |
| BLANK | Celda vacía |
| ERROR | Celda con error |
Ejemplo de implementación del método inferType:
private static FieldType inferType(Cell cell) {
switch (cell.getCellType()) {
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) return FieldType.DATE;
double val = cell.getNumericCellValue();
return (val == Math.floor(val)) ? FieldType.INTEGER : FieldType.DECIMAL;
case BOOLEAN:
return FieldType.BOOLEAN;
case STRING:
String s = cell.getStringCellValue().trim().toLowerCase();
if (s.equals("true") || s.equals("false")) return FieldType.BOOLEAN;
try {
Double.parseDouble(s);
return s.contains(".") ? FieldType.DECIMAL : FieldType.INTEGER;
} catch (NumberFormatException e) {
return FieldType.STRING;
}
default:
return FieldType.STRING;
}
}Este método es utilizado por ExcelReader.readExcel(String filePath) para generar el modelo WorkbookModel que luego se usa para crear tablas y volcar datos en la base de datos.
Para crear la base de datos utilizada en este proyecto:
CREATE DATABASE `agenda` COLLATE 'utf16_spanish_ci';Crear la tabla de ejemplo personas:
CREATE TABLE `personas` (
`nombre` VARCHAR(100) NOT NULL,
`apellidos` VARCHAR(300) NOT NULL,
`email` VARCHAR(100),
`telefono` VARCHAR(12),
`genero` ENUM('FEMENINO','MASCULINO','NEUTRO','OTRO') NOT NULL,
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;Insertar un registro de ejemplo:
INSERT INTO `personas` (`nombre`, `apellidos`, `email`, `telefono`, `genero`)
VALUES ('Juan', 'Sin Miedo', 'juan@sinmiedo.com', '+34555123456', 'OTRO');Consultas de ejemplo:
SELECT * FROM `personas` LIMIT 50;
SELECT * FROM `personas` LIMIT 5 OFFSET 10;Excel de entrada (personas.xlsx)
Ejecutando el programa en Linux
excel2database -f datos/personas.xlsx -db agendaAdminer mostrando tabla personas
Excel de salida (salida.xlsx)
Este proyecto es un ejercicio completo de Java + MySQL + Apache POI, útil para:
- Aprender a automatizar importación/exportación de datos
- Practicar Maven y gestión de dependencias
- Introducción a Docker para levantar servicios de bases de datos rápidamente



