Jump to content
RobinHood

Importar dados do Sql Para Excel

Recommended Posts

RobinHood

Boas pessoal tenho um problema que é:

- tenho de exportar os dados da bd sql para o excel... e estou a utilizar este código:

'Variáveis para a conexão com o banco de dados Northwind do SQL Server
    Const Con As String = "Ligação à Bd"

    'Uma consulta SQL que obtem
    Const SQLExpression As String = "SELECT *FROM  Tabela1 "
    Const SQLExpression1 As String = "SELECT * FROM Tabela2 "


Sub exporta1()
        'Variáveis usadas para a conexão co o banco de dados e o retorno dos dados
        Dim cn As New SqlConnection(Con)
        Dim cmd As New SqlCommand(SQLExpression, cn)

        cmd.CommandType = CommandType.Text
        cn.Open()

        'Define um Data Reader.
        Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

        'A fim de dimensionar o array para os nomes dos campos
        'o número de colunas precisa ser obtido
        Dim contaColuna As Int32 = dr.FieldCount - 1
        Dim camposArr(0, contaColuna) As String
        Dim contaLinha As Int32 = 0

        'O DataReader é um conjunto de dados somente para frente e somente leitura
        'Por isso não podemos saber o número de registros até que ele os retorne
        'a solução possível é estimar o numero de registro e usar 
        Dim maxRegistros As Int32 = 10000
        Dim DataArr(maxRegistros, contaColuna) As Object

        'Preenche o array dos nomes dos campos usando o método GetName do DataReader
        For NameCounter As Int32 = 0 To contaColuna
            camposArr(0, NameCounter) = dr.GetName(NameCounter)
        Next

        'Preenche o array de registros lendo todos os registros no DataReader
        While dr.Read
            For RecordCounter As Int32 = 0 To contaColuna
                DataArr(contaLinha, RecordCounter) = dr.Item(RecordCounter)
            Next
            contaLinha = contaLinha + 1
        End While

        'Fecha a conexão e o DataReader.
        cn.Close()
        dr.Close()

        'Definição das variáveis para tratar com o Excel.
        Dim xlApp As New Excel.Application
        Dim xlWBook As Excel.Workbook = xlApp.Workbooks.Add( _
                                        Excel.XlWBATemplate.xlWBATWorksheet)
        Dim xlWSheet As Excel.Worksheet = CType(xlWBook.Worksheets(1), Excel.Worksheet)
        Dim xlCalc As Excel.XlCalculation

        'Salva a configuração atual para o modo de calculo do Excel e a desliga
        With xlApp
            xlCalc = .Calculation
            .Calculation = Excel.XlCalculation.xlCalculationManual
        End With

        'Escreve o nome dos campos e os dados para a planilha destino
        With xlWSheet
            .Range(.Cells(1, 1), .Cells(1, contaColuna + 1)).Value = camposArr
            .Range(.Cells(2, 1), .Cells(contaLinha + 2, contaColuna + 1)).Value = DataArr
            .UsedRange.Columns.AutoFit()
        End With

        'Torna o Excel disponível para o CLiente
        With xlApp
            .Visible = True
            .UserControl = True
            'Restaura o modo de calculo
            .Calculation = xlCalc
        End With

        'Libera os objetos da memória
        cmd.Dispose()
        cn.Dispose()
        dr = Nothing
        cmd = Nothing
        cn = Nothing
        xlWSheet = Nothing
        xlWBook = Nothing
        xlApp = Nothing
        GC.Collect()
    End Sub

    Sub exportar2()
        'Variáveis usadas para a conexão co o banco de dados e o retorno dos dados
        Dim cn As New SqlConnection(Con)
        Dim cmd As New SqlCommand(SQLExpression1, cn)

        cmd.CommandType = CommandType.Text
        cn.Open()

        'Define um Data Reader.
        Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

        'A fim de dimensionar o array para os nomes dos campos
        'o número de colunas precisa ser obtido
        Dim contaColuna As Int32 = dr.FieldCount - 1
        Dim camposArr(0, contaColuna) As String
        Dim contaLinha As Int32 = 0

        'O DataReader é um conjunto de dados somente para frente e somente leitura
        'Por isso não podemos saber o número de registros até que ele os retorne
        'a solução possível é estimar o numero de registro e usar 
        Dim maxRegistros As Int32 = 10000
        Dim DataArr(maxRegistros, contaColuna) As Object

        'Preenche o array dos nomes dos campos usando o método GetName do DataReader
        For NameCounter As Int32 = 0 To contaColuna
            camposArr(0, NameCounter) = dr.GetName(NameCounter)
        Next

        'Preenche o array de registros lendo todos os registros no DataReader
        While dr.Read
            For RecordCounter As Int32 = 0 To contaColuna
                DataArr(contaLinha, RecordCounter) = dr.Item(RecordCounter)
            Next
            contaLinha = contaLinha + 1
        End While

        'Fecha a conexão e o DataReader.
        cn.Close()
        dr.Close()

        'Definição das variáveis para tratar com o Excel.
        Dim xlApp As New Excel.Application
        Dim xlWBook As Excel.Workbook = xlApp.Workbooks.Add( _
                                        Excel.XlWBATemplate.xlWBATWorksheet)
        Dim xlWSheet As Excel.Worksheet = CType(xlWBook.Worksheets(1), Excel.Worksheet)
        Dim xlCalc As Excel.XlCalculation

        'Salva a configuração atual para o modo de calculo do Excel e a desliga
        With xlApp
            xlCalc = .Calculation
            .Calculation = Excel.XlCalculation.xlCalculationManual
        End With

        'Escreve o nome dos campos e os dados para a planilha destino
        With xlWSheet
            .Range(.Cells(1, 1), .Cells(1, contaColuna + 1)).Value = camposArr
            .Range(.Cells(2, 1), .Cells(contaLinha + 2, contaColuna + 1)).Value = DataArr
            .UsedRange.Columns.AutoFit()
        End With

        'Torna o Excel disponível para o CLiente
        With xlApp
            .Visible = True
            .UserControl = True
            'Restaura o modo de calculo
            .Calculation = xlCalc
        End With

        'Libera os objetos da memória
        cmd.Dispose()
        cn.Dispose()
        dr = Nothing
        cmd = Nothing
        cn = Nothing
        xlWSheet = Nothing
        xlWBook = Nothing
        xlApp = Nothing
        GC.Collect()
    End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
exportar1()
exportar2()
End Sub

Mas isto assim abre-me dois ficheiros do Excel e eu queria que me abrisse só um mas com os dois selects em folhas separadas....

Eu sei que é um quebra:wallbash: mas enfim... não percebo... de como fazer....

___________________________________________________________________________________________________________

Uma outra questão minha é se dá para fazer uma coisa assim destas na exportação 🤔:

- http://www.megaupload.com/?d=6F1UOP2U

Share this post


Link to post
Share on other sites
Caça

Estás a utilizar duas variáveis, utiliza só uma


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
RobinHood

Sim mas tenho duas querys: ......como é que eu posso só fazer uma query para as duas tabelas 🤔:

tabela1 --> AC >> Campos- nac(chave primaria),descrição dataabertura, origem

tabela2 --> AcCoiso >>Campos id(chave primaria), nac(chave externa da tabela AC), descrição, responsável

o campo que elas duas têm em comum é o 'nac' não sei como fazer a query :confused: ...

Share this post


Link to post
Share on other sites
Caça

Não é isso, não podes é ter duas vezes isto

Dim xlApp As New Excel.Application


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
RobinHood

Já esta a query feita do tipo

select * from AC , AcCoiso 

Que é o que eu queria , para aparecer como esta no ficheiro do link...

ok mas agora deixei só o primeiro sub e pôs aquela query...

Graças a por-me a inventar... Passou-me pela cabeça.. sei lá :confused:

Thanks... (Tópico Resolvido)

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

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