Leer Excel desde Java como si fuera una Base de Datos

De ChuWiki

Desde java y usando el driver ojdb, podemos acceder a un fichero Excel como si fuera una base de datos, de forma que podremos leer su contenido o escribir en él. Veamos aquí cómo.

Configurar la fuente de datos[editar]

Lo primero que tenemos que hacer, en windows, es configurar el fichero excel como si fuera una fuente de datos. Puedes ver el vídeo de cómo configurar un excel como fuente de datos.

<object id='stUEtRRUZARFtYRF1cXV1cUFdW' width='425' height='344' type='application/x-shockwave-flash' data='http://www.screentoaster.com/swf/STPlayer.swf' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0'><param name='movie' value='http://www.screentoaster.com/swf/STPlayer.swf'/><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always'/><param name='flashvars' value='video=stUEtRRUZARFtYRF1cXV1cUFdW'/></object>

Si lo prefieres puedes ver los pasos detallados en Conectar Java con Access, aunque allí se habla de un fichero Access y ficheros .mdb. Debes hacer lo mismo, pero eligiendo un Driver de excel y un fichero .xls

Código java[editar]

Símplemente debemos abrir la conexión como si fuera una base de datos normal, usando el Driver sun.jdbc.odbc.JdbcOdbcDriver. El código puede ser como este

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conexion = DriverManager.getConnection("jdbc:odbc:un_excel");

donde "un_excel" es el nombre que elegimos para la fuente de datos cuando la configuramos en el paso anterior.

A partir de aquí, el código es el normal para acceso a cualquier base de datos, usando los Statement y ResultSet. Podemos leer o insertar, si al configurar en la fuente de datos desmarcamos el check de "sólo lectura".

Símplemente comentar un par de cosas:

Tablas[editar]

En un excel se considera que cada una de las hojas dentro del fichero excel es una tabla. Las columnas de la tabla serán los nombres que aparecen en la primera fila (no las letras A,B,C...). Así, por ejemplo, el siguiente trozo de código java

        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conexion = DriverManager
                    .getConnection("jdbc:odbc:un_excel");

            Statement st = conexion.createStatement();

            st.execute("create table kk2 (id NUMBER, nombre TEXT, precio NUMBER)");

            st.execute("INSERT INTO kk2 (id,nombre,precio) "
                    + "VALUES (1,'hola',12.52)");

            conexion.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

Dará como resultado la siguiente hoja de excel


Nombre de las tablas[editar]

Si el fihero excel se ha creado con la aplicación excel en vez de con nuestra aplicación java, desde java veremos los nombres de las hojas (de las tablas) con un $ detrás. Por ejemplo, si el excel tiene una pestaña etiquetada "Nov2004", desde java la veremos como "Nov2004$". La forma de acceder a ellos con una SQL sin que nos de error por el carácter $, es poniendo el nombre de la tabla con el $ y todo ello entre corchetes, así [Nov2004$]

ResultSet rs = st.executeQuery("select * from [Nov2004$]");

Si la tabla la hemos creado nosotros con un "create table", no es necesario este $ al consultarla.

Catálogos[editar]

Los catálogos que considera la base de datos son los ficheros Excel. Cuando abrimos nuestra fuente de datos que apunta a un fichero excel, el catálogo que estamos usando es ese fichero excel. Sin embargo, tendremos como catálogos accesibles todos los ficheros excel que haya en el mismo directorio del fichero excel que hemos elegido. Y si cambiamos de catálogo y ponemos uno que no existe, estaremos creando un fichero excel nuevo en ese directorio.

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conexion = DriverManager.getConnection("jdbc:odbc:un_excel");
conexion.setCatalog("nuevoCatalogo");

Ese trozo de código utilizará el fichero "nuevoCatalogo.xls", independientemente del fichero que hayamos indicado en la fuente de datos "un_excel". Si ese fichero nuevoCatalogo.xls existe, será el que se use. Si no existe, lo creará (debemos nosotros, desde java, crear las tablas correspondientes y las columnas para cada una de ellas).