Anda di halaman 1dari 13

Este es un ejemplo de automatizacin controlar un programa desde otro usando Visual Basic .NET y Excel.

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)

Dar Next >; y luego Finish para terminar.

Renombr el Data Adapter SqlDataAdapter1 a daCustomers, y la conexin SqlConnection1 a cnnNorthwind. DataSet

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:

y una vez creado, lo renombr a: dsCustomers:

Cdigo Acceso a Datos

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:

Public Class frmExcelAutomation Inherits System.Windows.Forms.Form

(Windows Form Designer generated code)

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

Binding del DataGrid al DataSet

El DataGrid mostrar los datos que hemos almacenado en el DataSet. Establecemos las propiedades del DataGrid:

DataSource dsCustomers DataMember Customers

Probarlo

Vamos a revisar que el sistema cargue los datos en el Grid

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.

El formulario debe aparecer con los datos de la tabla Customers (Clientes):

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.

Cdigo que Instancia Excel y lo manipula

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)

'oBook = oBooks.Open( _ ' "C:\DevCare\DevCareExcelAutomation\Data.xls")

Const ROW_FIRST = 3 Dim iRow As Int64 = 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"

oSheet.Cells(ROW_FIRST, 1).font.bold = True oSheet.Cells(ROW_FIRST, 2).font.bold = True

oSheet.Cells(ROW_FIRST, 3).font.bold = True oSheet.Cells(ROW_FIRST, 4).font.bold = True

oSheet.Columns(1).ColumnWidth = 10 oSheet.Columns(2).ColumnWidth = 40 oSheet.Columns(3).ColumnWidth = 30 oSheet.Columns(4).ColumnWidth = 15

' 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)"

'' Cierra todo 'oBook.Close(True) 'System.Runtime.InteropServices.Marshal. _ ' ReleaseComObject(oBook) 'oBook = Nothing

'System.Runtime.InteropServices.Marshal. _ ' ReleaseComObject(oBooks) 'oBooks = Nothing

'oExcel.Quit() 'System.Runtime.InteropServices.Marshal. _ ' ReleaseComObject(oExcel) 'oExcel = Nothing

End Sub

Como trabajar con un archivo de Excel desde VB.NET


En estos das me la pase mordindome las uas por no tener ni la mnima idea de cmo crear archivos Excel, verificar si existen , eliminarlos, todo con tan solo hacer un click en un botn desde una aplicacin de visual basic .net, as que les comparto puntos bsicos de cmo hacerlo.

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

Simple ejemplo para cargar un rango de una hoja de Excel en un DataGridView


El siguiente es un simple cdigo fuente para poder conectarse a una hoja de un libro, leer un rango de datos y mostrarlos o cargarlos en un control de tipo DataGridView.

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( _

15. 16. 17. 18. 19. 20. 21. 22. 23.

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

Nota. Ejemplo probado con Excel 2000 y Visual basic

Excel y Visual Basic .Net


Muchas veces resulta til acceder a datos de Excel desde una aplicacin Visual Basic, ya sea para leer datos o para exportar informacin que ha sido procesada por el programa. Hacerlo es muy sencillo: basta con agregar la referencia de Excel y escribir un sencillo cdigo. Lo primero es agregar la referencia a Microsoft Excel. Para ello hay que ir a las propiedades del proyecto, pinchar en referencias, agregar, buscar las de tipo COM y seleccionar de la lista Microsoft Excel 11.0 Object Library. Ahora, con este sencillo cdigo tendremos acceso a Excel: Dim m_Excel As Microsoft.Office.Interop.Excel.Application Dim strRutaExcel As String strRutaExcel = "C:\libro.xls"

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.

Anda mungkin juga menyukai