VB .NET - Exportando dados do SQL Server para o Excel


Este artigo será bem prático. Vamos exportar dados do SQL Server para o Excel via ADO .NET.

Como exemplo eu vou usar o banco de dados Northwind.mdf e exportar os dados da tabela Customers para o Excel usando um DataReader.

Ambiente e Ferramentas usadas:

A única atenção que você deve ter é incluir uma referência a ao Excel instalado na sua máquina local. No meu exemplo estou usando o Excel 2002.

Abra o VB 2008 Express e crie um projeto do tipo Windows Application com o nome exportaSQL_Excel;

A seguir clique com o botão direito do mouse sobre o nome do projeto e selecione Add Reference;

Em seguida selecione na aba .NET a referência ao Excel conforme abaixo:

Abra o formulário padrão form1.vb e inclua um botão de comando no formulário. (Eu inclui uma imagem do Excel mas isso não é obrigatório);

Abra o formulário e declare os namespacaes que vamos usar no projeto:

Imports System.Data
Imports
System.Data.SqlClient
Imports
Excel = Microsoft.Office.Interop.Excel

A seguir vamos definir as seguinte variáveis para a string de conexão e a instrução SQL no formulário:

'Vari veis para a conexÆo com o banco de dados Northwind do SQL Server

Const Con As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;Persist Security Info=False"

'Uma consulta SQL que obtem

Const SQLExpression As String = "SELECT CustomerID AS Id, CompanyName AS Empresa," & _

                                                 "City As Cidade, Region As Regiao, Country As pais FROM Customers ORDER BY CompanyName;"

Agora no evento Click do botão de comando inclua o código para exportar os dados para o Excel:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Variáveis usadas para a conexão co o banco de dados e o retorno dos dados
        Dim cn As New SqlConnection(Con)
        Dim cmd As New SqlCommand(SQLExpression, cn)
        cmd.CommandType = CommandType.Text
        cn.Open()
        'Define um Data Reader.
        Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
        'A fim de dimensionar o array para os nomes dos campos
        'o número de colunas precisa ser obtido
        Dim contaColuna As Int32 = dr.FieldCount - 1
        Dim camposArr(0, contaColuna) As String
        Dim contaLinha As Int32 = 0
        'O DataReader é um conjunto de dados somente para frente e somente leitura
        'Por isso não podemos saber o número de registros até que ele os retorne
        'a solução possível é estimar o numero de registro e usar 
        Dim maxRegistros As Int32 = 10000
        Dim DataArr(maxRegistros, contaColuna) As Object
        'Preenche o array dos nomes dos campos usando o método GetName do DataReader
        For contador As Int32 = 0 To contaColuna
            camposArr(0, contador) = dr.GetName(contador)
        Next
        'Preenche o array de registros lendo todos os registros no DataReader
        While dr.Read
            For contadorRegistros As Int32 = 0 To contaColuna
                DataArr(contaLinha, contadorRegistros) = dr.Item(contadorRegistros)
            Next
            contaLinha = contaLinha + 1
        End While
        'Fecha a conexão e o DataReader.
        cn.Close()
        dr.Close()
        'Definição das variáveis para tratar com o Excel.
        Dim xlApp As New Excel.Application
        Dim xlWBook As Excel.Workbook = xlApp.Workbooks.Add( _
                                        Excel.XlWBATemplate.xlWBATWorksheet)
        Dim xlWSheet As Excel.Worksheet = CType(xlWBook.Worksheets(1), Excel.Worksheet)
        Dim xlCalc As Excel.XlCalculation
        'Salva a configuração atual para o modo de calculo do Excel e a desliga
        With xlApp
            xlCalc = .Calculation
            .Calculation = Excel.XlCalculation.xlCalculationManual
        End With
        'Escreve o nome dos campos e os dados para a planilha destino
        With xlWSheet
            .Range(.Cells(1, 1), .Cells(1, contaColuna + 1)).Value = camposArr
            .Range(.Cells(2, 1), .Cells(contaLinha + 2, contaColuna + 1)).Value = DataArr
            .UsedRange.Columns.AutoFit()
        End With
        'Torna o Excel disponível para o CLiente
        With xlApp
            .Visible = True
            .UserControl = True
            'Restaura o modo de calculo
            .Calculation = xlCalc
        End With
        'Libera os objetos da memória
        cmd.Dispose()
        cn.Dispose()
        dr = Nothing
        cmd = Nothing
        cn = Nothing
        xlWSheet = Nothing
        xlWBook = Nothing
        xlApp = Nothing
        GC.Collect()
    End Sub
 

Executando o projeto iremos obter:

Pegue o projeto completo aqui : exportaSQL_Excel.zip

Até breve.

Referências:


José Carlos Macoratti