martes, 16 de febrero de 2010

Exportar Tablas de SQL a Excel

Ú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)
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
.SheetsInNewWorkbook = 1
.Workbooks.Add()
.Worksheets(1).Select()
Dim i As Integer = 1
For Columnas = 0
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
i = 2
For Filas = 0 To
MiDataSet.Tables(0).Rows.Count - 1
.Cells(i, k).Value =
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
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")
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
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.
Exportar Tablas de SQL a Excel

Public Class
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"

'Indicamos la ruta donde se guardara el archivo, en este caso es el escritorio.

Dim Ruta
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
Dim i As Integer

For i = 1
To 100
If Me.BackgroundWorker1.CancellationPending
= 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