Informática Profesional
www.alejandrobravo.com

Visual Studio .NET

Inicio
Ejemplos
Descargas

Acceder como Usuario






Recuperar contraseña

Estadísticas

Usuarios: 237
Noticias: 44
Enlaces: 3
 
   
Exportar Tablas de SQL a Excel Imprimir E-Mail
Calificación del usuario: / 16
MaloBueno 

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=alejandrobravo;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

Desde la sección de descarga, puedes descargar este ejemplo.

 
Siguiente >
 
   
 
Advertisement