• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Elek

[Resolvido] Exportar do SQL para o Excel

34 mensagens neste tópico

alguem me sabe dizer como é que exporto uma tabela do sql para o excel através de um form em runtime do vb? ou então exportar os dados de uma datagridview... mas prefiro a primeira.

Obrigada,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois eu vi esse jpaulino... mas não o consigo adaptar... não o percebo muito bem...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois eu vi esse jpaulino... mas não o consigo adaptar... não o percebo muito bem...

E qual é o problema que tens ? Não consegues fazer o que ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem digamos que é mais uma má compreensão... há código ai que tenho que meter no excel? é isso que não percebo muito bem :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

... há código ai que tenho que meter no excel? é isso que não percebo muito bem :S

Nada! Não precisas fazer nada no excel.

Resumidamente:

1 - Adicionar como referência  “Microsoft Excel XX.0 Object Library”

2 - Copias a função ExportToExcel() para o teu código

3 - Num botão ou como preferires fazes:

' Exporta e abre o Microsoft Excel

ExportToExcel(Me.DataGridView1, xlsOption.xlsOpen)

OU

' Exporta e grava o ficheiro na localização indicada

ExportToExcel(Me.DataGridView1, xlsOption.xlsSaveAs, "c:\meuFicheiroExcel.xls")

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou tentar... é que eu penso que o meu não dava para importar isso... eu adicionei referencias e nem assim... mas vou tentar novamente. obrigada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou tentar... é que eu penso que o meu não dava para importar isso... eu adicionei referencias e nem assim... mas vou tentar novamente. obrigada.

E fizeste os imports ?

Se precisares de um exemplo é só dizeres!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa espera só um pouco... eu já tentei tantos códigos para isto... afinal as importações estavam todas bem, porque eu depois encontrei as referencias que faltavam.. vou experimentar novamente e já posto aqui o resultado..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

    ' Exporta e abre o Microsoft Excel

ExportToExcel(Me.DataGridView1, xlsOption.xlsOpen)

    ' Exporta e grava o ficheiro na localização indicada

ExportToExcel(Me.DataGridView1, xlsOption.xlsSaveAs, "c:\meuFicheiroExcel.xls")

isto é o código dos botões?  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah... era aqui o erro:

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

diz o seguinte:

'option' cannot expose type 'xlsOption' outside the project through class 'form2'

provavelmente está no sitio errado... mas pronto... se me puderes ajudar, agradeço... mais uma vez  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Colocaste isto em cima da função ?

Enum xlsOption

        xlsSaveAs

        xlsOpen

End Enum

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pode estar tudo num módulo.

Ok, exemplo completo:

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

Public Class Form1

    Enum xlsOption
        xlsSaveAs
        xlsOpen
    End Enum

    ''' <summary>
    ''' Exporta a informação de uma datagridview para o Microsoft Excel
    ''' </summary>
    ''' <param name="dgvName">Nome da datagridview</param>
    ''' <param name="option">SaveAs ou Open</param>
    ''' <param name="fileName">Nome completo do ficheiro</param>
    Public Sub ExportToExcel(ByVal dgvName As DataGridView, ByVal [option] As xlsOption, Optional ByVal fileName As String = "")
        Dim objExcelApp As New 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
            CurrentThread.CurrentCulture = New CultureInfo("en-US")

            ' Adiciona um workbook e activa a worksheet corrente
            objExcelBook = objExcelApp.Workbooks.Add
            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
                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
                    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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ExportToExcel(Me.DataGridView1, xlsOption.xlsOpen)
    End Sub

End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois... eu tinha assim e só deixou de dar erro depois de estar a função no módulo.... agora está tudo a funcionar, só não percebo porque é que a minha datagridview deixou de receber dados...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois... eu tinha assim e só deixou de dar erro depois de estar a função no módulo.... agora está tudo a funcionar, só não percebo porque é que a minha datagridview deixou de receber dados...

Tens de ver melhor porque está a funcionar! Mas no módulo também fica bem e podes utilizar em outros forms.

Agora a questão da datagridview deixar de receber dado é outro problema.

Mostra o que tens (embora tenha de sair agora - só amanhã)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois... eu tenho o datagridview ligado pelo datasource mas não está por código... desculpa estar a massar.. eu vou ligá-la à base de dados como ensinas lá no teu site e depois digo-te aqui qualquer coisa... hoje é mais uma noitada nisto lol... amanhã entretanto ves o resultado. mais uma vez desculpa estar a ser chata.

Obrigada pela ajuda e pela paciência.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

olha está-me a dar um erro sinceramente não estou a ver o porquê...

Private Sub DataGridView1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ' Texto de ligação à base de dados
        Dim myConnectionString As String = My.Settings.frutariaaConnectionString1

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)


        ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
        Dim SQL As String = "Select Cod_Produto, Designacao, DataValidade From Produtos Where DataValidade between @data And DateAdd(day, 3, @data)"
        da = New SqlDataAdapter(SQL, connection)

        ' Indica que a variável corresponde à data do dia em questão
        Dim Command As New SqlCommand(SQL, connection)
        Command.Parameters.Add("@data", SqlDbType.DateTime).Value = DateTime.Now

        ' Cria um novo DataSet, ou seja, uma representação em memória da informação
        ds = New DataSet

        ' Coloca a informação da tabela definida no DataSet
        da.Fill(ds, "Produtos")

        ' Define que a fonte de dados da DataGridView é a nossa DataSet
        ' criando automáticamente as colunas e linhas de dados
        Me.DataGridView1.DataSource = ds.Tables("Produtos")

        ' Limpa a ligação à base de dados. Não é necessário fechar a ligação
        ' porque esta não foi aberta através do comando .Open()
        connection = Nothing

    End Sub

está a dar o erro nesta linha:

da.Fill(ds, "Produtos")

o erro é:

Must declare the scalar variable "@data".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

       Command.Parameters.Add("@data", SqlDbType.DateTime).Value = DateTime.Now

       'Tenta alterar a linha anterior para esta:
       
       Command.Parameters.AddWithValue("@data", DateTime.Now)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

>>Dim SQL As String = "Select Cod_Produto, Designacao, DataValidade From Produtos Where DataValidade between @data And DateAdd(day, 3, @data)"

Qando passas parâmetros não podes fazer assim (estás a utilizar 2 vezes @data para duas datas diferentes).

Altera para:

Dim SQL As String = "Select Cod_Produto, Designacao, DataValidade From Produtos Where DataValidade between @data1 And @data2"

E depois nos parâmetros:

Command.Parameters.Add("@data1", SqlDbType.DateTime).Value = DateTime.Now

Command.Parameters.Add("@data2", SqlDbType.DateTime).Value = DateTime.Now.AddDays(3)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

oh continua a dar exactamente o mesmo erro... tentei as 2 coisas que disseram e nada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o erro que isto te dá ?

   Private Sub DataGridView1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ' Texto de ligação à base de dados
        Dim myConnectionString As String = My.Settings.frutariaaConnectionString1

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)


        ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
        Dim SQL As String = "Select Cod_Produto, Designacao, DataValidade From Produtos Where DataValidade between @data1 And @data2 "
        da = New SqlDataAdapter(SQL, connection)

        ' Indica que a variável corresponde à data do dia em questão
        Dim Command As New SqlCommand(SQL, connection)

        Command.Parameters.Add("@data1", SqlDbType.DateTime).Value = DateTime.Now
        Command.Parameters.Add("@data2", SqlDbType.DateTime).Value = DateTime.Now.AddDays(3)

        ' Cria um novo DataSet, ou seja, uma representação em memória da informação
        ds = New DataSet

        ' Coloca a informação da tabela definida no DataSet
        da.Fill(ds, "Produtos")

        ' Define que a fonte de dados da DataGridView é a nossa DataSet
        ' criando automáticamente as colunas e linhas de dados
        Me.DataGridView1.DataSource = ds.Tables("Produtos")

        ' Limpa a ligação à base de dados. Não é necessário fechar a ligação
        ' porque esta não foi aberta através do comando .Open()
        connection = Nothing

    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é exactamente o mesmo que dava...

é aqui

da.Fill(ds, "Produtos")

e o erro é:

Must declare the scalar variable "@data1".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora