Basic .NET y Excel Ejemplo
Basic .NET y Excel Ejemplo
Basic .NET y Excel Ejemplo
l. Desde Visual Basic .NET vamos a crear y llenar una hoja de Excel. Proyecto Crearemos un proyecto Visual Basic de tipo Windows Application, y lo llamaremos: WinAppExcelAutomation. Formulario Aparece un formulario, Form1, que renombr a frmExcelAutomation. Tambin le cambi el nombre del archivo, de Form1.vb a frmExcelAutomation.vb. Le puse la propiedad Text: Excel Automation.
Le adicion un DataGrid, que nombr dgDatos, y un botn, con nombre: btnAlmacenarExcel, y texto: Almacenar Excel. (Tambin recomendara especificar las propiedades Anchor apropiadas, para que al cambiar el tamao del formulario, los controles se ajusten).
Acceso a Datos
DataAdapter
Para llenar la hoja de Excel, vamos a leer datos de la tabla Customers en la base de datos Northwind que viene de demostracin en SQL Server. Usaremos un DataAdapter para accesar la base de datos y llenar un DataSet, que es un rea en memoria en donde almacenaremos temporalmente los datos.
En el Toolbox, bajo el encabezado de Data, arrastraremos un control SqlDataAdapter y lo dejamos caer sobre el formulario. Aparece un Wizard de Data Adapter Configuration:
Pasamos a la siguiente pantalla con Next >; y escogemos una conexin a Northwind. En caso de que no exista una conexin a Northwind, la creamos oprimiendo el botn New Connection.
Luego, escogeremos accesar los datos con enunciados SQL (versus con Procedimientos Almacenados):
Y establecemos la sentencia SQL Server (puede utilizar el botn Query Builder para crear la sentencia SQL en forma grfica)
El DataSet es un rea en memoria en donde almacenamos los datos con que vamos a trabajar.
Sobre el control daCustomers le damos botn derecho y pedimos laopcin Generate Dataset Le decimos que queremos un nuevo Dataset oprimiendo sobre: New y le damos el nombre: dsCustomers Revisamos que la caja Add this dataset to the designer est marcada:
Escribiremos cdigo para que al momento de cargar el formulario tambin cargue los datos. Damos doble click sobre alguna parte del formulario, lo que nos lleva a ver el cdigo de la pgina. Escribimos lo siguiente, para que el DataAdapter daCustomers llene el DataSet dsCustomers con los datos de los clientes:
Private Sub frmExcelAutomation_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load
Me.daCustomers.Fill(Me.DsCustomers.Customers)
End Sub
End Class
El DataGrid mostrar los datos que hemos almacenado en el DataSet. Establecemos las propiedades del DataGrid:
Probarlo
Dar Debug Start u oprimir el botn de Start (una flecha azul hacia la derecha). Si tiene errores, corregirlo.
En mi caso, dio el siguiente error debido a que renombr el formulario de Form1 a frmExcelAutomation: Sub Main was not found in WinAppExcelAutomation.Form1. Para corregir este error, d doble click sobre el mensaje de error y cuando aparezca una ventana Startup Object escoja el formulario de inicio correcto en nuestro caso: frmExcelAutomation.
Referencia a Excel
Para poder accesar el modelo de objetos de Excel, tenemos que adicionar una a Excel.
En la ventana Solution Explorer, posicionmonos sobre References y con click derecho pedimos la opcin Add Reference Aparece la caja de dilogo: Add Reference
Resulta que Excel todava es tecnologa COM (la tecnologa previa a .NET), por lo que nos vamos al tabulado COM. Buscamos Microsoft Excel 11.0 Object Library (yo tengo instalado Office 2003, cuyo Excel es la versin 11). Oprimimos Select para escogerlo y luego OK para aceptarlo.
Private Sub btnAlmacenarExcel_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnAlmacenarExcel.Click
Dim oExcel As Excel.ApplicationClass Dim oBooks As Excel.Workbooks Dim oBook As Excel.WorkbookClass Dim oSheet As Excel.Worksheet
' Inicia Excel y abre el workbook oExcel = CreateObject("Excel.Application") oExcel.Visible = True oBooks = oExcel.Workbooks oBook = oExcel.Workbooks.Add oSheet = oBook.Sheets(1)
' Encabezado oSheet.Cells(ROW_FIRST, 1) = "ID" oSheet.Cells(ROW_FIRST, 2) = "Compaa" oSheet.Cells(ROW_FIRST, 3) = "Contacto" oSheet.Cells(ROW_FIRST, 4) = "Pas"
' Loop que almacena los datos Dim rowCustomer As dsCustomers.CustomersRow For Each rowCustomer In Me.DsCustomers.Customers Dim iCurrRow As Int64 = ROW_FIRST + iRow oSheet.Cells(iCurrRow, 1) = rowCustomer.CustomerID oSheet.Cells(iCurrRow, 2) = rowCustomer.CompanyName oSheet.Cells(iCurrRow, 3) = rowCustomer.ContactName oSheet.Cells(iCurrRow, 4) = rowCustomer.Country
iRow += 1 Next
' Frmula oSheet.Cells(ROW_FIRST + iRow + 1, 1) = _ "=counta(R" & (ROW_FIRST + 1) & "C1:R" & _ (ROW_FIRST + iRow - 1).ToString & "C1)"
End Sub
Para iniciar debemos de agregar la referencia Microsoft.Office.Interop.Excel al proyecto, 11 para office 97-2003 y 12 para 2007. view source print? 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e AsSystem 1 .EventArgs) Handles Button1.Click 0 2 Dim exApp As New Microsoft.Office.Interop.Excel.Application 'declaramos lo que sera nuestra aplicacion de excel
03 Dim exLibro As Microsoft.Office.Interop.Excel.Workbook 'nuestro libro 04 Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet 'y nuestra hoja 05 06 Try 07 exApp.Visible = False ' esto nos sirve para que la aplicacin(excel) no sea visible al trabajar en ella exApp.Workbooks.Add() 'Aadimos el Libro al programa, y la hoja al 08 libro exApp.Workbooks.Add.SaveAs("C:\nuevacarpeta\prueba.xls", 09 , "", "", False,False) ' creamos nuestro archivo con el nombre que le querramos dar y en el directorio que lo querramos guardar exApp.Workbooks.Close() 'cerramos nuestro archivo para poder trabajar 10 con l 'en mi caso necesito crear varios archivos excel con cierto nombre asi que verifico antes de aadir informacion 12 'Si el archivo existe, si es asi, abro el archivo y le agrego la hoja 11
con la que deseo trabajar, en caso contario 13 'creo el archivo de la forma anterior 14 If File.Exists("C:\nuevacarpeta\prueba.xls") Then 15 exLibro = exApp.Workbooks.Open("C:\nuevacarpeta\prueba.xls") 16 exHoja = exLibro.Sheets(1) 'aqui aadimos la hoja al archivo 'recorremos la primera fila, y las columnas que querramos para ponerles el titulo 18 exHoja = exLibro.Worksheets.Add() 17 19 exHoja.Cells.Item(1, 1) = "Tipo Cuenta" 20 exHoja.Cells.Item(1, 2) = "Cuenta" 21 exHoja.Cells.Item(1, 3) = "Importe" 22 exHoja.Cells.Item(1, 4) = "Nombre/Razn social" 23 exHoja.Cells.Item(1, 5) = "Referencia Numerica" 24 exHoja.Cells.Item(1, 6) = "Referencia Alfanumerica" 'Titulo en negrita, Alineado al centro y que el tamao de la columna se ajuste al texto 26 exHoja.Rows.Item(1).Font.Bold = 1 25 27 exHoja.Rows.Item(1).HorizontalAlignment = 3 28 exHoja.Columns.AutoFit() exLibro.Save() ' esto es muy importante para que no nos aparesca el cuadro de dialogo que nos dice si 30 'queremos guardar cambios 29 31 End If ' hasta ahora solo hemos creado el archivo y le agregamos los titulos 32 de las columnas, ahora le aadiremos 33 ' la informacion que necesitemos 34 Dim intultimafila As Integer 35 Dim auxrefe As Integer 'con la siquiente linea sabemos cual es la ultima fila que contiene 36 datos intultimafila = exLibro.ActiveSheet.UsedRange.Row - 1 + exLibro.ActiveSheet.UsedRange.Rows.Count 38 auxrefe = intultimafila 37 39 'le aadimos uno para escribir en la fila vacia siguiente 40 intultimafila += 1 41 exHoja.Cells.NumberFormat = "@" 'con el numberformat le damos formato a las celdas, el @ sirve para que sean tipo texto ' y las numericas con #, y existen muchos ms pero eso se los dejo de 42 tarea =) 43 'ahora recorremos el libro, con la hoja que querramos trabajar, en este caso la hoja que le aadimos 'y con las siguientes lineas nos posicionamos en la fila vacia seguida por el numero de celda
44 With exLibro 45
46 ' y agregamos los datos que deseamos guardar 47 exHoja.Cells(intultimafila, 1).Value = dato1 48 exHoja.Cells(intultimafila, 2).Value = dato2 49 exHoja.Cells(intultimafila, 3).Value = dato3 50 exHoja.Cells(intultimafila, 4).Value = dato4 51 End With ' despues de recorrer nuestro libro y ya agregamos lo que deseamos, 52 guardamos y cerramos. 53 exLibro.Save() 54 exLibro.Close() 55 Catch ex As Exception 56 MsgBox(ex.Message, MsgBoxStyle.Critical, "Error al exportar a Excel") 57 End Try ' la siguiente linea nos sirve para eliminar archivos que hayan sido 58 creados y que ya no nos serviran,omitiendo 59 6 0 61 ' tambien el mensaje del cuadro de dialogo, si estamos seguros de mandarlo a la papelera My.Computer.FileSystem.DeleteFile("C:\recibedispersion\banamex\prueba. xls", FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)
' si ya no trabajaremos con archivos de excel, cerramos la aplicacion, y dejamos sin basura a nuestras instancias. 62 exApp.Quit() 63 exHoja = Nothing 64 exLibro = Nothing 65 exApp = Nothing 66 67 End Sub
Para el ejemplo colocar en un Form los siguientes controles: Un TextBox : llamado txtRange ( Para indicar el rango a cargar en la grilla) Un DataGridView Un control Button
Cdigo fuente
Texto planoImprimir 1. Option Explicit On 2. Option Strict On 3. 4. Public Class Form1 5. Private Sub Form1_Load( _ 6. ByVal sender As System.Object, _ 7. ByVal e As System.EventArgs) Handles MyBase.Load 8. 9. Button1.Text = "Cargar" 10. txtRange.Text = "A1:C15" 11. 12. End Sub 13. 14. Private Sub Button1_Click( _
ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' // Pasar valores para Leer el rango loadRange("c:\book1.xls", "sheet1", txtRange.Text, DataGridView1) End Sub
' --------------------------------------------------------------------------------24. ' // Subrutina para conectar al libro Excel y obtener el rango de datos 25. ' --------------------------------------------------------------------------------26. Private Sub loadRange( _ 27. ByVal sFileName As String, _ 28. ByVal sSheetName As String, _ 29. ByVal sRange As String, _ 30. ByVal dv As DataGridView) 31. 32. Try 33. ' // Comprobar que el archivo Excel existe 34. If System.IO.File.Exists(sFileName) Then 35. 36. Dim objDataSet As System.Data.DataSet 37. Dim objDataAdapter As System.Data.OleDb.OleDbDataAdapter 38. ' // Declarar la Cadena de conexin 39. Dim sCs As String = "provider=Microsoft.Jet.OLEDB.4.0; " & "data source=" & sFileName & "; Extended Properties=Excel 8.0;" 40. Dim objOleConnection As System.Data.OleDb.OleDbConnection 41. objOleConnection = New System.Data.OleDb.OleDbConnection(sC s) 42. 43. ' // Declarar la consulta SQL que indica el libro y el rang o de la hoja 44. Dim sSql As String = "select * from " & "[" & sSheetName & "$" & sRange & "]" 45. ' // Obtener los datos 46. objDataAdapter = New System.Data.OleDb.OleDbDataAdapter(sSq l, objOleConnection) 47. 48. ' // Crear DataSet y llenarlo 49. objDataSet = New System.Data.DataSet 50. 51. objDataAdapter.Fill(objDataSet) 52. ' // Cerrar la conexin 53. objOleConnection.Close() 54. 55. ' // Enlazar DataGrid al Dataset 56. With dv 57. .DataSource = objDataSet 58. .DataMember = objDataSet.Tables(0).TableName 59. End With 60. Else 61. MsgBox("No se ha encontrado el archivo: " & sFileName, MsgB oxStyle.Exclamation) 62. End If 63. 64. Exit Sub 65. Catch ex As Exception 66. MsgBox(ex.Message, MsgBoxStyle.Critical)
67. End Try 68. 69. End Sub 70. End Class
m_Excel = CreateObject("Excel.Application") m_Excel.Workbooks.Open(strRutaExcel) m_Excel.Visible = False 'Dejamos el libro oculto 'Mostramos el valor de la celda 1,1 del primer libre MsgBox(m_Excel.Worksheets("Hoja1").Cells(1, 1).Value) 'Escribir en una celda m_Excel.Worksheets("Hoja1").cells(3, 3).value = "prueba" 'Guardamos los cambios del libro activo m_Excel.Application.ActiveWorkbook.Save() 'Nota: Hay una instruccion como esta: m_Excel.Application.ActiveWorkbook.SaveAs 'Eliminamos la instancia de Excel de memoria If Not m_Excel Is Nothing Then m_Excel.Quit() m_Excel = Nothing End If
Espero que os sea til. Hoy da Excel est muy extendido y bastante a menudo tengo que recurrir cdigos como este para poder conectar Microsoft Excel con algn programa de Visual Basic.