Como transferir dados para uma pasta de trabalho do Excel usando o Visual Basic .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 306022 - Exibir os produtos aos quais esse artigo se aplica.
Para obter uma versão deste artigo para o Microsoft Visual C# .NET, consulte 306023.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve detalhadamente diversos métodos para transferência de dados para o Excel 2002 a partir de um programa do Visual Basic .NET. Este artigo também apresenta as vantagens e as desvantagens de cada um dos métodos para que seja possível selecionar a solução que mais bem se adapte à situação.

Visão geral

A técnica usada com mais freqüência para transferir dados para uma pasta de trabalho do Excel é a Automação. Com a Automação, é possível chamar métodos e propriedades específicos às tarefas do Excel. A Automação lhe oferece a maior flexibilidade para a especificação do local dos dados na pasta de trabalho, bem como a capacidade de formatar a pasta de trabalho e fazer diversas configurações no momento da execução.

Com ela, é possível usar diversas técnicas para transferir os dados:
  • Transferir dados célula por célula.
  • Transferir dados de uma matriz para um intervalo de células.
  • Transferir dados de um conjunto de registros ADO para um intervalo de células usando o método CopyFromRecordset
  • Criar um objeto QueryTable em uma planilha do Excel que contém o resultado de uma consulta em uma fonte de dados ODBC ou OLEDB
  • Transferir dados para a área de transferência e colar o conteúdo em uma planilha do Excel
Também é possível usar diversos métodos que não exigem, necessariamente, a automação para transferir dados para o Excel. Se estiver executando um programa no lado do servidor, este pode ser um bom método para retirar grande parte do processamento de dados dos clientes.

Os seguintes métodos podem ser usados para transferir os dados sem a Automação:
  • Transferir os dados para um arquivo de texto separado por vírgulas ou por tabulações que possa ser usado posteriormente pelo Excel para analisar as células de uma planilha
  • Transferir os dados para uma planilha usando o ADO.NET.
  • Transferir dados XML para o Excel (apenas a versão 2002) para fornecer dados formatados e organizados em linhas e colunas.

Técnicas

Usar a Automação para transferir dados célula por célula

Com a Automação, é possível transferir dados para uma planilha, uma célula por vez, da seguinte maneira.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object

        'Start a new workbook in Excel.
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Add data to cells of the first worksheet in the new workbook.
        oSheet = oBook.Worksheets(1)
        oSheet.Range("A1").Value = "Last Name"
        oSheet.Range("B1").Value = "First Name"
        oSheet.Range("A1:B1").Font.Bold = True
        oSheet.Range("A2").Value = "Doe"
        oSheet.Range("B2").Value = "John"

        'Save the Workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book1.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				
A transferência de dados célula por célula pode ser um método aceitável se não houver muitos dados para transferir. Existe a flexibilidade de colocar os dados em qualquer lugar da pasta de trabalho e formatar as células no momento da execução. No entanto, esse método não é recomendado caso haja muitos dados a serem transferidos para uma pasta de trabalho do Excel. Cada objeto Range adquirido no momento da execução resulta em uma solicitação da interface. Por isso, a transferência de dados dessa maneira pode ser lenta.
Além disso, o Microsoft Windows 95, o Microsoft Windows 98 e o Microsoft Windows Millennium Edition (Me) possuem uma limitação de 64 KB nas solicitações de interface. Se houver 64 KB ou mais em solicitações de interface, o servidor de Automação (Excel) pode parar de responder ou mensagens de erro podem ser exibidas, indicando pouca memória. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:
216400 O processo cruzado de Automação COM é capaz de travar o aplicativo cliente no Win95/98
Novamente, a transferência de dados célula por célula só é aceitável para pequenas quantidades de dados. Se você precisar transferir grandes conjuntos de dados para o Excel, leve em consideração o uso de um dos outros métodos descritos neste artigo para transferir dados em massa.

Para obter informações adicionais e um exemplo de como automatizar o Excel com o Visual Basic .NET, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:
301982 Como automatizar o Microsoft Excel a partir do Visual Basic .NET

Usar a Automação para transferir uma matriz de dados para um intervalo de células em uma planilha

Uma matriz de dados pode ser transferida para um intervalo de diversas células ao mesmo tempo, da seguinte maneira.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object

        'Start a new workbook in Excel.
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Create an array with 3 columns and 100 rows.
        Dim DataArray(99, 2) As Object
        Dim r As Integer
        For r = 0 To 99
            DataArray(r, 0) = "ORD" & Format(r + 1, "0000")
            DataArray(r, 1) = Rnd() * 1000
            DataArray(r, 2) = DataArray(r, 1) * 0.07
        Next

        'Add headers to the worksheet on row 1.
        oSheet = oBook.Worksheets(1)
        oSheet.Range("A1").Value = "Order ID"
        oSheet.Range("B1").Value = "Amount"
        oSheet.Range("C1").Value = "Tax"

        'Transfer the array to the worksheet starting at cell A2.
        oSheet.Range("A2").Resize(100, 3).Value = DataArray

        'Save the Workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book2.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				
Se você transferir os dados usando uma matriz em vez de célula por célula, poderá realizar um ganho enorme de desempenho com uma quantidade grande de dados. Considere essa linha a partir do código anterior, que transfere os dados para 300 células na planilha.
        oSheet.Range("A2").Resize(100, 3).Value = DataArray
				
Essa linha representa duas solicitações de interface: uma para o objeto Range que o método Range retorna e outra para o objeto Range que o método Resize retorna. Em contraste, a transferência de dados célula por célula requer solicitações para 300 interfaces para objetos Range. Sempre que possível, você pode se beneficiar da transferência de dados em massa e reduzir o número de solicitações de interface que você faz.

Usar a Automação para transferir um conjunto de dados ADO para um intervalo de planilha

Os modelos de objeto para Excel 2000 e Excel 2002 fornecem o método CopyFromRecordset para transferência de um conjunto de registros ADO para um intervalo em uma planilha. O seguinte código ilustra como automatizar o Excel para transferir o conteúdo da tabela de Pedidos no banco de dados de amostra Northwind usando o método CopyFromRecordset.
        'Create a Recordset from all the records in the Orders table.
        Dim sNWind As String
        Dim conn As New ADODB.Connection()
        Dim rs As ADODB.Recordset
        conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            sNorthwind & ";")
        conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs = conn.Execute("Orders", , ADODB.CommandTypeEnum.adCmdTable)

        'Create a new workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add
        oSheet = oBook.Worksheets(1)

        'Transfer the field names to Row 1 of the worksheet:
        'Note: CopyFromRecordset copies only the data and not the field
        '      names, so you can transfer the fieldnames by traversing the
        '      fields collection.
        Dim n As Int32
        For n = 1 To rs.Fields.Count
            oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
        Next

        'Transfer the data to Excel.
        oSheet.Range("A2").CopyFromRecordset(rs)

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book3.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()

        'Close the connection
        rs.Close()
        conn.Close()
				
Observação O CopyFromRecordset funciona apenas com objetos Recordset ADO. Um DataSet criado usando o ADO.NET não pode ser usado com o método CopyFromRecordset. Diversos exemplos nas seções seguintes demostram como transferir dados para o Excel com o ADO.NET.

Usar a Automação para criar um objeto QueryTable em uma planilha

Um objeto QueryTable representa uma tabela criada a partir dos dados retornados de uma fonte de dados externa. Durante a automação do Excel, é possível criar um QueryTable fornecendo uma seqüência de conexão a uma origem de dados OLEDB ou ODBC e uma seqüência SQL. O Excel gera o conjunto de dados e o insere na planilha no local especificado. O uso dos objetos QueryTable oferece as seguintes vantagens sobre o método CopyFromRecordset:
  • O Excel processa a criação do conjunto de registros e a colocação na planilha.
  • A consulta pode ser salva com o objeto QueryTable para que possa ser atualizada posteriormente a fim de obter um conjunto de registros atualizado.
  • Quando um novo QueryTable é adicionado à planilha, é possível especificar se os dados já presentes nas células da planilha podem ser alterados de acordo com os novos dados (consulte a propriedade RefreshStyle para obter mais detalhes).
O seguinte código demonstra como automatizar o Excel 2000 ou o 2002 para criar um novo QueryTable em uma planilha do Excel usando os dados do banco de dados de amostra Northwind.
        'Create a new workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add
        oSheet = oBook.Worksheets(1)

        'Create the QueryTable object.
        Dim oQryTable As Object
        oQryTable = oSheet.QueryTables.Add( _
        "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            sNorthwind & ";", oSheet.Range("A1"), _
            "Select * from Orders")
        oQryTable.RefreshStyle = 2 ' xlInsertEntireRows = 2
        oQryTable.Refresh(False)

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book4.xls")
        oQryTable = Nothing
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
				

Usar a Área de transferência

É possível usar a Área de transferência para transferir dados para uma planilha. Para colar dados em diversas células de uma planilha, é possível copiar uma seqüência em que as colunas são separadas por tabulações e as linhas por retornos de carro. O seguinte código ilustra como o Visual Basic .NET usa a Área de transferência para transferir dados para o Excel.
        'Copy a string to the Clipboard.
        Dim sData As String
        sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _
            & "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _
            & "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"
        System.Windows.Forms.Clipboard.SetDataObject(sData)

        'Create a workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Paste the data.
        oBook.Worksheets(1).Range("A1").Select()
        oBook.Worksheets(1).Paste()

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book5.xls")
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				

Criar um arquivo de texto separado que pode ser analisado pelo Excel em linhas e colunas

O Excel pode abrir arquivos separados por tabulação ou por vírgula e analisar corretamente os dados nas células. É possível usar esse recurso quando quiser transferir uma grande quantidade de dados para uma planilha com pouca, ou nenhuma Automação. Esse pode ser um bom método para um programa cliente-servidor, já que o arquivo de texto pode ser gerado do lado do servidor. Em seguida, é possível abrir o arquivo de texto no cliente, usando a Automação quando for apropriado.

O seguinte código ilustra como gerar um arquivo de texto separado por tabulação a partir dos dados lidos com o ADO.NET.
        'Connect to the data source.
        Dim objConn As New System.Data.OleDb.OleDbConnection( _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNorthwind & ";")
        objConn.Open()

        'Execute a command to retrieve all records from the Employees table.
        Dim objCmd As New System.Data.OleDb.OleDbCommand( _
            "Select * From Employees", objConn)
        Dim objReader As System.Data.OleDb.OleDbDataReader
        objReader = objCmd.ExecuteReader()

        'Read the records in the dataset and write select fields to the 
        'output file.
        FileOpen(1, sSampleFolder & "Book6.txt", OpenMode.Output)
        Dim i As Integer, s As String
        While objReader.Read()
            'Loop through first 6 fields and concatenate
            'each field, separated by a tab, into s variable.
            s = ""
            For i = 0 To 5
                If Not objReader.IsDBNull(i) Then
                    If i = 0 Then 'field 1 is EmployeeId
                        s = s & objReader.GetInt32(i).ToString
                    ElseIf i = 5 Then 'field 6 is BirthDate
                        s = s & objReader.GetDateTime(i)
                    Else 'field is a text field
                        s = s & objReader.GetString(i)
                    End If
                End If
                s = s & Microsoft.VisualBasic.ControlChars.Tab
            Next
            PrintLine(1, s)
        End While
        FileClose(1)

        'Close the reader and the connection.
        objReader.Close()
        objConn.Close()
				
Não foi usada a Automação no código anterior. No entanto, é possível usar o mínimo de Automação para abrir o arquivo de texto e salvá-lo no formato de pasta de trabalho do Excel, da seguinte maneira.
        'Create a new instance of Excel.
        Dim oExcel As Object
        oExcel = CreateObject("Excel.Application")

        'Open the text file and save it in the Excel workbook format.
        oExcel.Workbooks.OpenText(sSampleFolder & "Book6.txt", _
            , , , -4142, , True) 'xlTextQualifierNone=-4142

        oExcel.ActiveWorkbook.SaveAs(sSampleFolder & "Book6.xls", _
            -4143) 'xlWorkbookNormal = -4143

        'Quit Excel.
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				

Transferir dados para uma pasta de trabalho usando o ADO.NET

É possível usar o provedor do Microsoft Jet OLE DB para adicionar registros a uma tabela de uma pasta de trabalho do Excel existente. Uma "tabela" no Excel é simplesmente um intervalo de células; o intervalo pode ter um nome definido. Normalmente, a primeira linha do intervalo contém os cabeçalhos (ou nomes de campos) e todas as linhas posteriores no intervalo contêm os registros.

O seguinte código adiciona dois novos registros a uma tabela no Book7.xls. A tabela nesse caso é Sheet1.
       'Establish a connection to the data source.
        Dim sConnectionString As String
        sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & sSampleFolder & _
            "Book7.xls;Extended Properties=Excel 8.0;"
        Dim objConn As New System.Data.OleDb.OleDbConnection(sConnectionString)
        objConn.Open()

        'Add two records to the table.
        Dim objCmd As New System.Data.OleDb.OleDbCommand()
        objCmd.Connection = objConn
        objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
            " values ('Bill', 'Brown')"
        objCmd.ExecuteNonQuery()
        objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
            " values ('Joe', 'Thomas')"
        objCmd.ExecuteNonQuery()

        'Close the connection.
        objConn.Close()
				
Ao adicionar registros com o ADO.NET, conforme mostrado, a formatação na pasta de trabalho é mantida. Cada registro adicionado a uma linha usa a formatação da linha anterior. Por exemplo, novos campos adicionados à coluna B são formatados com o alinhamento à direita porque a célula B1 está alinhada à direita.

Observe que quando um registro é adicionado a uma célula ou células na planilha, ele substitui quaisquer dados que essas células continham. Em outras palavras, as linhas na planilha não são "transferidas para baixo" quando novos registros são adicionados. Lembre-se disso ao desenvolver o layout de dados nas suas planilhas se planeja inserir novos registros usando o ADO.NET.

Para obter informações adicionais sobre como usar o ADO.NET, clique nos números abaixo para ler os artigos na Base de Dados de Conhecimento da Microsoft:
301075 Como se conectar a um banco de dados e executar um comando utilizando o ADO.NET e o Visual Basic .NET
301216 Como preencher um objeto DataSet a partir de um banco de dados usando o Visual Basic .NET
301248 Como atualizar um banco de dados a partir de objeto DataSet usando o Visual Basic .NET
Para obter informações adicionais sobre como usar o provedor do Jet OLE DB com fontes de dados do Excel, clique no número abaixo para ler artigo na Base de Dados de Conhecimento da Microsoft:
278973 ExcelADO mostra como usar o ADO para ler e gravar dados em pastas de trabalho do Excel
257819 Como usar o ADO com dados do Excel a partir do Visual Basic ou VBA

Transferir dados em XML (apenas Excel 2002)

O Excel 2002 é capaz de abrir qualquer arquivo em XML que esteja bem formado. Arquivos em XML podem ser abertos diretamente com o comando Abrir no menu Arquivo ou por programação, usando os métodos Open ou OpenXML da coleção Workbooks. Se você criar arquivos XML para usar no Excel, também poderá criar folhas de estilo para formatar os dados.

Para obter informações adicionais sobre como usar XML com o Excel 2002, clique nos números abaixo para ler os artigos na Base de Dados de Conhecimento da Microsoft:
307021 Como transferir dados XML para o Microsoft Excel 2002 usando o Visual Basic .NET
288215 Microsoft Excel 2002 e XML

Crie o projeto de amostra do Visual Basic .NET completo

  1. Crie uma nova pasta para guardar as pastas de trabalho do Excel que a amostra criará e dê o nome da pasta de C:\Exceldata\.
  2. Execute as seguintes etapas para criar uma nova pasta de trabalho na qual a amostra irá gravar:
    1. Inicie uma nova pasta de trabalho no Excel.
    2. Na Plan1 da nova pasta de trabalho, digite Nome na célula A1 e Sobrenome na célula A2.
    3. Salve a pasta de trabalho como C:\Exceldata\Book7.xls.
  3. Inicie o Visual Studio .NET. No menu Arquivo, clique em Novo e clique em Projeto. Em Projetos do Visual Basic, selecione Aplicativos do Windows. Por padrão, é criado o Form1.
  4. Adicione uma referência à biblioteca de objetos do Excel. Para fazer isto, execute as seguintes etapas:
    1. No menu Projeto, clique em Adicionar referência.
    2. Na guia COM, localize Biblioteca de Objetos do Microsoft Excel 10.0 e clique em Selecionar.

      Observação Se isso ainda não foi feito, a Microsoft recomenda o download e a instalação do Microsoft Office XP Primary Interop Assemblies (PIAs). Para obter informações adicionais sobre as Office XP PIAs, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:
      328912 As Microsoft Office XP primary interop assemblies (PIAs) estão disponíveis para download
    3. Na guia COM, localize Biblioteca de Microsoft ActiveX Data Objects 2.7 e clique em Selecionar.
    4. Clique em OK na caixa de diálogo Adicionar Referências para aceitar sua seleção. Se você receber um aviso pedindo que sejam gerados componentes adicionais para as bibliotecas que você selecionou, clique em Sim.
  5. Adicione um controle Caixa de combinação e um controle Botão ao Form1.
  6. Adicione o seguinte código ao Form1.
        Const sSampleFolder = "C:\ExcelData\"
        Const sNorthwind = "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
          Handles MyBase.Load
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Dim aList As String() = _
                {"Use Automation to Transfer Data Cell by Cell ", _
                 "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", _
                 "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", _
                 "Use Automation to Create a QueryTable on a Worksheet", _
                 "Use the Clipboard", _
                 "Create a Delimited Text File that Excel Can Parse into Rows and Columns", _
                 "Transfer Data to a Worksheet Using ADO.NET "}
            ComboBox1.Items.AddRange(aList)
            ComboBox1.SelectedIndex = 0
            Button1.Text = "Go!"
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
          Handles Button1.Click
            Select Case ComboBox1.SelectedIndex
                Case 0 : Automation_CellByCell()
                Case 1 : Automation_UseArray()
                Case 2 : Automation_ADORecordset()
                Case 3 : Automation_QueryTable()
                Case 4 : Use_Clipboard()
                Case 5 : Create_TextFile()
                Case 6 : Use_ADONET()
            End Select
            GC.Collect()
        End Sub
    
        Private Function Automation_CellByCell()
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
    
            'Start a new workbook in Excel.
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Add data to cells of the first worksheet in the new workbook.
            oSheet = oBook.Worksheets(1)
            oSheet.Range("A1").Value = "Last Name"
            oSheet.Range("B1").Value = "First Name"
            oSheet.Range("A1:B1").Font.Bold = True
            oSheet.Range("A2").Value = "Doe"
            oSheet.Range("B2").Value = "John"
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book1.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Automation_UseArray()
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
    
            'Start a new workbook in Excel.
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Create an array with 3 columns and 100 rows.
            Dim DataArray(99, 2) As Object
            Dim r As Integer
            For r = 0 To 99
                DataArray(r, 0) = "ORD" & Format(r + 1, "0000")
                DataArray(r, 1) = Rnd() * 1000
                DataArray(r, 2) = DataArray(r, 1) * 0.07
            Next
    
            'Add headers to the worksheet on row 1.
            oSheet = oBook.Worksheets(1)
            oSheet.Range("A1").Value = "Order ID"
            oSheet.Range("B1").Value = "Amount"
            oSheet.Range("C1").Value = "Tax"
    
            'Transfer the array to the worksheet starting at cell A2.
            oSheet.Range("A2").Resize(100, 3).Value = DataArray
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book2.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Automation_ADORecordset()
            'Create a Recordset from all the records in the Orders table.
            Dim sNWind As String
            Dim conn As New ADODB.Connection()
            Dim rs As ADODB.Recordset
            conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                sNorthwind & ";")
            conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
            rs = conn.Execute("Orders", , ADODB.CommandTypeEnum.adCmdTable)
    
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
            oSheet = oBook.Worksheets(1)
    
            'Transfer the field names to Row 1 of the worksheet:
            'Note: CopyFromRecordset copies only the data and not the field
            '      names, so you can transfer the fieldnames by traversing the
            '      fields collection.
            Dim n As Int32
            For n = 1 To rs.Fields.Count
                oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
            Next
    
            'Transfer the data to Excel.
            oSheet.Range("A2").CopyFromRecordset(rs)
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book3.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
    
            'Close the connection.
            rs.Close()
            conn.Close()
        End Function
    
        Private Function Automation_QueryTable()
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
            oSheet = oBook.Worksheets(1)
    
            'Create the QueryTable object.
            Dim oQryTable As Object
            oQryTable = oSheet.QueryTables.Add( _
            "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                sNorthwind & ";", oSheet.Range("A1"), _
                "Select * from Orders")
            oQryTable.RefreshStyle = 2 ' xlInsertEntireRows = 2
            oQryTable.Refresh(False)
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book4.xls")
            oQryTable = Nothing
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
    
    
            oExcel = Nothing
    
        End Function
    
        Private Function Use_Clipboard()
            'Copy a string to the clipboard.
            Dim sData As String
            sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _
                & "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _
                & "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"
            System.Windows.Forms.Clipboard.SetDataObject(sData)
    
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Paste the data.
            oBook.Worksheets(1).Range("A1").Select()
            oBook.Worksheets(1).Paste()
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book5.xls")
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Create_TextFile()
            'Connect to the data source.
            Dim objConn As New System.Data.OleDb.OleDbConnection( _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNorthwind & ";")
            objConn.Open()
    
            'Run a command to retrieve all records from the Employees table.
            Dim objCmd As New System.Data.OleDb.OleDbCommand( _
                "Select * From Employees", objConn)
            Dim objReader As System.Data.OleDb.OleDbDataReader
            objReader = objCmd.ExecuteReader()
    
            'Read the records in the dataset and write select fields to the 
            'output file.
            FileOpen(1, sSampleFolder & "Book6.txt", OpenMode.Output)
            Dim i As Integer, s As String
            While objReader.Read()
                'Loop through first 6 fields and concatenate
                'each field, separated by a tab, into s variable.
                s = ""
                For i = 0 To 5
                    If Not objReader.IsDBNull(i) Then
                        If i = 0 Then 'field 1 is EmployeeId
                            s = s & objReader.GetInt32(i).ToString
                        ElseIf i = 5 Then 'field 6 is BirthDate
                            s = s & objReader.GetDateTime(i)
                        Else 'field is a text field
                            s = s & objReader.GetString(i)
                        End If
                    End If
                    s = s & Microsoft.VisualBasic.ControlChars.Tab
                Next
                PrintLine(1, s)
            End While
            FileClose(1)
    
            'Close the reader and the connection.
            objReader.Close()
            objConn.Close()
    
            'Create a new instance of Excel.
            Dim oExcel As Object
            oExcel = CreateObject("Excel.Application")
    
            'Open the text file and save it in the Excel workbook format.
            oExcel.Workbooks.OpenText(sSampleFolder & "Book6.txt", _
                , , , -4142, , True) 'xlTextQualifierNone=-4142
    
            oExcel.ActiveWorkbook.SaveAs(sSampleFolder & "Book6.xls", _
                -4143) 'xlWorkbookNormal = -4143
    
            'Quit Excel.
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Use_ADONET()
    
            'Verify that the workbook to write to does exist.
            Dim sFile As String = sSampleFolder & "Book7.xls"
            If Dir(sFile) = "" Then
                MsgBox("Please create the workbook Book7.xls and try again.")
                Exit Function
            End If
    
            'Establish a connection to the data source.
            Dim sConnectionString As String
            sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & sSampleFolder & _
                "Book7.xls;Extended Properties=Excel 8.0;"
            Dim objConn As New System.Data.OleDb.OleDbConnection(sConnectionString)
            objConn.Open()
    
            'Add two records to the table named 'MyTable'.
            Dim objCmd As New System.Data.OleDb.OleDbCommand()
            objCmd.Connection = objConn
            objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
                " values ('Bill', 'Brown')"
            objCmd.ExecuteNonQuery()
            objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
                " values ('Joe', 'Thomas')"
            objCmd.ExecuteNonQuery()
    
            'Close the connection.
            objConn.Close()
        End Function
    					
    Observação Se você não instalou o Office na pasta padrão (C:\Arquivos de programas\Microsoft Office), altere a constante sNorthwind na amostra de código para corresponder ao seu caminho de instalação para o Northwind.mdb.

  7. Adicione o seguinte código na parte superior do Form1.vb:
    Imports Microsoft.Office.Interop
    					
  8. Pressione F5 para criar e executar a amostra.

Referências

Para obter informações adicionais, visite o seguinte site da Microsoft Developer Network (MSDN) (em inglês):
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:
247412 Métodos para transferir dados do Visual Basic para o Excel

Propriedades

ID do artigo: 306022 - Última revisão: quarta-feira, 17 de janeiro de 2007 - Revisão: 6.1
A informação contida neste artigo aplica-se a:
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET (included with the .NET Framework)
Palavras-chave: 
kbhowtomaster kbautomation KB306022

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com