VB .NET - Exportando dados para o Excel com ADO


Se você é um desenvolvedor VBA já deve saber que uma das formas de exportar dados para o Excel é usar os recursos da ADO referenciando a biblioteca Microsoft ActiveX Data Object e usando o recurso CopyFromRecordset.

Se você for um desenvolvedor .NET que usa VB .NET ou C# e precisa exportar dados para o Excel provavelmente você vai usar ADO .NET ou LINQ. Vai funcionar com certeza mas você ainda pode continuar usando o recurso ADO que em muitos casos tem se mostrado mais rápido.

Então neste artigo eu mostro como exportar dados usando os recursos da ADO com o VB .NET.

Você vai precisar ter instalado o Visual Basic 2010 Express Edition e o Excel 2007 (creio que com a versão 2003 também funcione).

Abra o Visual Basic 2010 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome Exportar_Excel;

No formulário padrão form1.vb inclua um botão de comando (btnExportar) com o texto Exportar Dados;

Abaixo temos o leiaute do formulário (as imagens usadas foram só uma perfumaria e são opcionais):

Se você quiser exibir as imagens como na figura deverá definir as seguintes propriedades:

Formulário form1.vb:

  • BackGroundImage = a imagem desejada (importar de Local Resource)
  • BackGroundImageLayout = Stretch

Controle Button :

  • Image = a imagem exibida (importar de Local Resource)
  • ImageAlign = BottomCenter

Agora vamos importar as referências as bibliotecas ADO e Excel:

No menu Project clique Add Reference e na janela Add Reference selecione a guia COM e marque o item: Microsoft ActiveX Data Objects xx.xx Library (xx.xx é a versão)

Repita o procedimento acima e na mesma janela e guia selecione o item: Microsoft Excel 12.0 Object Library (A versão 12.0 indica o Excel 2007)

Agora já temos as referências no projeto e podemos definir as declarações no início do formulário form1.vb:

Imports ADODB
Imports System.Text
Imports excel = Microsoft.Office.Interop.Excel

Para concluir defina no evento Click do botão de comando o código conforme abaixo:

    Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click

        Try
            'define a string de conexão
            Const stcon As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\dados\NorthWind.accdb"
            'defina a instrução SQL para selecionar os dados da tabela
            Const stsql As String = "SELECT * FROM Customers"
            'define os objetos connection, recordset e Field
            Dim cnt As New ADODB.Connection
            Dim rst As New ADODB.Recordset
            Dim fld As ADODB.Field
            'Abre a conexão com o banco de dados
            cnt.Open(stcon)
            'Abre o recordset
            With rst
                .CursorLocation = CursorLocationEnum.adUseClient
                .Open(stsql, cnt, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, ADODB.CommandTypeEnum.adCmdText)
                .ActiveConnection = Nothing
            End With
            'Fecha a conexão com o banco de dados
            cnt.Close()
            'Define variáveis para o Excel: Application(Excel),WorkBook(pasta de trabalho),WorkSheet(Planilha)
            'Range(intervalo de células)
            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 xlrange As excel.Range = xlwsheet.Range("A2")
            'define modo de cálculo : xlCalculationAutomatic , xlCalculationManual, xlCalculationSemiautomatic
            Dim xlcalc As excel.XlCalculation
            'Desabilita temporariamente o calculo automatico passando para manual
            With xlapp
                xlcalc = .Calculation
                .Calculation = excel.XlCalculation.xlCalculationManual
            End With
            Dim contadorCampos As Integer = Nothing

            'Escreve os nomes dos campos na planilha
            For Each fld In rst.Fields
                xlrange.Offset(0, contadorCampos).Value = fld.Name
                contadorCampos = contadorCampos + 1
            Next

            'Copia o recordset para a planilha
            xlrange.Offset(1, 0).CopyFromRecordset(rst)
            'Fecha o recordset.
            rst.Close()
            With xlapp
                .Visible = True
                .UserControl = True
                'Restaura o calculo
                .Calculation = xlcalc
            End With
            'libera os objetos
            fld = Nothing
            rst = Nothing
            cnt = Nothing
            xlrange = Nothing
            xlwsheet = Nothing
            xlwbook = Nothing
            xlapp = Nothing

        Catch ex As Exception
            MessageBox.Show("Ocorreu um erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Executando o projeto e acionando o botão para exportar os dados iremos obter:

Fácil, simples e muito rápido...

Pegue o projeto completo aqui: Exportar_Excel.zip

1Pe 1:17 E, se invocais por Pai aquele que, sem acepção de pessoas, julga segundo a obra de cada um, andai em temor durante o tempo da vossa peregrinação,

1Pe 1:18 sabendo que não foi com coisas corruptíveis, como prata ou ouro, que fostes resgatados da vossa vã maneira de viver, que por tradição recebestes dos vossos pais,

1Pe 1:19 mas com precioso sangue, como de um cordeiro sem defeito e sem mancha, o sangue de Cristo,

1Pe 1:20 o qual, na verdade, foi conhecido ainda antes da fundação do mundo, mas manifesto no fim dos tempos por amor de vós,

1Pe 1:21 que por ele credes em Deus, que o ressuscitou dentre os mortos e lhe deu glória, de modo que a vossa fé e esperança estivessem em Deus.

Referências:


José Carlos Macoratti