Inicio Programación Tratamiento de documentos Excel en Java (1)

Tratamiento de documentos Excel en Java (1)

por sgoliver

En los últimos días, trabajando en un proyecto personal, he tenido que enfrentarme a la tarea de generar documentos de Microsoft Excel desde una aplicación escrita en Java. Viniendo del mundo .NET, y las facilidades que da esta plataforma para realizar este tipo de tareas, no estimé demasiado complejo hacer esto mismo en Java. Sin embargo, cuando llegó el momento de buscar información sobre el tema me llevé la desagradable sorpresa de que no existen muchas posibilidades, aunque sí suficientes, para solucionar el problema.

Después de estudiar las principales alternativas podemos limitar las opciones a tres estrategias básicas:

  1. Gestionar el documento Excel como una base de datos a través de ODBC.
  2. Utilizar una API específica para crear y modificar un documento Excel desde cero.
  3. Utilizar una API específica para generar un documento Excel a partir de una plantilla previamente preparada.

La primera de las opciones es sumamente simple y directa utilizando los recursos que ofrece el propio SDK de JAVA y las fuentes de datos ODBC de Windows. Para las otras dos alternativas existen cuatro APIs de Java que describiré en los próximos artículos. De cualquier forma, estos artículos no pretenden ser una guía exhaustiva para el uso de estas herramientas, sino sólo un punto de inicio desde donde poder empezar a recavar información sobre la alternativa que más se adapte a nuestras necesidades.

Uso de ODBC para la gestión de documentos Excel

Esta primera opción representa una alternativa poco conocida para la gestión de documentos Excel, pero que puede ser muy útil para el tratamiento de estos documentos desde cualquier tipo de aplicación, y más concretamente en nuestro caso desde aplicaciones Java. Este método consiste en acceder al documento Excel a través del controlador ODBC proporcionado por Windows para este tipo de ficheros, utilizando el documento de la misma forma que si se tratase de una base de datos tradicional y usando el lenguaje SQL para la manipulación de los datos.

Aunque existen numerosas limitaciones, como por ejemplo el no poder utilizar la sentencias DELETE o depender de un formato específico del documento, aún puede ser muy útil en la creación desde cero de documentos o en el análisis de los mismos mediante SQL.

Como ejemplo, voy a mostrar cómo se crearía una nueva hoja dentro de un documento Excel ya existente y cómo se añadirían nuevos datos a la misma. Para ello, en primer lugar será necesario crear un nuevo origen de datos ODBC que apunte al documento Excel a modificar.

Configuración ODBC Excel

Configuración ODBC Excel

Esto se puede hacer a través de la opción «Origenes de datos (ODBC)» situada normalmente en el panel de control de Windows, dentro del grupo de «Herramientas Administrativas».

Dentro de la pestaña «DSN de Sistema» pulsamos «Agregar…» para añadir un nuevo origen de datos, seleccionamos el controlador «Microsoft Excel Driver (*.xls)» y pulsamos finalizar. Esto nos llevará al cuadro de diálogo «Configuración de ODBC Microsoft Excel» donde únicamente tendremos que seleccionar el fichero Excel que queramos utilizar como base de datos y dar un nombre al origen de datos, que después usaremos para abrir la conexión desde la aplicación java.

Una vez creado el origen de datos, la conexión con éste desde nuestra aplicación Java y la manipulación mediante comandos SQL se realiza de la forma tradicional, utilizando la API de acceso a datos proporcianada por Java (JDBC) y haciendo uso del puente JDBC-ODBC como driver de acceso.

A continuación se muestra el código completo de un pequeño ejemplo donde creamos una nueva base de datos, añadimos un par de registros y mostramos cómo se realiza una consulta sencilla a la base de datos creada.

import java.sql.*;

public class Principal
{
    public static void main(String[] args)
    {
        try
        {
            //Registro del driver
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            //Apertura de la conexión
            Connection con =
                DriverManager.getConnection("jdbc:odbc:PRUEBAEXCEL");

            //Creación de la sentencia SQL
            Statement stmt = con.createStatement();

            //Creación de la hoja
            stmt.execute("CREATE TABLE articulos " +
                "(id NUMBER, nombre TEXT, precio NUMBER)");

            //Inserción de dos nuevas filas
            stmt.execute("INSERT INTO articulos (id,nombre,precio) " +
                "VALUES (1,'Articulo1',12.52)");

            stmt.execute("INSERT INTO articulos (id,nombre,precio) " +
                "VALUES (2,'Articulo2',15.63)");

            //Consulta al documento
            ResultSet rs =
                stmt.executeQuery("SELECT nombre FROM articulos " +
                    "WHERE id = 2");

            while(rs.next())
            {
                System.out.println("Nombre artículo: " +
                rs.getString(1));
            }

            //Cierre de recursos
            stmt.close();
            con.close();
        }
        catch(ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
    }
}

Si ejecutamos este ejemplo podremos ver cómo en el libro Excel configurado como origen de datos se ha creado una nueva hoja llamada «articulos» con tres columnas, cuya cabecera se corresponde con los nombres de los campos que componen la base de datos creada y las restantes filas contienen los datos de los dos registros insertados. Además, como salida del programa se obtendrá el siguiente mensaje: «Nombre artículo: Artículo2».

Resultado Excel ODBC

Resultado Excel ODBC

Con esto puede comprobarse como al utilizar un documento Excel como base de datos a través del controlador ODBC, las bases de datos se corresponden con libros Excel, las tablas con hojas dentro del libro y los campos de una tabla con las distintas columnas de la hoja, donde la primera fila contiene los nombres de cada campo y las filas siguientes los datos de cada registro.

Como se extrae de este ejemplo, la utilización de ODBC para el acceso a documentos Excel es muy sencillo. Sin embargo, como ya se ha comentado al principio, existen una serie de limitaciones que hacen que no pueda considerarse totalmente válida esta opción para cubrir todas nuestras necesidades. Como muestra, podemos enumerar las siguientes limitaciones:

* Debido a que dependemos de orígenes de datos ODBC, esta opción sólo es válida para sistemas operativos Windows.
* No se pueden utilizar todas las sentencias SQL para la manipulación de los documentos. Así por ejemplo, no es posible eliminar filas de una hoja con la sentencia DELETE o modificar la estructura de la hoja una vez creada con sentencias ALTER TABLE.
* A través de ODBC sólo es posible actuar sobre los datos del documento, pero no podremos establecer niguna opción de formato.

Y hasta aquí el primer articulo de la serie que voy a dedicar al tratamiento de documentos Excel desde aplicaciones Java. En el próximo post veremos las dos APIs más populares que nos permiten crear y modificar documentos Excel completos, actuando sobre los datos y sobre el formato de los mismos.

Referencias:

  1. Microsoft ODBC Desktop Database Drivers [Inglés]
  2. Excel ODBC Driver and Text ODBC Driver Notes [Inglés] [Español]
  3. Artículos en JavaWorld: [1] Its Excel-lent[2] The Java-Excel solution revisited

También te puede interesar

10 comentarios

Sebastián M. Barrionuevo 19/07/2009 - 14:45

Hola estoy empezando a programar en Java y al querer hacer una conexion ODBC en Java me emite el siguiente error:

«java.sql.SQLException: [Microsoft][Controlador ODBC Excel] La tabla externa no tiene el formato esperado.»

El codigo es el siguiente:

package obtenerConexion;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {

try {
//Registro del driver
Class.forName(«sun.jdbc.odbc.JdbcOdbcDriver»);

//Apertura de la conexión
Connection con =DriverManager.getConnection(«jdbc:odbc:PRUEBAEXCEL»);

//Creación de la sentencia SQL
Statement stmt = con.createStatement();
//Connection laConexion=AdministradorDeConexiones.obtenerConexion();
/*
String laConsulta=»Select * fom Hoja1″;
Statement stmtConsulta=laConexion.createStatement();
ResultSet rs =stmtConsulta.executeQuery(laConsulta);

//Muestra los Datos-
while(rs.next() ){
System.out.println(«Agente: «+rs.getString(«Agente»));
}
stmtConsulta.close();
laConexion.close();
*/
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

Responder
sgoliver 19/07/2009 - 16:31

Hola Sebastián, necesitaría ver también la excel sobre la que estás intentando hacer la consulta de forma que pueda determinar si es problema de la excel o de tu código. Envíame si quieres una excel de ejemplo que no te funcione y le intento echar un vistazo.

Responder
Juan Diego Londoño Duque 14/09/2009 - 17:07

hola yo tambien tengo el mismo problema que sebastián, aunque yo estoy programando en visual .net, pero el resultado cuando intento importar la información de excel sale ese mensaje de error («La tabla externa no tiene el formato esperado»), muchas gracias por su colaboración.

Responder
Juan 06/10/2009 - 2:55

Probé la primera forma de conectarse, y me funciona perfectamente, gracias por la ayuda, intentare las otras dos formas.

Responder
hugo 30/06/2010 - 20:22

a mi me sale el error que la bdexcel no se puede modificar porque es de solo lectura…… como lo soluciono???

Responder
hugo 30/06/2010 - 21:19

el error anterior ya lo soluciones pero ahora me sale este error.. un favor ayudame.

[Microsoft][Controlador ODBC Excel] Error de sintaxis (falta operador) en la expresión de consulta ‘'Articulo1'’.

Responder
alex 03/02/2011 - 0:30

Hola que tal oie tu pagina esta increible
intente checar el codigo como lo muestras y configure como lo mencionas al principio me aparecieron un buen de errores pero ya los corregi ahora solo me sale un error que dice :

java.sql.SQLException: [Microsoft][Controlador ODBC Excel] La tabla externa no tiene el formato esperado.

podrias apoyarme para ver como lo solusiono

Responder
Adrian 03/11/2011 - 20:48

Hola como estas:

Podrias ayudarme? me sale el siguiente mensaje:
java.sql.SQLException: [Microsoft][Controlador ODBC Excel] El motor de base de datos Microsoft Jet no pudo encontrar el objeto ‘accesoria’. Aseg?rese de que el objeto existe, y que ha escrito el nombre y la ruta de acceso al objeto correctamente.

Lo anterior se refiere a la sentencia:
stm.executeUpdate(«CREATE TABLE accesoria»+…

Muchas gracias

Responder
Marco 11/12/2012 - 18:52

hola que tal:

antes que nada te felicito por tu pagina, ademas quisiera saber si podrias ayudarme ya que mi aplicacion me manda el mismo error que a Adrian, y tengo el tiempo encima, espero me puedas ayudar de antemano gracias.

Responder
Jesús lopez 25/06/2015 - 19:40

Disculpa, sabrías como manipular un documento de word o una hoja de excelente con android estudio?

Responder

Responder a Sebastián M. Barrionuevo

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies