Gerar arquivo CSV a partir de tabela

Oracle Application Express - web application development tool (antigamente conhecido como Oracle HTML-DB)
Responder
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa noite

Estou em busca de algum código que abra um arquivo .CSV ou XLS e escreva as linhas dentro dele... a opção download que existe nos relatorios, não sai da forma que eu preciso, por isso queria criar algo q já escreve num arquivo já formatado...

alguma dica?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Arquivo CSV nada mais é que um arquivo TEXTO delimitado por um separador, normalmente um ";".

1. O que você quer dizer com formatado ? Explica melhor que tipo de formatação você precisa.
2. "Abra um arquivo CSV ou XLS e escreva dentro". - Nunca vi nada parecido com isso.
Normalmente os programas abrem arquivos, geram arquivos. Mas eu nunca vi um programa abrindo um excel e modificando ele. :roll:
Se possível, explique melhor o que você precisa.
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa tarde...

Então no visual basic 6, no meu sistema de licitação, eu tenho uma rotina que faz isso, eu tenho um arquivo no excel, que deixei ele no formato de colunas que preciso, dai o codigo, joga os dados nesse arquivo... vejo o codigo abaixo (utilizado no visual basic 6)

FUNÇAO

Selecionar tudo

    Dim Caminho As String
    Caminho = ""
    Caminho = App.Path & "\Proposta_XLS\Proposta_BASE.xls"

'começa a importacao
    Me.MousePointer = vbHourglass

'teste se existe registros para exportacao
    If TotalFilas = 0 Then
        MsgBox "Não existe registros para exportação, verifique!!!", vbInformation, "ATENÇÃO USUÁRIO"
        Exit Sub
    End If
    
'cria a conexao com o excel
Dim Obj_Excel As Excel.Application
Dim Obj_Libro As Excel.Workbook
Dim Obj_Hoja As Excel.Worksheet

    Set Obj_Excel = New Excel.Application
    Obj_Excel.Visible = False
    Set Obj_Libro = Obj_Excel.Workbooks.Open(Caminho)
    Set Obj_Hoja = Obj_Libro.Worksheets(1)
    
    Dim Coluna1 As Integer
    Coluna1 = "4"
    Dim Coluna As Integer
    Coluna = "0"
    
'inicia a exportacao
    Dim X As Integer
    Dim Y As Integer
    
        For X = 4 To frmCadConIntLancItens.DataGrid1.Columns.Count - 1
            If frmCadConIntLancItens.DataGrid1.Columns(X).Visible Then
                'Coluna1 = Coluna1 + 1
                Obj_Excel.Cells(1, Coluna1) = Label7.Caption
                Obj_Excel.Cells(2, Coluna1) = Label1.Caption
                Obj_Excel.Cells(3, Coluna1) = Label2.Caption
                Obj_Excel.Cells(4, Coluna1) = Label3.Caption
                Obj_Excel.Cells(5, Coluna1) = "TIPO: " & Label4.Caption
                Obj_Excel.Cells(2, 6) = frmCadConIntLancItens.Label8.Caption
            End If
        Next

    'For X = 0 To frmCadConIntLancItens.DataGrid1.Columns.Count - 1  ' PEGA AS COLUNAS AUTOMATICA
    For X = 0 To 4
        If frmCadConIntLancItens.DataGrid1.Columns(X).Visible Then
            Coluna = Coluna + 1
            'Obj_Excel.Cells(1, Coluna) = frmCadConIntLancItens.DataGrid1.Columns(X).Caption  'DA O TITULA DA COLUNA
            For Y = 0 To TotalFilas - 1
                Obj_Excel.Cells(Y + 9, Coluna) = frmCadConIntLancItens.DataGrid1.Columns(X).CellValue(frmCadConIntLancItens.DataGrid1.GetBookmark(Y))
            ProgressBar2.Max = "5000"
            ProgressBar2.Value = ProgressBar2.Value + 1
            Next
            ProgressBar2.Value = 0
        End If
    Next

    Obj_Excel.Visible = True
    
    Set Obj_Hoja = Nothing
    Set Obj_Libro = Nothing
    Set Obj_Excel = Nothing
    
    Me.MousePointer = vbDefault
depois, num botão eu verifico se o arquivo existe, verifico se alguns campos chaves estão no lugar correto e chamo a funcao de copia os dados da grid para dentro do excel

Selecionar tudo

    Dim PBase As Variant
    PBase = ""
    PBase = App.Path & "\Proposta_XLS\Proposta_BASE.xls"

    Dim Results As String
    Results = Dir$(PBase)

    If Results = "" Then
        MsgBox "O arquivo -- Proposta_BASE.xls -- não foi encontrado, verifique!!!", vbCritical, "ATENÇÃO USUÁRIO"
        Exit Sub
    End If

'desabilita botoes
    cmdeditar.Enabled = False
    cmdsair.Enabled = False
    
    Dim xl As New Excel.Application
    Dim xlw As Excel.Workbook
        Dim Caminho As String
        Caminho = ""
        Caminho = Label6.Caption
        Set xlw = xl.Workbooks.Open(Caminho)
    xlw.Sheets("Plan1").Select
        If xlw.Application.Cells(5, 6).Value <> "CNPJ:" Then
            MsgBox "Planilha não atende ao layout do sistema, verifique!!!", vbInformation, "ATENÇÃO USUÁRIO"
                xlw.Close False
                Set xlw = Nothing
                Set xl = Nothing
            Exit Sub
        End If
    xlw.Close False
        Set xlw = Nothing
        Set xl = Nothing


    Call Exportar_Datagrid(frmCadConIntLancItens.DataGrid1, frmCadConIntLancItens.DataGrid1.ApproxCount)
No caso desse arquivo do excel, eu anexei ele aqui na mensagem, veja o q eu quero dizer sobre formatação.

Então, no APEX eu procuro algo que escreva dentro d um arquivo excel, caso tenha algo mais facil ou diferente, mas que gere um arquivo EXCEL, por favor, me de a dica... já adianto que a opcao nos relatorios de fazer o download não serve, sai muito fora do padrão que preciso

No meu sistema de licitação, para esse trabalho com o excel, terão 3 fases:
1 - Gero o arquivo com os itens
2 - o proponente, irá lançar somente o valor da proposta dele para cada item;
3 - no dia da licitacao, eu pego esse arquivo, e importo ele (por isso eu já preciso GERAR O ARQUIVO num padrão, pois preciso desse mesmo padrão para importar)

já montei tudo para importar, através da CARGA DE DADOS, que já existe dentro no apex, mas preciso garantir esse padrão no inicio da geração do arquivo

você disse q o CSV nada mais é do que um TXT delimitado, concordo... so que para um usuario comum, fica dificil ele complementar informaçoes, no caso, sua oferta de valor por item, por isso vou entregar para ele um arquivo XLS, é mais facil o preenchimento, quando ele me devolver, eu so salvo como .CSV, e já resolvo importo

Quando falo de arquivo formatado, é eu definir exatamento NOME DE COLUNAS, E EU TER ALGUMAS COLUNAS BLOQUEADAS PARA EDIÇÃO, É GARANTIR QUE O PROPONENTE NÃO ALTERE O LAYOUT DO ARQUIVO, ELE SO IRÁ LANÇAR VALORES, NADA MAIS...
Anexos
Proposta_BASE_apex.xls
Arquivo excel para gerar itens
(691 KiB) Baixado 324 vezes
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Isso é o legal do VB, ele é meio que a "linguagem padrão" do Office.

No seu caso, você ta usando APEX.
Pelo que eu sei, no APEX não tem absolutamente nada parecido com isso.

Pergunta:
Tem como você chamar o VB pra fazer todo esse trabalho a partir do APEX?
(Digo, ter o VB instalado no servidor do apex, ou em um outro servidor).
Daí o seu programa em APEX executa uma rotina no sistema operacional que CHAMA o VB pra fazer todo esse serviço.

Dessa forma você pode continuar usando o VB pra fazer esse trabalho.
:-/
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola,

É no vb isso era facil rsssss... no apex, ta complicado

To pensando em criar um EXECUTAVEL que faça somente essa geração do arquivo, dai eu resolvo o problema, acredito que essa seja a saida... mas vou continuar pesquisando aqui

d qualquer forma, agradeço sua atenção
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Se você descobrir como fazer em Apex, manda pra gente a solução.
Mas sinceramente, eu acho que vai ser mais facil "terceirizar" essa tarefa pra um executável mesmo.

:-o
Avatar do usuário
aarao.primo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 08 Ago 2011 9:37 am
Localização: Rio de Janeiro

Se quiser a nivel de aplicação o apex tem o relatório interativo que da a possibilidade de salvar em csv o resultado da query do relatório.

Ou você pode se for fazer a nível de banco um arquivo CSV salvar em uma tabela com o tipo blob e disponibilizar para download no apex.
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Ola Pessoal.
Faz tempo que não respondo e porque estava com muito serviço....

Vi que precisam de gerar CSV a partir de uma tabela no APEX.

Segue o passo a passo

1 - CRIAR UM BOTÃO NA PAGINA APEX COM AÇÃO SUBMIT PAGE

2 - DEPOIS CRIAR UM PROCESSO "Extrair Dados" type = pl/sql code

3 - No Source do processo "Extrair Dados" colocar o codigo para geração do CSV a partir de um select.

Selecionar tudo


declare
verifica number:=1;

begin
-- Aqui é definido o mime type do arquivo, ou seja csv
owa_util.mime_header( 'application/octet', FALSE );
-- Aqui é definido como o arquivo será apresentado, attachment para Download, filename será o nome do arquivo
htp.p('Content-Disposition: attachment; filename="Lista_Armazem.csv"');
-- Aqui é onde é fechado o header: A configuração do arquivo
owa_util.http_header_close;
-- Aqui fazemos um LOOP para varrer a tabela e recuperar o que será apresentado no csv.(O ideal é que seja a mesma query do relatório da página)
for x in (
    
     select cnpj,
     rz_social razao_social,
     inscricao_estadual,
     endereco,
     bairro,
     cep,
     estado,
     pais from adc_frt_armazens

)
loop
--Para cada coluna concatene um ";". Esse será o separador das colunas do csv.
--Concatene o chr(13) no final para a pular para a próxima linha
if verifica = 1 then
 htp.prn('CNPJ'||';'|| 'Razao Social' ||';'|| 'Inscricao Estadual' ||';'|| 'Endereco' ||';'|| 
 'Bairro' ||';'|| 'CEP' ||';'|| 'Estado' ||';'|| 'Pais' || chr(13));
end if;

 htp.prn(x.cnpj ||';'|| x.razao_social ||';'|| x.inscricao_estadual ||';'||
 x.endereco ||';'|| x.bairro ||';'|| x.cep ||';'|| x.estado ||';'|| x.pais || chr(13));

verifica := 2;
 
end loop;
 
--Use essa linha para caso ocorra algum erro
htmldb_application.g_unrecoverable_error := true;
end;

Espero ter ajudado a todos :D :D :D :roll:
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes