viernes, 17 de agosto de 2012

VB.NET - Exportar datos de un Datagridview a Excel y XML en N Capas App Windows Forms

Hola amigos, con este pequeño pero útil manual pretendo enseñarles como exportar datos de un listado (en este caso es un Datagridview, pero podría ser un ListView u otro control) a Excel y a XML, además como leer un archivo en formato XML y mostrarlo en un TextBox.

Requisitos de Software:

• SQL Server 2000 o 2005 (Para el ejemplo se utilizara SQL Server 2005).
• Visual Studio 2003 o 2005 (Para el ejemplo se utilizara Visual Studio 2005).
• Microsoft Office 2003 o 2007 (Recomendado Microsoft Office 2007).

Conocimientos previos de:

• Algorítmica (Estructuras condicionales, repetitivas, Procedimientos, Funciones, etc.).
• Lenguaje SQL (DML, DDL, DCL), creación de consultas, procedimientos almacenados, etc.
• Lenguaje Visual Basic 6.0 o Visual Basic.NET 2003 o Visual Basic.NET 2005 o superior.

Una vez cumpliendo con los requisitos, vamos a empezar creando una carpeta llamada Exportar Datos y Creación de Reportes, en la cual almacenara nuestro proyecto de Visual Studio, nuestros Scripts a utilizar y nuestros archivos XML que se crearan posteriormente. Te recomiendo crear esta carpeta o directorio en una unidad raíz, en mi caso en la unidad E, así como en la imagen:
Ahora vamos a iniciar Visual Studio, para eso damos click en el Menú Inicio y luego click en Ejecutar y escribimos lo sgte:
Al dar click en el botón Aceptar se mostrara la ventana de Bienvenida de Visual Studio.

Antes que todo, nuestra aplicación será creada en N Capas. Ahora vamos a crear nuestro proyecto Solución en Blanco (recuerda que un proyecto de solución representa a nuestro administrador de proyectos), para eso dar click en el Menú Archivo y click en el Submenú Nuevo y finalmente click en Proyecto, así como en la imagen:
Al dar click se mostrara una ventana en la cual desplegaras el Nodo Otros tipos de proyectos y dar click al SubNodo Soluciones de Visual Studio y en el panel derecho seleccionar Solución en Blanco. Además deberás dar un nombre a la solución y una ubicación de donde se creara (debe ser dentro de una carpeta), debes tener así como en la imagen:
Al dar click en el botón Aceptar tendrás lo siguiente:
Ahora vamos a crear nuestra Capa de Datos, para eso seleccionamos la Solución, damos click derecho seleccionamos Agregar y finalmente click en Nuevo Proyecto, así como en la imagen:
Al hacer esto se mostrara una ventana en la cual en el panel izquierdo deberás desplegar el Nodo Visual Basic, luego seleccionar Windows y en el panel derecho deberás elegir Biblioteca de Clases, En nombre deberás de poner el nombre del proyecto, en nuestro caso LibNetSqldata y además establecer una ubicación en donde se guardara este proyecto, así como en la imagen:
Al dar clic en el botón Aceptar, se tendrá lo sgte:
Ahora selecciona la clase llamada Class1.cs creada por defecto, dale clic derecho y clic en Eliminar, se mostrara una ventana en la cual te pedirá la confirmación de dicho archivo, dale clic en el botón Aceptar, ahora crearemos una nueva clase, para eso seleccionar la Biblioteca de Clases llamada LibNetSqldata, darle clic derecho y elegir el submenú Agregar y finalmente clic en Nuevo Elemento, así como en la imagen:
Al hacer esto se mostrara la sgte ventana en la cual seleccionaras la plantilla Clase, en Nombre debes poner ClsDatos (este es el nombre de la clase), así como en la imagen:
Al dar clic en el botón Agregar, se tendrá así:
Ahora vamos a crear nuestra Capa Entidad, para eso seleccionamos nuestro proyecto de Solución, damos click derecho seleccionamos Agregar y finalmente click en Nuevo Proyecto, así como en la imagen:
Al hacer esto se mostrara una ventana en la cual en el panel izquierdo deberás desplegar el Nodo Visual Basic, luego seleccionar Windows y en el panel derecho deberás elegir la plantilla Biblioteca de Clases, En nombre deberás de poner el nombre del proyecto, en nuestro caso LibNetBusinessEntity y además establecer una ubicación en donde se guardara este proyecto (déjala por defecto), así como en la imagen:
Al dar clic en el botón Aceptar, se tendrá lo sgte:
Ahora selecciona la clase llamada Class1.cs creada por defecto, dale clic derecho y clic en Eliminar, se mostrara una ventana en la cual te pedirá la confirmación del mismo, dale clic en el botón Aceptar, ahora crearemos una nueva clase, para eso seleccionar la Biblioteca de Clases llamada LibNetBusinessEntity, darle clic derecho y elegir el submenú Agregar y finalmente clic en Nuevo Elemento, así como en la imagen:
Al hacer esto se mostrara la sgte ventana en la cual seleccionaras la plantilla Clase, en Nombre debes poner ClsEntidad (este es el nombre de la clase), así como en la imagen:
Al dar clic en el botón Agregar, se tendrá así:
Ahora vamos a crear nuestra Capa de Negocio, para eso seleccionamos la Solución, damos click derecho seleccionamos Agregar y finalmente click en Nuevo Proyecto, así como en la imagen:
Al hacer esto se mostrara una ventana en la cual en el panel izquierdo deberás desplegar el Nodo Visual Basic, luego seleccionar Windows y en el panel derecho deberás elegir la plantilla Biblioteca de Clases, En nombre deberás de poner el nombre del proyecto, en nuestro caso LibNetBusinessLogic y además establecer una ubicación en donde se guardara este proyecto, así como en la imagen:
Al dar clic en el botón Aceptar, se tendrá lo sgte:
Ahora selecciona la clase llamada Class1.cs creada por defecto, dale clic derecho y clic en Eliminar, se mostrara una ventana de confirmación del mismo, dale clic en el botón Aceptar, ahora crearemos una nueva clase, para eso seleccionar la Biblioteca de Clases llamada LibNetBusinessLogic, darle clic derecho y elegir el submenú Agregar y finalmente clic en Nuevo Elemento, así como en la imagen:
Al hacer esto se mostrara la sgte ventana en la cual seleccionaras la plantilla Clase, en Nombre debes poner ClsNegocio (este es el nombre de la clase), así como en la imagen:
Al dar clic en el botón Agregar, se tendrá así:
Ahora vamos a crear nuestra Capa de Presentación con una Aplicación de Windows, para eso seleccionamos nuestro proyecto de solución, le damos clic derecho, seleccionamos el submenú Agregar y damos clic en Nuevo Proyecto, así como en la imagen:
Al hacer click aparecerá la sgte ventana en la cual en el panel izquierdo tendrás que desplegar el Nodo Visual Basic y elegir Windows, en el panel derecho elegir Aplicación para Windows, Además de poner el nombre del Proyecto y la ubicación así como en la imagen:
Al dar clic en el botón Aceptar se tendrá así:
Ahora debemos de establecer como proyecto de inicio a la Aplicación para Windows, para eso dar clic en la Aplicación para Windows (LibNetCliente) y clic en Establecer como proyecto de inicio, así:
Ahora seleccionamos la Biblioteca de Clases llamada LibNetBusinessEntity le damos clic derecho y finalmente clic en Generar, así como en la imagen:
Ahora seleccionamos la Biblioteca de Clases llamada LibNetSqldata le damos clic derecho y finalmente clic en Agregar Referencia, así como en la imagen:
Al hacer esto aparecerá una ventana en la cual daremos clic en la Pestaña Proyectos y seleccionar de la lista LibNetBusinessEntity, así como en la imagen:
Ahora dar clic en el botón Aceptar, luego seleccionar la Biblioteca de Clases llamada LibNetSqldata, darle clic derecho y clic en Generar, como en la imagen:
Ahora seleccionamos la Biblioteca de Clases llamada LibNetBusinessLogic le damos clic derecho y finalmente clic en Agregar Referencia, así como en la imagen:
Al hacer esto aparecerá una ventana en la cual daremos clic en la Pestaña Proyectos y seleccionar LibNetSqldata y LibNetBusinessEntity, así como en la imagen:
Ahora dar clic en el botón Aceptar, luego seleccionar la Biblioteca de Clases llamada LibNetBusinessLogic, darle clic derecho y clic en Generar, como en la imagen:
Ahora seleccionar la Aplicación para Windows llamada LibNetCliente, le damos clic derecho y finalmente clic en Agregar Referencia, así como en la imagen:
Al hacer esto aparecerá una ventana en la cual daremos clic en la Pestaña Proyectos y seleccionar LibNetBusinessEntity y LibNetBusinessLogic, así como en la imagen:
Ahora dar clic en el botón Aceptar. Seleccionar la Aplicación para Windows llamada LibNetCliente, le damos clic derecho y finalmente clic en Generar, así como en la imagen:
Ahora vamos a seleccionar el formulario creado por defecto en la capa LibNetCliente, le damos click derecho y click en Eliminar, ahora Creamos un nuevo formulario, para esto seleccionamos la capa LibNetCliente, le damos click derecho y click en Windows Forms, así como en la imagen:
Al hacer esto se mostrara la sgte ventana en la cual seleccionaras la plantilla Windows Forms, en Nombre debes poner FrmAplicacion1 (este es el nombre del formulario), así como en la imagen:
Al dar clic en el botón Agregar se tendrá así:
Ahora procederemos a crear nuestro segundo formulario, para esto seleccionamos la capa LibNetCliente, le damos click derecho y click en Windows Forms, así como en la imagen:
Al hacer esto se mostrara la sgte ventana en la cual seleccionaras la plantilla Windows Forms, en Nombre debes poner FrmAplicacion2 (este es el nombre del formulario), así como en la imagen:
Al dar clic en el botón Agregar se tendrá así:
Ahora ir al Explorador de Soluciones y dar doble click a FrmAplicacion1, ahora asignar las sgtes propiedades al formulario:

Propiedades del Formulario:
  • Text; Exportar Datos y Creación de Reportes
  • StartPosition: CenterScreen
  • MaximizeBox: False
  • FormBorderStyle: FixedSingle
  • (Name): FrmAplicacion1
El diseño final deberá quedar así
Ahora vamos a realizar el sgte diseño:
Ahora ir al Explorador de Soluciones y dar doble click a FrmAplicacion2, ahora asignar las sgtes propiedades al formulario:

Propiedades del Formulario:

Text: Visualización de un Archivo XML
StartPosition: CenterScreen
MaximizeBox: False
FormBorderStyle: FixedSingle
(Name): FrmAplicacion2

Ahora realizar el sgte diseño:
Ahora volver al formulario FrmAplicacion1.vb, luego ir al Cuadro de Herramientas e ir a la pestaña Cuadro de Dialogo y elegir el control SaveFileDialog, así como en la imagen:
Luego de ubicar el control, arrástralo al formulario.

Con respecto al control SaveFileDialog dejaremos sus propiedades por defecto.

Antes de empezar a programar, empezaremos por crear nuestros procedimientos almacenados, los cuales utilizaremos en nuestro proyecto, para ello dar click en el Menú Inicio y luego click en Ejecutar y escribir lo sgte:
Al dar click al botón Aceptar, se mostrara la sgte ventana de autenticación, es aquí en donde primeramente especificas el tipo de servidor (En nuestro caso Database Engine), luego especificamos el nombre del servidor (En nuestro caso es el servidor (Local)) y finalmente de qué manera te quieres autenticar al servidor SQL Server, nos conectaremos con la autenticación por defecto (Windows Authentication), así como en la imagen:
Luego dar click al botón Connect, al hacerlo se mostrara la sgte ventana:
Ahora procederemos a crear nuestro Script, es en este Script en la cual escribiremos nuestros procedimientos a crear, para esto damos click al Menú File y seguidamente damos click en el Submenú New y finalmente click en Database Engine Query, así como en la imagen:
Al dar click nos volverá a mostrara la ventana de conexión al servidor SQL Server, así como en la imagen:
Ahora dar click al botón Connect, al hacerlo se creara nuestro Script, así como en la imagen:
Ahora vamos a seleccionar nuestra base de datos Northwind (es con la que vamos a trabajar), para eso desplegar el combo y elegir Northwind, así como en la imagen:
Al hacer esto se elegirá la base de datos Northwind como base de datos actual de trabajo, así como en la imagen:
Ahora procederemos a la creación de los Procedimientos Almacenados (Store Procedure), son los sgtes:

Go
Set Language Spanish
Set StatisTics Time On
Set DateFormat DMY
Go
Use Northwind
Go
-----------------------------------------------------------------------------------------
----------------------------------Primer Procedimiento Almacenado------------------------
If Exists(Select Name From Sys.Objects Where Name='Usp_ListadoOpcion' And Type='P')
Begin
Drop Procedure Usp_ListadoOpcion
End
Go
Create Procedure Usp_ListadoOpcion
@Opt Int
As
If @Opt=0
Begin
Select CustomerID, CompanyName From Customers
End
If @Opt=1
Begin
Select EmployeeID, (FirstName + Space(1) + LastName)As EmployeeName From Employees
End
Go
-----------------------------------------------------------------------------------------
--Ejecutando Nuestro Procedimiento Almacenado
Execute Usp_ListadoOpcion 0
Execute Usp_ListadoOpcion 1
Go
-------------------------------------------------------------------------------------
---------------------------------Segundo Procedimiento Almacenado--------------------
Go
If Exists(Select Name From Sys.Objects Where Name='Usp_ListadoOrdenesXOpcion' And Type='P')
Begin
Drop Procedure Usp_ListadoOrdenesXOpcion
End
Go
Create Procedure Usp_ListadoOrdenesXOpcion
@Opt Int,@Aux Varchar(5)
As
If @Opt=0
Begin
Select o.OrderID, o.OrderDate, o.ShippedDate, Sum(od.UnitPrice*od.Quantity)As Total
From Orders As o Inner Join [Order Details] As od
On o.OrderID=od.OrderID
Inner Join Products As p
On od.ProductID=p.ProductID
Where o.CustomerID=@Aux
Group By o.OrderID, o.OrderDate, o.ShippedDate
Order By o.OrderID Asc
End
If @Opt=1
Begin
Select o.OrderID, o.OrderDate, o.ShippedDate, Sum(od.UnitPrice*od.Quantity)As Total
From Orders As o Inner Join [Order Details] As od
On o.OrderID=od.OrderID
Inner Join Products As p
On od.ProductID=p.ProductID
Where o.EmployeeID=Convert(Int,@Aux)
Group By o.OrderID, o.OrderDate, o.ShippedDate
Order By o.OrderID Asc
End
Go
-------------------------------------------------------------------------------------------
--Ejecutando Nuestro Procedimiento Almacenado
Execute Usp_ListadoOrdenesXOpcion 0,'ALFKI'
Execute Usp_ListadoOrdenesXOpcion 1,1
Go


Ahora vamos a grabar nuestro Script, para damos presionamos las teclas CTRL + S, al hacerlo se mostrara la sgte ventana en la cual indicaremos en donde se almacenara nuestro Script, para eso damos la ruta en donde creamos nuestro proyecto, así como en la imagen:
Ahora damos click en Crear Nueva Carpeta, al hacerlo se mostrara la sgte ventana en la cual pondremos como nombre a nuestra carpeta Script, así como en la imagen:
Al dar click en el botón OK se creara la carpeta, a continuación pondremos como nombre a nuestro Script Procedimientos Almacenados, así como en la imagen:
Al dar click en el botón Save (Grabar) se guardara nuestro Script.

A partir de ahora comenzaremos con la programación en N Capas. Primeramente comenzaremos a programar en la capa LibNetBusinessEntity, es en esta capa en la cual crearemos nuestras propiedades, las cuales podrán ser accedidas por cualquier capa que este referenciada.

Para esto deberemos en nuestra biblioteca de clases llamada LibNetBusinessEntity y dar doble clic a la clase ClsEntidad, teniendo así:
Las propiedades a definir son las sgtes:

Public Class ClsEntidad

Private CustomerID As String
Private EmployeeID, Tipo As Integer

Public Property Codigo_Cliente()
Get
Return CustomerID
End Get
Set(ByVal value)
CustomerID = CStr(value)
End Set
End Property

Public Property Codigo_Empleado()
Get
Return EmployeeID
End Get
Set(ByVal value)
EmployeeID = CInt(value)
End Set
End Property

Public Property Opcion_Tipo()
Get
Return Tipo
End Get
Set(ByVal value)
Tipo = CInt(value)
End Set
End Property

End Class

Como segundo paso comenzaremos a programar en la capa LibNetSqlData, es esta capa la que se encargara de conectarse con la base de datos, también aquí definiremos nuestros métodos cuyo fin será ejecutar tanto sentencias SQL como Procedimientos Almacenados (en nuestro caso serán procedimientos almacenados).

Para esto deberemos en nuestra biblioteca de clases llamada LibNetSqlData y dar doble clic a la clase ClsDatos, teniendo así:
La programación para esta capa es la sgte:

Imports System.Data
Imports System.Data.SqlClient
Public Class ClsDatos

Dim Cn As New SqlConnection

Private Function ConectarSQL() As SqlConnection
Cn.ConnectionString = "Server=(Local);Database=Northwind;Integrated Security=True"
Return Cn
End Function

Public Function ListadoOpcionD(ByVal ObjEnt As LibNetBusinessEntity.ClsEntidad) As DataTable
Dim Da As New SqlDataAdapter("Usp_ListadoOpcion " & ObjEnt.Opcion_Tipo, ConectarSQL())
Dim Dt As New DataTable
Da.Fill(Dt)
Return Dt
End Function

Public Function ListadoOrdenesXOpcionD(ByVal ObjEnt As LibNetBusinessEntity.ClsEntidad) As DataTable
Dim Dt As New DataTable
If ObjEnt.Opcion_Tipo.Equals(0) Then
Dim Da As New SqlDataAdapter("Usp_ListadoOrdenesXOpcion " & ObjEnt.Opcion_Tipo & ",'" & ObjEnt.Codigo_Cliente & "'", ConectarSQL())
Da.Fill(Dt)
End If
If ObjEnt.Opcion_Tipo.Equals(1) Then
Dim Da As New SqlDataAdapter("Usp_ListadoOrdenesXOpcion " & ObjEnt.Opcion_Tipo & "," & ObjEnt.Codigo_Empleado, ConectarSQL())
Da.Fill(Dt)
End If
Return Dt
End Function

End Class

Como tercer paso comenzaremos a programar en la capa LibNetBusinessLogic, es en esta capa en la cual se aplicaran las reglas de negocios, para nuestro caso no hay ninguna. La programación es la sgte:

Imports System.Data
Public Class ClsNegocio

Dim ObjDatos As New LibNetSqlData.ClsDatos

Public Function ListadoOpcionN(ByVal ObjEnt As LibNetBusinessEntity.ClsEntidad) As DataTable
Return ObjDatos.ListadoOpcionD(ObjEnt)
End Function

Public Function ListadoOrdenesXOpcionN(ByVal ObjEnt As LibNetBusinessEntity.ClsEntidad) As DataTable
Return ObjDatos.ListadoOrdenesXOpcionD(ObjEnt)
End Function

End Class

Como cuarto y último paso comenzaremos a programar en la capa LibNetCliente, es esta capa es la interface entre el usuario y el sistema.

Comenzaremos a programar nuestro primer formulario (En nuestro caso FrmAplicacion1), para eso seleccionamos el formulario, le damos click derecho y click en ver código.

Al hacer esto tendremos acceso a la ventana de código, es aquí en donde se va a programar.
Codificaremos lo sgte:

Public Class FrmAplicacion1
Dim ObjEntidad As New LibNetBusinessEntity.ClsEntidad
Dim ObjNegocio As New LibNetBusinessLogic.ClsNegocio
End Class

Ahora volvemos al diseño del formulario, ahora damos doble click al RadioButton Customers, la programación para este control es la sgte:

Private Sub RdbCustomers_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RdbCustomers.CheckedChanged
If RdbCustomers.Checked.Equals(True) Then
Dim Dt As New DataTable
ObjEntidad.Opcion_Tipo = 0
Dt = ObjNegocio.ListadoOpcionN(ObjEntidad)
With Me.CboOpcion
.DataSource = Dt
.DisplayMember = "CompanyName"
.ValueMember = "CustomerID"
End With
RdbEmployees.Checked = False
End If
End Sub

Ahora volvemos al diseño del formulario, ahora damos doble click al RadioButton Employees, la programación para este control es la sgte:

Private Sub RdbEmployees_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RdbEmployees.CheckedChanged
If RdbEmployees.Checked.Equals(True) Then
Dim Dt As New DataTable
ObjEntidad.Opcion_Tipo = 1
Dt = ObjNegocio.ListadoOpcionN(ObjEntidad)
With Me.CboOpcion
.DataSource = Dt
.DisplayMember = "EmployeeName"
.ValueMember = "EmployeeID"
End With
RdbCustomers.Checked = False
End If
End Sub

Ahora volvemos al diseño del formulario, ahora damos doble click al botón OK, al hacerlo se tendrá así:
La programación para este control es la sgte:

Private Sub BtnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click
Dim Dt As New DataTable
If RdbCustomers.Checked.Equals(True) Then
ObjEntidad.Opcion_Tipo = 0
ObjEntidad.Codigo_Cliente = CStr(CboOpcion.SelectedValue.ToString())
Dt = ObjNegocio.ListadoOrdenesXOpcionN(ObjEntidad)
End If
If RdbEmployees.Checked.Equals(True) Then
ObjEntidad.Opcion_Tipo = 1
ObjEntidad.Codigo_Empleado = CInt(CboOpcion.SelectedValue)
Dt = ObjNegocio.ListadoOrdenesXOpcionN(ObjEntidad)
End If
With Me.DtgListadoOrdenes
.DataSource = Dt
End With
Me.LblCantOrdenes.Text = Dt.Compute("Count(OrderID)", "").ToString()
Me.LblMontoTotal.Text = Dt.Compute("Sum(Total)", "").ToString()
End Sub

Ahora vamos a programar el botón Exportar XML, este botón será el encargado de exportar toda la data listada en el DataGridView y almacenarlo en un archivo XML, cuando des click al botón se mostrara una ventana en donde te pedirá en donde almacenar el archivo XML (esto se logra con el control SaveFileDialog).

La programación es la sgte:

Private Sub BtnExpXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExpXML.Click
Dim Dt As New DataTable
With Me.SaveFileDialog1
.Filter = "Archivo XML|*.XML"
.FilterIndex = 1
.InitialDirectory = "C:\"
.Title = "Guardar XML como"
End With
If DtgListadoOrdenes.Rows.Count = 0 Then
MessageBox.Show("No se puede exportar, ya que no hay registros", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
If (Me.SaveFileDialog1.ShowDialog().Equals(DialogResult.OK)) Then
If (Me.SaveFileDialog1.FileName <> "") Then
If RdbCustomers.Checked.Equals(True) Then
ObjEntidad.Opcion_Tipo = 0
ObjEntidad.Codigo_Cliente = CStr(CboOpcion.SelectedValue.ToString())
Dt = ObjNegocio.ListadoOrdenesXOpcionN(ObjEntidad)
End If
If RdbEmployees.Checked.Equals(True) Then
ObjEntidad.Opcion_Tipo = 1
ObjEntidad.Codigo_Empleado = CInt(CboOpcion.SelectedValue)
Dt = ObjNegocio.ListadoOrdenesXOpcionN(ObjEntidad)
End If
Dim Ds As New DataSet
Ds.DataSetName = "Listado_Ordenes"
Ds.Tables.Add(Dt)
Ds.Tables(0).TableName = "Orden"
Ds.WriteXml(Me.SaveFileDialog1.FileName)
End If
End If
End If
End Sub

Ahora vamos a programar el botón Ver XML, este botón será el encargado de llamar al formulario FrmAplicacion2, es este formulario el cual me permitirá visualizar el contenido de un archivo XML almacenado en el equipo. La programación es la sgte:

Private Sub BtnVerXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnVerXML.Click
Dim ObjFrm As New FrmAplicacion3
Me.Hide()
ObjFrm.ShowDialog()
End Sub

Ahora vamos a programar el botón Exportar Excel, para lo cual hay que seguir una serie de pasos que a continuación se tratara de explicar detalladamente.

Para poder exportar datos a Excel necesitamos de una librería DLL, la cual deberemos referenciar para poder realizar dicha acción, para eso realizamos los sgtes pasos: Seleccionar nuestro proyecto de Aplicación (LibNetCliente), luego le damos click derecho y finalmente click en Agregar Referencia.

Luego de dar click se mostrara una ventana en la cual daremos click en la ficha COM, luego de esto nos mostrara un listado de componentes en la cual elegiremos Microsoft Excel 12.0 Object Library, así como en la imagen:

NOTA: En mi caso la versión de mi objeto de librería es la 12.0, esto es debido a que estoy trabajando con Microsoft Office 2007, también mediante esta ventana puedes saber en dónde está almacenado nuestra librería.
Una vez seleccionada la librería dar click en el botón Aceptar.

A lo mejor no notas la diferencia, pero a partir de ahora puedo trabajar con métodos, clases, interfaces, etc. de Excel.

Ahora dar doble click al botón Exportar Excel, se tendrá así:
La programación para este botón es la sgte:

Private Sub BtnExpExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExpExcel.Click


Try
If DtgListadoOrdenes.Rows.Count = 0 Then
MessageBox.Show("No se puede exportar, ya que no hay registros", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
With Me.SaveFileDialog1
.Reset()
.Filter = "Libro de Excel 2007|*.xlsx|Libro de Excel 2003|*.xls"
.FilterIndex = 1
.InitialDirectory = "C:\"
.Title = "Guardar Libro de Excel como"
End With

If Me.SaveFileDialog1.ShowDialog.Equals(DialogResult.OK) Then

'********Vector el cual alamacenara los procesos de excel que estan*******
'*******ejecutandose hasta el momento*************************************
Dim ListaAntes() As Integer
ListaAntes = ListarProcesosExcelAntes()

'****AQUI EMPIEZA EL CODIGO PARA EXPORTAR LOS DATOS DEL DATAGRIDVIEW A EXCEL****
'Aqui declaro una variable de tipo String en la cual almaceno un valor vacio
Dim Opcion As String = String.Empty
'Aqui me declaro una objeto que representa a mi aplicacion de excel
Dim MiExcel As New Microsoft.Office.Interop.Excel.Application

'********Vector el cual alamacenara los procesos de excel que estan *********
'ejecutandose hasta el momento incluyendo al que se hara lectura respectiva**
Dim ListaDespues() As Integer
ListaDespues = ListarProcesosExcelDespues()

'Obtener PID del excel actual (al cual se hace lectura)
Dim PID As Integer = ObtenerIDProcesoActual(ListaAntes, ListaDespues)

'Aqui me declaro una objeto que representa a mi libro de excel
Dim MiLibro As Microsoft.Office.Interop.Excel.Workbook
'Aqui me declaro una objeto que representa a mi hoja de calculo de excel
Dim MiHoja As Microsoft.Office.Interop.Excel.Worksheet
'Aqui agrego un libro a mi variable MiLibro
MiLibro = MiExcel.Workbooks.Add()
'Aqui agrego una hoja a mi variable MiHoja
MiHoja = MiLibro.Worksheets.Add()
'Estableciendo el nombre a la hoja de calculo, en este caso Ordenes
MiHoja.Name = "Ordenes"
If RdbCustomers.Checked = True Then
Opcion = "Cliente"
End If
If RdbEmployees.Checked = True Then
Opcion = "Empleado"
End If

'---Estableciendo formato al titulo---'
'Hoja de calculo que se mostrara por defecto, en mi caso la hoja llamada Ordenes
MiHoja.Activate()
'Combinando rango de celdas B2:G2, para el titulo
MiHoja.Range("B2", "G2").MergeCells = True
'Estableciendo un tamaño de letra 14 al contenido de la celda B2
MiHoja.Range("B2").Font.Size = 14
'Estableciendo negrita al contenido de la celda B2
MiHoja.Range("B2").Font.Bold = True
'Estableciendo el titulo que aparecera en la celda B2
MiHoja.Range("B2").Value = "Listado de Ordenes del " & Opcion & ": " & Me.CboOpcion.Text
'Estableciendo la alineacion centrado al contenido de la celda B2
MiHoja.Range("B2").HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter
'Estableciendo el color de letra verde al contenido de la celda B2
MiHoja.Range("B2").Font.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbGreen

'Definiendo la primera columna
MiHoja.Range("C3").Value = "OrderID"
'Definiendo la segunda columna
MiHoja.Range("D3").Value = "OrderDate"
'Definiendo la tercera columna
MiHoja.Range("E3").Value = "ShippedDate"
'Definiendo la cuarta columna
MiHoja.Range("F3").Value = "Total"

'Aqui defino el color de relleno celeste para el rango de celdas C3 hasta F3
MiHoja.Range("C3:F3").Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbSkyBlue
MiHoja.Range("C3:F3").Font.Bold = True
MiHoja.Range("C3:F3").HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter
MiHoja.Range("C3:F3").Font.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbWhite
MiHoja.Range("C3:F3").Font.Size = 12

Dim IndiceFinal As Integer = 0
Dim i As Integer = 4
For Each oRow As DataGridViewRow In Me.DtgListadoOrdenes.Rows
MiHoja.Range("C" & i).Value = oRow.Cells(0).Value
MiHoja.Range("D" & i).Value = oRow.Cells(1).Value
MiHoja.Range("E" & i).Value = oRow.Cells(2).Value
MiHoja.Range("F" & i).Value = String.Format("{0:c}", oRow.Cells(3).Value)
i = i + 1
IndiceFinal = i
Next

'Aqui establezco el borde al rango de celda especificado
 MiHoja.Range("C3:F" & IndiceFinal - 1).Borders.Value = 12
MiHoja.Range("C4:F" & IndiceFinal - 1).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter

'Ajustando el ancho de la celda al contenido
MiHoja.Columns.AutoFit()

'Guardando mi libro de Excel con la ruta y nombre que se asigno en la ventana 'SaveFileDialog
MiLibro.SaveAs(Me.SaveFileDialog1.FileName)
'**
'Muestro la ventana de excel maximizada
'MiExcel.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized
'Muestro la ventana de Excel con los datos exportados
'MiExcel.Visible = True
'**

'Liberando Recursos
MiExcel = Nothing
MiLibro = Nothing
MiHoja = Nothing

'Eliminando el proceso del excel actual mediante su respectivo PID
Process.GetProcessById(PID).Kill()

MessageBox.Show("Datos exportados a Excel correctamente", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
Catch ex As Exception
End Try
End Sub

Ahora vamos a programar el botón Salir, este botón será el encargado de cerrar el formulario haciendo una pregunta de confirmación. La programación es la sgte:

Private Sub BtnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSalir.Click
Dim i As Integer
i = MessageBox.Show("Estas seguro de Salir???", "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If i.Equals(6) Then
Me.Close()
End If
End Sub

Ahora continuaremos por programar nuestro último formulario, para esto ir a la ventana Explorador de Soluciones y dar doble click al formulario FrmAplicacion2, al hacerlo tendrás así:
Una vez hecho esto vamos a insertar un control llamado OpenFileDialog, este control me permite abrir una ventana en la cual puedo abrir un archivo, este control es necesario ya que al dar click al botón Examinar deberé cargar un archivo XML.

Este control lo ubicas en el Cuadro de Herramientas, luego en la pestaña Cuadros de Dialogo, así como en la imagen:
Una vez ubicado el control, lo único que haces es arrastrarlo al formulario, al hacerlo se tendrá así:
Ahora comenzaremos a programar el botón Limpiar, para eso solo debes darle doble click, la programación es la sgte:

Private Sub BtnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnLimpiar.Click
Me.TxtRuta.Clear()
Me.TxtXML.Clear()
Me.BtnExaminar.Focus()
End Sub

Ahora volver al diseño del formulario y dar doble click al botón Volver, la codificación es la sgte:

Private Sub BtnVolver_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnVolver.Click
Dim ObjForm As New FrmAplicacion1
Me.Hide()
ObjForm.ShowDialog()
End Sub

Ahora volver al diseño del formulario y dar doble click al botón Examinar, la codificación es la sgte:

Private Sub BtnExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExaminar.Click
Me.TxtXML.Clear()
With Me.OpenFileDialog1
.InitialDirectory = "C:\"
.Filter = "Archivo XML|*.XML"
.FilterIndex = 1
.Title = "Abrir XML como"
End With
If Me.OpenFileDialog1.ShowDialog().Equals(DialogResult.OK) Then
Dim Ruta As String
Ruta = Me.OpenFileDialog1.FileName.ToLower
Me.TxtRuta.Text = Ruta
Me.TxtXML.Text = System.IO.File.ReadAllText(Ruta)
End If
End Sub

Con esto terminamos de programar todos nuestros formularios

Funcionamiento del Programa

Ahora procederemos a ejecutar nuestro proyecto, pero para eso deberemos especificar que el formulario a ejecutarse inicialmente sea el formulario FrmAplicacion1, para eso ir a la ventana Explorador de soluciones y dar doble click en My Project, así como en la imagen:
Al hacer doble click nos mostrara un conjunto de pestañas en la cual elegiremos Aplicación, luego en Formulario de Inicio deberás de elegir FrmAplicacion1, así como en la imagen:
Una vez hecho esto deberás ubicarte en la Barra de Herramientas llamada Depurar y deberás dar click en la flechita verde, o si prefieres presiona la tecla F5, cualquiera de las dos.
Una vez que das click en la flecha o presionando la tecla F5, se mostrara el formulario, algo así:
Ahora vamos a seleccionar un cliente, para esto seleccionamos la opción Customers y elegimos al cliente Hungry Coyote Import Store y damos click al botón OK, así como en la imagen:
A la hora que des click al botón se mostraran las órdenes de ese cliente, además nos saldrá las cantidad de ordenes que tiene y finalmente su Monto Total, así como en la imagen:
A continuación vamos a exportar todos los datos a XML, para eso dar click al botón Exportar XML, al hacer click aparecerá la sgte ventana, así como en la imagen:
Ahora deberás de buscar la carpeta en donde se creó el proyecto (E:\Exportar Datos y Creacion de Reportes), así como en la imagen:
Ahora dar click en el botón Create New Folder (Crear nueva carpeta), así como en la imagen:
Luego de crear la carpeta ponerle como nombre XML, deberá quedar así:
Luego de crear la carpeta darle doble click y poner como nombre de archivo HUNGC, así como en la imagen:
Luego de asignar el nombre a mi archivo XML procederemos a guardarlo, para eso darle click al botón Save, al hacerlo se creara el archivo XML.
Ahora procederemos a ver nuestro archivo XML creado, para eso dar click al botón Ver XML, al hacerlo se mostrara el sgte formulario:
Ahora para buscar el archivo XML a visualizar deberás dar click al botón Examinar, al hacer click se mostrara la sgte ventana:
Ahora deberás de buscar el archivo XML, teniendo así:
Una vez que lo encuentras darle doble click, al hacerlo se mostrara el contenido del archivo XML, algo así:
Bueno si quieres limpiar todo el contenido solo debes dar click al botón Limpiar, teniendo algo así:
Bueno dar click al botón Volver, para regresar al formulario principal, teniendo así:
Bueno vuelvo a elegir al cliente Hungry Coyote Import Store y dar click al botón OK, se listaran las órdenes del cliente elegido, algo así:
Ahora vamos a exportar todo este listado a una hoja de Excel, para eso dar click al botón Exportar Excel, al hacer click se mostrara la sgte ventana:
Ahora buscar la ruta en donde se encuentra nuestro proyecto, deberás tener así como en la imagen:
Ahora procederemos a crear una carpeta en la cual almacenaremos el archivo de Excel a crear, para eso dar click en el botón Create New Folder, así como en la imagen:
Al hacer click al botón se creara la carpeta, luego asignarle por nombre EXCEL, así como en la imagen:
Ahora dar doble click a esta carpeta y guardar nuestro archivo de Excel como HUNGC, así como en la imagen:
Una vez asignado el nombre dar click al botón Save, al dar click se guardara el archivo de Excel con todas las órdenes del cliente elegido, una vez que termino la exportación nos mostrara un mensaje indicando que la exportación ha Excel se ha realizado correctamente, así como en la imagen:
Bueno dar click al botón OK, ahora si quieres verificar que el archivo se creo dirígete a la carpeta Excel y allí encontraras el archivo, así como en la imagen:
Ahora dar doble click al archivo de Excel, se mostrara así:
Ahora dar click al botón OK, bueno y finalmente vamos a cerrar nuestro formulario, para eso dar click al botón Salir, así como en la imagen:
Al dar click al botón se mostrara un mensaje de confirmación de que si estás seguro de cerrar el formulario o no, en nuestro caso elegiremos que si, así como en la imagen:
Si das click en el botón Yes se cerrara el formulario, con este último paso concluimos este manual.

El proyecto originalmente fue desarrollado en VB2005, el proyecto a descargar fue migrado a VB2008.

Puedes descargar el Proyecto desde el sgte link:

2 comentarios:

  1. Fijate que tengo un problema con la exportacion a Excel...... y es el tiempo de exportacion... se tarda aproximadamente un minuto por 1,000 datos.... y yo debo exportar hasta mas de 60,000 datos... No sabes alguna otra forma de exportar directamente???

    ResponderEliminar
    Respuestas
    1. si todavia tienes ese problema tengo la solucion mi correo markho34 en hotmail

      Eliminar