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.DataA 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