Visual Basic – Leer y obtener datos de Excel

Recientemente, en una entrevista de trabajo, he tenido que realizar una prueba de conocimientos que consistía en acceder desde Visual Basic 2008 a una hoja de cálculo Excel, obtener los datos que contenía y luego generar un documento que imitaba el formato de una factura en PDF con los mismos.

Más allá de lo extraño que pareciese el planteamiento (para almacenar facturas lo normal es usar bases de datos, y además la hoja de cálculo no contenía todos los datos exigibles en una factura), me pareció que constituía un buen ejercicio para estrenar el apartado de Visual Basic en el blog.

Lo he dividido en dos partes: en la primera de ellas accederemos a la hoja de cálculo. En la segunda parte, publicada el 8 de agosto de 2014, nos encargamos de generar el documento PDF.

Así pues, sin más dilación, vayamos a por la primera parte.

Leer y obtener datos de una hoja Excel desde Visual Basic

Qué necesitaremos

Para este ejercicio necesitaremos lo siguiente en nuestro ordenador:

  • Sistema operativo Windows.
  • Una versión de Visual Studio. Yo uso 2013 Premium porque es la que tengo licenciada como estudiante.
  • Microsoft Excel 2007 o superior. En nuestro proyecto vamos a tener que echar mano de la Referencia “Microsoft Excel 14.0 Object Library”, que corresponde a la versión 2010, pero si tienes la versión 2007 deberías poder usar la referencia “Microsoft Excel 12.0 Object Library” obteniendo los mismos resultados. En internet he encontrado páginas que dicen cómo contar con estas librerías sin tener Excel instalado, pero a mí no me ha funcionado, así que me curo en salud y tiro por el camino de en medio: hace falta Excel 2007 o superior.
  • Una hoja de cálculo con los datos a obtener. En mi caso la he llamado “llistat_factures.xlsx” y contiene los siguientes datos:
    Los datos en sí dan igual, pero ten en cuenta que en mi ejemplo trato con el rango de celdas A1:J6. Rangos distintos provocarán errores en la ejecución del proyecto.
  • Para la siguiente entrega: Una imagen que hará las funciones de logotipo en nuestra factura PDF. La mía se llama “logo.png” y tiene unas dimensiones de 69×90 píxeles.
  • Para la siguiente entrega: Las librerías iTextSharp, que deberás descargar desde la página oficial. Estas librerías son las que nos permitirán generar nuevos PDFs desde nuestro código.

Añadir referencias al proyecto

En Visual Studio crearemos un nuevo proyecto de Visual Basic. Yo lo he llamado “xls2pdf”. Lo primero que vamos a hacer es añadir la referencia al proyecto que nos va a permitir manipular archivos Excel 2007+. Para ello, seguimos los siguientes pasos con nuestro proyecto abierto: (repito, uso Visual Basic 2013, en otras ediciones este procedimiento puede variar ligeramente):

  1. Menú “PROYECTO” – “Propiedades de xls2pdf”.
  2. En la parte izquierda de la ventana, pinchamos la pestaña “Referencias”.
  3. En la parte inferior, pinchamos en “Agregar.”
  4. Nos aparece la ventana “Administrador de referencias”. En la izquierda de la misma desplegamos la pestaña “COM” y seleccionamos “Biblioteca tipos”. En la parte principal de la ventana buscaremos la referencia “Microsoft Excel 14.0 Object Library”. Y hacemos doble click sobre ella para añadirla al proyecto. (También podemos situar el cursos sobre el espacio vacío a la izquierda del nombre para que aparezca la casilla de selección y marcarla). Por favor, ten en cuenta, que si tienes instalada una versión de Excel distinta a la 2010 esta referencia podría tener un número de versión distinto al 14.0.

El formulario

La idea es abrir la hoja Excel, cargar los datos de las facturas que se mostrarán en una lista, y al hacer doble click en un elemento de la lista generar el PDF correspondiente. Mi formulario es el siguiente. Además incluyo un botón para salir de la aplicación, y una etiqueta en la parte inferior a modo de barra de estado.

Es bastante sencillo y se explica por sí mismo:

Los controles que vamos a usar son los siguientes, con sus correspondientes nombres:

  • Formulario: frmPrincipal
  • Botones: btnCargar, btnLeer, btnSalir
  • Etiquetas: Label1 (“Resumen facturas”) y lblEstado.
  • Lista: lstFacturas.
  • OpenFileDialog: ofd
  • SaveFileDialog>: sfd

Importar referencia y variables globales

Primero importamos la referencia al objeto Excel. Hacemos doble click en una parte vacía del formulario. Justo encima de donde empieza la clase frmPrincipal tecleamos:

Justo por debajo de donde empieza la clase frmPrincipal añadirmos las variables y los arrays globales que almacenarán los datos de cada factura:

Botón Cargar

En el formulario, hacemos doble click sobre el botón btnCargar para programar su funcionamiento. Este botón simplemente mostrará el cuadro de diálogo para abrir el archivo .xlsx que nos interese. Cuando el usuario lo haya seleccionado, al hacer click en “Aceptar”, el archivo Excel quedará abierto y dispuesto para su manipulación. El código resultante será el siguiente:

Botón btnLeer

Una vez abierto el archivo .xlsx, al pulsar este botón leeremos su contenido, generaremos una línea resumen por cada factura y la añadiremos a la lista de facturas. Como siempre, para añadir el código correspondiente haremos doble clic sobre el botón en el formulario (btnLeer):

Botón btnSalir

Cuando el usuario haga clic en este botón, se le pedirá confirmación antes de abandonar la aplicación. El código para btnSalir es el siguiente:

Y por ahora basta…

Con lo dicho hasta ahora nuestro proyecto debería ser capaz de abrir un archivo .xlsx indicado por el usuario, generar un resumen por cada una de las filas contenidas en dicho archivo, y mostrar esos resúmenes en el cuadro de lista. En la próxima entrega seguiremos programando para que al hacer doble click en cualquier elemento de la lista se genere un PDF con la factura correspondiente.

Y con esto termina la primera parte. Como digo, en la siguiente entregatratamos exclusivamente la generación de los archivos PDF con la librería iTextSharp. Por favor, si encuentras errores o una manera más sencilla o elegante de conseguir esto, no dudes en hacérmelo saber. Mi entrevistador ya me dijo que había una (tal vez por eso no me han vuelto a llamar 😉 ).Ya sabes que yo también soy novato y siempre estoy ansioso por aprender 🙂

¡Muchas gracias por leerme!

Los comentarios están cerrados.