Últimamente he visto que muchos programadores recurren a foros de Internet en busca de una función o clase que les permita exportar tablas de SQL a Excel porque necesitan realizar un trabajo que les ha pedido algún cliente o simplemente por tener en cuenta como se realiza una función de este tipo.
En mi caso, un cliente me pidió que le modifique el programa con el que realiza la facturación "echo con Visual Studio 2008" para que pueda exportar los datos de clientes o de facturación de su empresa, ya que sería muy cómodo para el poder trabajar en Excel con cierto datos.
Para complicar mi tarea, este me pide específicamente que le permita elegir los campos de las tablas para poder exportar solo los que le interese según la situación.
Debido a todo esto, he realizado una clase que nos permite obtener de forma dinámica los campos indicados en la Instrucción SELECT de SQL donde además podemos indicar el nombre de la carpeta donde se guardará el archivo Excel exportado desde SQL, el nombre del archivo y la cadena de conexión al servidor SQL.
Primer paso
Comenzamos creando un nuevo proyecto de Clase e indicamos la siguiente importación:
Imports System.Data.SqlClient
Public Class ExportarExcel
Public Shared Function ExportarSQLExcel(ByVal Coneccion As String, ByVal Instruccion As String, ByVal Ruta As String, ByVal NombreArchivo As String)
'Proceso de conección e instruccion SELECT * FROM
Dim conn As New SqlConnection(Coneccion)
Dim MiDataSet As New DataSet
Dim Columnas, Filas As Integer
Dim Adaptador As New
SqlDataAdapter(Instruccion, conn)
SqlDataAdapter(Instruccion, conn)
Try
'=============================Proceso de carga del dataset===================
MiDataSet.Reset()
Adaptador.Fill(MiDataSet)
If MiDataSet.Tables.Count < 0 Or MiDataSet.Tables(0).Rows.Count <= 0 Then
Return Nothing
End If
Catch ex As Exception
MsgBox("Error en DataSet :" & ex.Message)
End Try
'===================================Fin del proceso===========================
'=======================Aquí comprueba si Excel está instalado en el PC================
Dim Excel As Object = CreateObject("Excel.Application")
If Excel Is Nothing Then
MsgBox("Al parecer Excel no est
instalado en su PC. El funcionamiento de este proceso exige tener MS Excel instalado en su PC.", MsgBoxStyle.Critical)
Return Nothing
Exit Function
End If
'======================================================================
'===============================Aquí comienza el proceso de Exportación a Excel========
Try
With
Excel
Excel
.SheetsInNewWorkbook = 1
.Workbooks.Add()
.Worksheets(1).Select()
Dim i As Integer = 1
For Columnas = 0
To
MiDataSet.Tables(0).Columns.Count - 1
To
MiDataSet.Tables(0).Columns.Count - 1
.cells(1, i).value = MiDataSet.Tables(0).Columns(Columnas).ColumnName
.cells(1, i).EntireRow.Font.Bold = True
i += 1
Next
i = 2
Dim k As Integer = 1
For Columnas = 0
To
MiDataSet.Tables(0).Columns.Count - 1
To
MiDataSet.Tables(0).Columns.Count - 1
i = 2
For Filas = 0 To
MiDataSet.Tables(0).Rows.Count - 1
MiDataSet.Tables(0).Rows.Count - 1
.Cells(i, k).Value =
MiDataSet.Tables(0).Rows(Filas).ItemArray(Columnas)
MiDataSet.Tables(0).Rows(Filas).ItemArray(Columnas)
i += 1
Next
k += 1
Next
'===================Aquí es donde guarda el archivo en la ruta especificada=================
.ActiveCell.Worksheet.SaveAs(Ruta & NombreArchivo & ".xls")
End With
System.Runtime.InteropServices.Marshal.ReleaseComObject(Excel)
Excel = Nothing
'=============================================================================
Catch ex
As Exception
As Exception
MsgBox("Error :" & ex.Message, MsgBoxStyle.Critical, "Error de proceso")
Return Nothing
Exit Function
End Try
' El archivo excel se crea y se abre para insertar los valores.
Dim Proceso()
As Process = System.Diagnostics.Process.GetProcessesByName("EXCEL")
As Process = System.Diagnostics.Process.GetProcessesByName("EXCEL")
For Each Pro As Process In Proceso
Pro.Kill()
'Advertimos que el trabajo de exportación se ha realizado exitosamente
MsgBox("Los datos han sido exportados correctamente a la carpeta :" & Ruta & "", MsgBoxStyle.Information)
Next
Return
Excel
Excel
End Function
End Class
Segundo paso
Para comprobar esta clase, he preparado un proyecto trabajando con un control BackgroundWorker para poder realizar el proceso en segundo plano y evitar que se cuelgue el formulario y afecte al programa de facturación, también explico paso a paso como funciona el control BackgroundWorker.
Public Class
Form1
Form1
'Indicamos la cadena de conección, en este caso me estoy conectando a través de la red
Dim Coneccion
As String = "Address=192.168.1.2,1433;Network=DBMSSOCN;DATABASE=Gestion;UID=jorge;PWD=123456"
As String = "Address=192.168.1.2,1433;Network=DBMSSOCN;DATABASE=Gestion;UID=jorge;PWD=123456"
'Indicamos la ruta donde se guardara el archivo, en este caso es el escritorio.
Dim Ruta
As String = "C:\Documents and Settings\alejandrobravo\Escritorio\"
As String = "C:\Documents and Settings\alejandrobravo\Escritorio\"
'Indicamos el nombre del archivo sin la extensión, ya que está indicada en la Clase
'en este caso el archivo tendrá este nombre: 28-10-2008_18-21-31.xls
Dim Archivo As String = Format(Now(), "dd-MM-yyyy_hh-mm-ss")
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Deshabilitamos el botón por posibles equivocaciones
Me.Button1.Enabled = False
'Iniciamos el proceso de exportación de la tabla a Excel
Me.BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub
BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As
System.ComponentModel.DoWorkEventArgs) Handles
BackgroundWorker1.DoWork
BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As
System.ComponentModel.DoWorkEventArgs) Handles
BackgroundWorker1.DoWork
Dim i As Integer
For i = 1
To 100
To 100
If Me.BackgroundWorker1.CancellationPending
= True Then
= True Then
MsgBox("El proceso de exportación ha sido cancelado.", MsgBoxStyle.Exclamation, "Error")
Exit Sub
End If
BackgroundWorker1.ReportProgress(i)
'Indica el tiempo en el que se realizara la tarea en segundo plano
Threading.Thread.Sleep(1)
' 0 es casi instantáneo
Next
'Indicamos la instrucción para exportar los datos deseados de la base de datos SQL.
Dim Cadena As String = "SELECT Nombre, Apellidos from Clientes"
'Llamamos a la función ExportarSQLExcel de la Clase ExportarExcel.
e.Result = ExportarExcel.ExportarSQLExcel(Coneccion, Cadena, Ruta, Archivo)
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
'Notificar el progreso de la tarea
Me.ProgressBar1.Value = e.ProgressPercentage
'Representa el porcentaje del progreso en el Label1.Text
Label1.Text = e.ProgressPercentage & "%"
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
'Volvemos a habilitar el botón
Me.Button1.Enabled = True
'Ponemos en cero la barra de progreso
Me.ProgressBar1.Value = 0
'Eliminamos el texto del Label1
Label1.Text = ""
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Detenemos el proceso de forma segura
Me.BackgroundWorker1.CancelAsync()
End Sub
End Class
No hay comentarios:
Publicar un comentario