Windows Forms - Acesso ao Excel

Para trabalhar com o objetos do Microsoft Office precisa :
1-project-add reference-.com-Microsoft Excel 12.0 Object Library
2-Projeto-propriedades-compilar-CPU Destino=x86.
    Se o seu Office for 32 bits você deve compilar o programa em 32 bits porque se o programa for programado pelo default, 64 bits, não conseguirá chamar as dlls do office em 32 bits.
3-Precisa do Excel instalado na máquina.

Imports Microsoft.Office.Interop.Excel

Module Excel

Exportando dados de um datagridview para o Excel

    ''' <summary>
    ''' Esta função exporta um datagridview para o Excel
    ''' </summary>
    ''' <param name="NomeArqXLS">Nome do arquivo excel-Se não existir ele cria e se existir ele grava em cima</param>
    ''' <param name="Planilha">Planilha dentro do arquivo a armazenar as informações- Se não existir cria e se existir escreve em cima</param>
    ''' <param name="DTG">DatagridView com os dados a serem enviados para o Excel</param>
    ''' Se o arquivo excel não existir ele cria
    ''' se a planilha excel não existir ele cria
    ''' caso exista ele abre, atribui/salva dados dgv e fecha
    Public Sub ExportaDGVExcel(NomeArqXLS As String, Planilha As String, ByVal DTG As DataGridView)
        Dim xlApp As Microsoft.Office.Interop.Excel.Application 'precisa do Excel instalado no micro
        Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook 'Arquivo Excel
        Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 'Planilha Excel
        Dim flgArqExcelExiste As Boolean = False 'true = já existe o arquivo excel existe
        Dim flgPlanExiste As Boolean = False 'true = já existe a planilha dentro do arq excel
        Dim misValue As Object = System.Reflection.Missing.Value

        Try
            'criando a app Excel
            xlApp = New Microsoft.Office.Interop.Excel.Application
            'xlApp.Visible = True

            If IO.File.Exists(NomeArqXLS) Then
                'abrindo o arquivo excel
                xlWorkBook = xlApp.Workbooks.Open(NomeArqXLS)
                flgArqExcelExiste = True 'arq excel já existe

            Else
                'Novo documento Excel
                xlWorkBook = xlApp.Workbooks.Add()
                flgArqExcelExiste = False 'arq excel novo

                'MsgBox("Arquivo não encontrado:" + NomeArqXLS)
                'Exit Sub
            End If

            'verificando se a planilha existe
            flgPlanExiste = False
            For Each xs In xlWorkBook.Sheets
                If xs.Name = Planilha Then
                    flgPlanExiste = True 'a planilha já existe
                    Exit For
                End If
            Next xs

            'abrindo a planilha
            If flgPlanExiste = True Then
                xlWorkSheet = xlWorkBook.Worksheets(Planilha)
            Else
                'Planilha não existe...criando a planilha solicitada

                'Dim newWorkbook As Excel.Workbook = xlApp.Workbooks.Add()
                'xlWorkSheet = xlWorkBook.Worksheets.Add(Planilha)
                'xlWorkBook = xlApp.Workbooks.Add(misValue)
                xlWorkSheet = CType(xlApp.Worksheets.Add(), Microsoft.Office.Interop.Excel.Worksheet)
                xlWorkSheet.Name = Planilha

            End If

            'salvando os headers de coluna do dgv-linha 1
            Dim c As Integer
            For c = 0 To DTG.Columns.Count - 1
                xlWorkSheet.Cells(1, c + 1) = DTG.Columns(c).Name
            Next

            'salvando os dados do dgv - linha 2 em diante
            Dim l As Integer
            For c = 0 To DTG.Columns.Count - 1
                For l = 1 To DTG.Rows.Count - 1
                    xlWorkSheet.Cells(l + 1, c + 1) = DTG.Rows(l - 1).Cells(c).Value
                    '.Range(celula).Value = DTG.Rows(li).Cells(I).Value
                Next
            Next

            If flgArqExcelExiste = True Then 'o arquivo já exite
                'xlWorkBook.Close(SaveChanges:=False)
                xlWorkBook.Close(SaveChanges:=True)
                'xlWorkBook.SaveToFile(NomeArqXLS) 'este arquivo tem que existir
            Else
                'xlWorkBook.Close(SaveChanges:=True)
                xlWorkBook.SaveAs(NomeArqXLS) 'nesta opção ele cria o arquivo
            End If

            'display the cells value B2
            'MsgBox(xlWorkSheet.Cells(2, 2).value)

            'xlWorkBook.SaveAs("d:\csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue,
            'Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
            'xlWorkBook.Close(True, misValue, misValue)

            xlApp.Quit()

            LiberaObjeto(xlApp)
            LiberaObjeto(xlWorkBook)
            LiberaObjeto(xlWorkSheet)

            MsgBox("FIM")

        Catch ex As Exception
            MsgBox("Ocorreu um erro:" + ex.Message)
            xlApp.Quit()

            LiberaObjeto(xlApp)
            LiberaObjeto(xlWorkBook)
            LiberaObjeto(xlWorkSheet)
        End Try

    End Sub

    Private Sub LiberaObjeto(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try

    End Sub

End Module