Ir para o conteúdo
Elek

[Resolvido] Exportar do SQL para o Excel

Mensagens Recomendadas

Elek    1
Elek

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,

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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 ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

... 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")

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

    ' 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?  :-[

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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  :-[

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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ã)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Elek    1
Elek

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lordnins    1
lordnins

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

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

>>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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade