Reportes en Excel Con VB
Reportes en Excel Con VB
Reportes en Excel Con VB
NET
A muchos desarrolladores se les a presentado la necesidad de crear reportes con ciertos estilos
provenientes de herramientas de terceros, por lo regular los ejecutivos les gusta la forma en que se
presentan los informes en formato EXCEL y muchas veces informes generados por sistemas de
gestin, se nos solicita que sean exportados a EXCEL para ajustarlos a sus necesidades y gustos.
Bueno con este articulo pretendo mostrarle una forma sencilla de leer una base de datos y generar
un informe directamente en EXCEL aprovechando todas las funcionalidades de esta herramienta,
se podra decir que mas del 50 porciento de las computadoras de oficina cuentan con alguna
versin de Microsoft Office, as que estimo que le ser de utilidad alguno de ustedes.
Iniciamos.
Creamos una nueva solucin en Visual Studio .NET y agregamos una referencia a la librera de
objeto de Excel que se encuentra en la paleta COM de la ventana de agregar referencias en Visual
Studio .NET
Si la versin de Office con la que cuentan es 2000 la librera seria Microsoft Excel 9.0 Object
Library, luego hacemos clic en Select y luego en OK y listo.
Creamos una forma que ser nuestra plataforma de lanzamiento desde donde lanzaremos los
ejemplos que crearemos nuestra forma ser vera as:
El primer botn lo utilizaremos para crear un pequeo ejemplo de cmo tratar un documento
EXCEL como una base de datos y leer sus documentos con sentencias SQL, el segundo botn lo
utilizaremos para crear nuestro listado en EXCEL, ahora le describo cual es el procedimiento.
1.
Utilizaremos la base de datos Northwind que trae Microsoft Access como demo.
2.
Leeremos las tablas Categories y Productos para crear un listado de productos por
categoras.
3.
Crearemos un grafico estadstico con todas las categoras de productos que hay en el
listado.
El Cdigo
Llego la hora de la codificacin, primero definiremos una variable tipo Excel.Application a nivel de
formulario la cual hace referencia a EXCEL.
'' Creamos un objeto Excel
Dim m_Excel As Excel.Application
Agregamos el siguiente cdigo en el evento Closing del formulario para cuando cerremos el
formulario eliminar la instancia de Excel que este ejecutndose.
If Not m_Excel Is Nothing Then
m_Excel.Quit()
m_Excel = Nothing
End If
Hacemos doble clic en el segundo botn Listado en Excel, luego definiremos una variable de tipo
string para controlar la ruptura por nombre de categoras.
Dim CategoryName As String
' Variable para controlar la ruptura por nombre de
categoras
Creamos 1 variable tipo Excel.WorkBook para crear el documento Excel y otra tipo
Excel.WorkSheet para crear la hoja del documento.
'' Creamos un objeto WorkBook
Dim objLibroExcel As Excel.Workbook
'' Creamos un objeto WorkSheet
Dim objHojaExcel As Excel.Worksheet
Ahora crearemos una conexin a la base de datos northwind y leeremos los registros de las tablas
Categories y Producta, crearemos un dataset y llevaremos los datos al DataSet.
Dim objSQLConnect As New System.Data.OleDb.OleDbConnection("Data
Source=Northwind.mdb;Password=;Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin")
Dim objSQLAdapter As New OleDb.OleDbDataAdapter("select
CategoryName,ProductID,ProductName,UnitPrice from Products,Categories Where
Products.CategoryID = Categories.CategoryID order by Categories.CategoryID", objSQLConnect)
Dim objDataSet As New DataSet("ExcelTest")
objSQLAdapter.Fill(objDataSet, "Categories")
Iniciamos una instancia de EXCEL y Hacemos visibles para ver como se va creando el reporte,
podemos hacerlo visible al final si se desea.
'' Iniciamos una instancia a Excel
m_Excel = New Excel.Application
m_Excel.Visible = True
Es importante tener en mente que algunas datas, tales como Fechas y nmeros, pueden ser
desplegadas correctamente cuando se conoce la configuracin regional de la computadora donde
se trabaja. Para interpretar, convertir y presentar la data debemos considerar la variedad de
lenguajes y versiones de Microsoft Office y Microsoft Windows que el usuario puede tener, por
ejemplo cuando Excel recibe una llamada desde un programa externo, Excel utiliza el identificador
Local (LCID) enviado por cliente que realiz la llamada para procesar los valores tales como
05/06/2005or 29,250.00, si su configuracin regional no coincide con esta LCID se producir un
error de ejecucin o la data no se desplegar correctamente.
Para evitar estos problemas crearemos una variable tipo CultureInfopara mantener la cultura con
la que esta configurada la maquina y Crearemos una nueva cultura para trabajar de tipo InglsEstados Unidos (es-US)).
'' Creamos una variable para guardar la cultura actual
Dim OldCultureInfo As System.Globalization.CultureInfo
=System.Threading.Thread.CurrentThread.CurrentCulture
'Crear una cultura standard (en-US) ingls estados unidos
System.Threading.Thread.CurrentThread.CurrentCulture = _
New System.Globalization.CultureInfo("en-US")
Ahora creamos un nuevo documento y seleccionamos la primera hoja del documento en la cual
crearemos nuestro informe
'' Creamos una instancia del Workbooks de Excel
'' Creamos una instancia de la primera hoja de trabajo de Excel
objLibroExcel = m_Excel.Workbooks.Add()
objHojaExcel = objLibroExcel.Worksheets(1)
objHojaExcel.Visible = Excel.XlSheetVisibility.xlSheetVisible
'' Hacemos esta hoja la visible en pantalla
'' (como seleccionamos la primera esto no es necesario
'' si seleccionamos una diferente a la primera si lo
'' necesitaramos, esto lo hacemos como forma de mostrar como cambiar de entre hojas
en un documento Excel).
objHojaExcel.Activate()
Para hacer referencia a cualquiera de las celdas de una hoja de Excel o a un rango de celdas de la
hoja de Excel debemos hacerlo a travs del Objeto Range entrelos parmetros que recibe este
objeto debemos enviarle las coordenadas de la celda o rango de celda que deseamos acceder Ej.:
HojaExcel.Range(A1:D1) aqu hacemos referencia a las celdas desde la A1 hasta la D1
lo que quiere decir que incluye A1, B1, C1 y D1.
HojaExcel.Range(A1) aqu hacemos referencia a la celda A1.
HojaExcel.Range(A1,A3,A5,A7) aqu hacemos referencia a las celdas A1, A3, A5 y A7,
esto seria igual que si presionramos el control y hacemos clic en cada una de estas celdas.
Creamos el encabezado del reporte, la primera lnea une las celdas y las convierte un en una sola,
la segunda lnea Asigna el nombre del encabezado, la tercera lnea asigna negrita al titulo y la
cuarta lnea signa un Size a titulo de 15.
'' Crear el encabezado de nuestro informe
objHojaExcel.Range("A1:D1").Merge()
objHojaExcel.Range("A1:D1").Value = "MAON FOOT SHOP, S. A."
objHojaExcel.Range("A1:D1").Font.Bold = True
objHojaExcel.Range("A1:D1").Font.Size = 15
'' Crear el subencabezado de nuestro informe
objHojaExcel.Range("A2:D2").Merge()
objHojaExcel.Range("A2:D2").Value = "Ingredient List by Category"
objHojaExcel.Range("A2:D2").Font.Italic = True
objHojaExcel.Range("A2:D2").Font.Size = 13
Creamos los encabezados de las columnas de nuestro informe, este constar de 4
columnas,Categoriaque desplegara el nombre de la categoras, Cdigoque desplegara el
cdigo del producto, Nombredesplegara el nombre del producto y Precio para desplegar el
precio del producto formateado segn una mascarilla que especificaremos.
i += 2
End If
'' Asignar la categora impresa
CategoryName = objRow.Item(0)
'' Asignar los valores de los registros a las celdas
objHojaExcel.Cells(i, "A") = objRow.Item(0) 'CategoryName'
objHojaExcel.Cells(i, "B") = objRow.Item(1) 'ProductID'
objHojaExcel.Cells(i, "C") = objRow.Item(2) 'ProductName'
objHojaExcel.Cells(i, "D") = objRow.Item(3) 'UnitPrice'
'' Avanzamos una fila
i += 1
Next
'* El Ultimo subtotal
objHojaExcel.Cells(i, "A") = "Total Category " & CategoryName.Trim
objHojaExcel.Cells(i, "B") = "=count(D" & (j + 2).ToString & ":D" & (i - 1).ToString & ")"
objHojaExcel.Cells(i, "C") = "Subtotal Precio:"
objHojaExcel.Cells(i, "D") = "=sum(D" & (j + 2).ToString & ":D" & (i - 1).ToString & ")"
objHojaExcel.Range("A" & i.ToString & ":D" & i.ToString).Font.Bold = True
'' Avanzamos una fila
i += 1
'' Seleccionar todo el bloque desde A1 hasta D #de filas
Dim objRango As Excel.Range = objHojaExcel.Range("A3:D" & (i - 1).ToString)
'' Seleccionamos todo el rango especificado
objRango.Select()
'' Ajustamos el ancho de las columnas al ancho mximo del
'' contenido de sus celdas
objRango.Columns.AutoFit()
'' Asignar filtro por columna
objRango.AutoFilter(1, , VisibleDropDown:=True)
'' Asignar un formato automtico
objRango.AutoFormat(11, Alignment:=False)
'' Seleccionamos el total general del reporte y asignamos
'' font a negrita e itlica
objRango = objHojaExcel.Range("A" & i.ToString & ":D" & i.ToString)
objRango.Select()
objRango.Font.Bold = True
objRango.Font.Italic = True
'' Crear un total general
objHojaExcel.Cells(i, 1) = "Total "
objHojaExcel.Cells(i, 2) = "=count(A3:D" & (i - 1).ToString & ")"
objHojaExcel.Cells(i, 3) = "Total Precio:"
objHojaExcel.Cells(i, 4) = "=sum(A3:D" & (i - 1).ToString & ")"
objHojaExcel = Nothing
objLibroExcel = Nothing
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Ahora podemos ejecutar nuestro programa y obtendremos el siguiente resultado:
Vamos a crear un segundo ejemplo de cmo leer un archivo Excel como base de datos, mediante
OLEDB podemos tratar los archivos Excel como si fueran base datos igualando el archivo como
una base de datos, las hojas (Sheets) como tablas y las columnas como campos y las filas como
registros Ej.
Archivo XLS
= Base de datos
Sheets
= Tablas
Column
= Columnas (para nombrar las columnas toma la primera lnea del archivo)
Cell
= valor de una colunma en un registro
Row
= Registro
En nuestro ejemplo vamos a crear una forma que nos pedir el nombre y la localizacin del
archivo Excel que queremos leer, luego haremos clic en un botn y se desplegara el contenido del
archivo en un grid y agregaremos otro botn para abrir este mismo archivo en EXCEL.
Iniciando, nuestra forma se vera de la siguiente forma:
El botn Leer Archivoleera el archivo Excel y desplegara su contenido en el grid y el botn Abrir
Excelabrira una instancia de Excel con archivo especificado.
cdigo
Primero definiremos una variable tipo EXCEL.Application a nivel del formulario
Dim m_Excel As Excel.Application
Como se puede notar el programa tomo la primera lnea de la hoja Excel como ttulos de las
columnas esto lo hace automtico el Provider.