Jump to content
Sign in to follow this  
jcbiker

enviar dados para o excel

Recommended Posts

jcbiker

Boas tenho este código que tirei de outro topico, mas está-me a dar um erro.

 


Public Shared Sub ExportToExcel(ByVal dgvName As DataGridView, ByVal [option] As xlsOption, Optional ByVal fileName As String = "")


        Dim objExcelApp As Excel.Application
        objExcelApp = CType(CreateObject("Excel.Application"), Excel.Application)
        Dim objExcelBook As Excel.Workbook
        Dim objExcelSheet As Excel.Worksheet
        

        Try

            ' Verifica se foi seleccionada a opção xlsSaveAs e não foi indicado ficheiro
            If [option] = xlsOption.xlsSaveAs And fileName = String.Empty Then

                MessageBox.Show("É necessário indicar um nome para o ficheiro a gravar ...")
                Exit Sub
            End If


            ' Altera o tipo/localização para Inglês. Existe incompatibilidade 
            ' entre algumas versões de Excel vs Sistema Operativo

            Dim oldCI As CultureInfo = CurrentThread.CurrentCulture ' Dá erro
            CurrentThread.CurrentCulture = New CultureInfo("en-US") 'da erro


            ' Adiciona um workbook e activa a worksheet corrente
            objExcelBook = objExcelApp.Workbooks.Add ' ------> dá erro member not found
            objExcelSheet = CType(objExcelBook.Worksheets(1), Excel.Worksheet)

            ' Ciclo nos cabeçalhos para escrever os títulos a bold/negrito

            Dim dgvColumnIndex As Int16 = 1

            For Each col As DataGridViewColumn In dgvName.Columns
                objExcelSheet.Cells(1, dgvColumnIndex).col.HeaderText = True
                objExcelSheet.Cells(1, dgvColumnIndex).Font.Bold = True
                dgvColumnIndex += 1

            Next
            ' Ciclo nas linhas/células

            Dim dgvRowIndex As Integer = 2

            For Each row As DataGridViewRow In dgvName.Rows
                Dim dgvCellIndex As Integer = 1
                For Each cell As DataGridViewCell In row.Cells
                    objExcelSheet.Cells(dgvRowIndex, dgvCellIndex).cell.Value = True
                    dgvCellIndex += 1

                Next

                dgvRowIndex += 1
            Next


            ' Ajusta o largura das colunas automáticamente

            objExcelSheet.Columns.AutoFit()



            ' Caso a opção seja gravar (xlsSaveAs) grava o ficheiro e fecha
            ' o Workbook/Excel. Caso contrário (xlsOpen) abre o Excel
            If [option] = xlsOption.xlsSaveAs Then
                objExcelBook.SaveAs(fileName)
                objExcelBook.Close()
                objExcelApp.Quit()

                MessageBox.Show("Ficheiro exportado com sucesso para: " + fileName)

            Else

                objExcelApp.Visible = True

            End If

            ' Altera a tipo/localização para actual

            CurrentThread.CurrentCulture = oldCI


        Catch ex As Exception

            MessageBox.Show("Erro não identificado. Mensagem original:" + vbNewLine + ex.Message)


        Finally
            objExcelSheet = Nothing
            objExcelBook = Nothing
            objExcelApp = Nothing


            ' O GC(garbage collector) recolhe a memória não usada pelo sistema. 
            ' O método Collect() força a recolha e a opção WaitForPendingFinalizers 
            ' espera até estar completo. Desta forma o EXCEL.EXE não fica no 
            ' task manager(gestor tarefas) ocupando memória desnecessáriamente

            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try




    End Sub

Alguem me pode ajudar?

Share this post


Link to post
Share on other sites
jcbiker

o erro que dá é quando lê esta linha:

  ' Adiciona um workbook e activa a worksheet corrente
            objExcelBook = objExcelApp.Workbooks.Add ' ------> dá erro member not found
            objExcelSheet = CType(objExcelBook.Worksheets(1), Excel.Worksheet)

Share this post


Link to post
Share on other sites
Elrosnum

desculpa estava distriado e não vi o erro xD

Já adicionas-te alguma referência?

Se não, faz o seguinte, no Solution Explorer como se fosses a a adicionar um novo form, mas escolhes "Add Reference", depois então escolhes o separador COM e escolhes algo como "Microsoft Excell 14.0 Object Library"

Depois de clicares em OK, certifica-te que em cima de tudo tens um "Imports Microsoft.Office.Interop.Excel"

Depois testa e dá um feedback :)

Boa sorte :D

Share this post


Link to post
Share on other sites
Elrosnum

Como disse o Caça, dá perfeitamente, a diferença é que deves ter o Office 2007 e eu já tenho o 2010 xD (Acho eu que é isso) :)

Cumpz...

Share this post


Link to post
Share on other sites
Elrosnum

É só esse erro do member not found que dá?

Tens o import lá em cima?

Share this post


Link to post
Share on other sites
Caça

Precisas de importar estes namespaces

    Imports Microsoft.Office.Interop
    Imports System.Threading.Thread
    Imports System.Globalization   


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
jcbiker

Tenho isto.


Imports Microsoft.Office.Tools

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.Threading.Thread
Imports System.Globalization

Share this post


Link to post
Share on other sites
Caça

E ainda está a dar erro?

Os erros estão a dar durante a execução do código ou quando estás a programar?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Elrosnum

Eu já necessitei de fazer uma coisa dessas e só precisei do office.interop :O

Estranho =x

Eu tinha o código numa função e dps no botão para exportar chamava a função e funciona perfeitamente =X

Share this post


Link to post
Share on other sites
Caça

É porque já tinhas o namespace Microsoft directamente importado


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
jcbiker

Eu tenho assim:

num botaão da Form:


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ExportToExcel(Me.dgvList, xlsOption.xlsOpen)
    End Sub

Depois numa class


Imports Microsoft.Office.Tools

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.Threading.Thread
Imports System.Globalization




Public Class Class1

    Public Enum xlsOption
        xlsSaveAs
        xlsOpen

    End Enum



    Public Shared Sub ExportToExcel(ByVal dgvName As DataGridView, ByVal [option] As xlsOption, Optional ByVal fileName As String = "")


        Dim objExcelApp As Excel.Application
        objExcelApp = CType(CreateObject("Excel.Application"), Excel.Application)
        Dim objExcelBook As Excel.Workbook
        Dim objExcelSheet As Excel.Worksheet
        

        Try

            ' Verifica se foi seleccionada a opção xlsSaveAs e não foi indicado ficheiro
            If [option] = xlsOption.xlsSaveAs And fileName = String.Empty Then

                MessageBox.Show("É necessário indicar um nome para o ficheiro a gravar ...")
                Exit Sub
            End If


            ' Altera o tipo/localização para Inglês. Existe incompatibilidade 
            ' entre algumas versões de Excel vs Sistema Operativo

            Dim oldCI As CultureInfo = CurrentThread.CurrentCulture ' Dá erro:
            CurrentThread.CurrentCulture = New CultureInfo("en-US") 'da erro


            ' Adiciona um workbook e activa a worksheet corrente
            objExcelBook = objExcelApp.Workbooks.Add ' ------> dá erro member not found
            objExcelSheet = CType(objExcelBook.Worksheets(1), Excel.Worksheet)

            ' Ciclo nos cabeçalhos para escrever os títulos a bold/negrito

            Dim dgvColumnIndex As Int16 = 1

            For Each col As DataGridViewColumn In dgvName.Columns
                objExcelSheet.Cells(1, dgvColumnIndex).col.HeaderText = True
                objExcelSheet.Cells(1, dgvColumnIndex).Font.Bold = True
                dgvColumnIndex += 1

            Next
            ' Ciclo nas linhas/células

            Dim dgvRowIndex As Integer = 2

            For Each row As DataGridViewRow In dgvName.Rows
                Dim dgvCellIndex As Integer = 1
                For Each cell As DataGridViewCell In row.Cells
                    objExcelSheet.Cells(dgvRowIndex, dgvCellIndex).cell.Value = True
                    dgvCellIndex += 1

                Next

                dgvRowIndex += 1
            Next


            ' Ajusta o largura das colunas automáticamente

            objExcelSheet.Columns.AutoFit()



            ' Caso a opção seja gravar (xlsSaveAs) grava o ficheiro e fecha
            ' o Workbook/Excel. Caso contrário (xlsOpen) abre o Excel
            If [option] = xlsOption.xlsSaveAs Then
                objExcelBook.SaveAs(fileName)
                objExcelBook.Close()
                objExcelApp.Quit()

                MessageBox.Show("Ficheiro exportado com sucesso para: " + fileName)

            Else

                objExcelApp.Visible = True

            End If

            ' Altera a tipo/localização para actual

            CurrentThread.CurrentCulture = oldCI


        Catch ex As Exception

            MessageBox.Show("Erro não identificado. Mensagem original:" + vbNewLine + ex.Message)


        Finally
            objExcelSheet = Nothing
            objExcelBook = Nothing
            objExcelApp = Nothing


            ' O GC(garbage collector) recolhe a memória não usada pelo sistema. 
            ' O método Collect() força a recolha e a opção WaitForPendingFinalizers 
            ' espera até estar completo. Desta forma o EXCEL.EXE não fica no 
            ' task manager(gestor tarefas) ocupando memória desnecessáriamente

            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try




    End Sub


End Class

Share this post


Link to post
Share on other sites
jcbiker

E ainda está a dar erro?

Os erros estão a dar durante a execução do código ou quando estás a programar?

quando está em execução

Share this post


Link to post
Share on other sites
Caça

Qual é o estado da variável objExcelApp no momento que dá erro?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
jcbiker

O estado é este:

objExcelApp = {Microsoft.Office.Interop.Excel.ApplicationClass}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.