Skip to content

Herramienta en Java/Maven que permite importar datos desde un Excel a MySQL y exportar datos de MySQL a Excel automáticamente. Analiza tipos de datos, crea tablas dinámicamente y soporta configuración mediante archivo config.properties

Notifications You must be signed in to change notification settings

gonzalocg123/excel2database

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Proyecto excel2database

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.


Índice

  1. Descripción
  2. Flujo del programa
  3. Requisitos
  4. Instalación y compilación
  5. Ejecutando con Docker
  6. Archivo de configuración config.properties
  7. Detección de tipos con Apache POI
  8. SQL de ejemplo
  9. Capturas de pantalla
  10. Conclusión

Descripción

El programa hace lo siguiente:

  1. Lee la configuración de la base de datos desde config.properties.
  2. 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)
  3. Crea las tablas en la base de datos si no existen.
  4. Inserta los datos del Excel en la base de datos.
  5. Exporta los datos de la base de datos a un nuevo archivo Excel (salida.xlsx).

Flujo del programa

  1. Se carga la configuración de la base de datos desde un archivo config.properties.
  2. Se lee el archivo Excel y se genera una estructura de datos con las tablas y tipos detectados.
  3. Se crean las tablas en MySQL si no existen.
  4. Se insertan los datos del Excel en la base de datos.
  5. Se exportan los datos de la base de datos a un nuevo archivo Excel (salida.xlsx).

Requisitos

  • 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

Instalación y compilación

1. Compilación con Maven

Desde la raíz del proyecto, ejecutar:

mvn clean package

El archivo JAR se generará en:

target/excel2database-1.0-SNAPSHOT-jar-with-dependencies.jar

2. Crear un script ejecutable

Para poder ejecutar el programa desde cualquier carpeta con el comando excel2database, crea un script en /usr/local/bin:

sudo nano /usr/local/bin/excel2database

Contenido del script:

#!/bin/bash
JAR_PATH="tu_ruta_absoluta"
java -jar "$JAR_PATH" "$@"

Dar permisos de ejecución:

sudo chmod +x /usr/local/bin/excel2database

3. Ejecutar el programa

Ejemplo de uso:

excel2database -f datos/personas.xlsx -db agenda

Pará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.


Ejecutando con Docker

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';

Archivo de configuración config.properties

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=true

Aviso:

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)

Detección de tipos con Apache POI

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).

Tipos detectados (CellType)

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.

SQL de ejemplo

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;

Capturas de pantalla

Excel de entrada (personas.xlsx)

Excel Entrada

Ejecutando el programa en Linux

excel2database -f datos/personas.xlsx -db agenda

Ejecución Terminal

Adminer mostrando tabla personas

Adminer

Excel de salida (salida.xlsx)

Excel Salida


Conclusión

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

About

Herramienta en Java/Maven que permite importar datos desde un Excel a MySQL y exportar datos de MySQL a Excel automáticamente. Analiza tipos de datos, crea tablas dinámicamente y soporta configuración mediante archivo config.properties

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages