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:
- Gestionar el documento Excel como una base de datos a través de ODBC.
- Utilizar una API específica para crear y modificar un documento Excel desde cero.
- 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.
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».
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:
10 comentarios