Como enviar um arquivo do Excel via WebService

No artigo de hoje, vamos demonstrar em como enviar um arquivo Excel via WebService.

Esse exemplo foi disponibilizado pelo grande Endreo Figueiredo ( LinkedIn ).

Imagine que você tenha que enviar o conteúdo de um Excel via WebService em AdvPL, como fazer esse procedimento?

Primeiramente instancie um FWFileReader, apontando para o arquivo Excel desejado.

Depois é necessário ter um serviço de conversão instalado, que nesse caso foi usado Python, e a documentação está disponível em https://github.com/endreofig/ADVPL-PROTHEUS-/tree/main/advpl%20x%20python

Por último, acione o método desse serviço que faz a conversão do Excel para CSV. Abaixo um print do resultado.

Print de exemplo

Abaixo o exemplo de como ficou em AdvPL:

#INCLUDE "TOTVS.CH"
 
/*/{Protheus.doc} ENDFWEXCEL
Realiza leitura de arquivo envia para conversor 
WebService e realiza e pega o retorno do xml em Json
@type function
@version 12.1.25
@author endreo.figueiredo
@since 27/08/2021
/*/
 
User Function ENDFWEXCEL()
 
    Local oRestClient   as object
    Local oFile         as object
    Local tmp           := getTempPath()
    Local oResult       := JsonObject():New()
    Local cUrl          := "http://localhost:21658"
    Local cPath         := "/convert"
    Local aHead         := {}
    Local cPostParms    := ''
    Local cGetDir       := ''  
    Local cResult       := ''   
    Local nX
 
    //Abre caixa de seleção de arquivos para escolha de arquivos a serem enviados
    cGetDir := tFileDialog( "All files (*.*) | All Text files (*.txt) ",'Selecao de Arquivos',, tmp, .F., GETF_MULTISELECT )
     
    //Classe de auxilo de leitura de arquivo texto,por linhas.
    //Lê sempre um buffer fixo, permitindo leitura de linha sem honerar o IO.
    oFile := FwFileReader():New(cGetDir)
     
    //Verifica se conseguiu abrir o arquivo
    If oFile:Open()
         
        //Estancia a Classe FWRest 
        oRestClient := FWRest():New(cUrl)
         
        //India o path/caminho para ws 
        oRestClient:SetPath(cPath)
 
        //Define head para envio ao WS
        aadd(aHead,'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryFbmu0bODj7UvfQEV')
         
        //Criando Body formato de envio de arquivo para envio para WS
        cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV'
        cPostParms += CRLF
        cPostParms += 'Content-Disposition: form-data; name="file"; filename="'+cGetDir+'"' // passado o caminho e nome do arquivo 
        cPostParms += CRLF
        cPostParms += 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet '
        cPostParms += CRLF
        cPostParms += CRLF
        cPostParms += oFile:FullRead() //Retorna arquivo em formato aberto
        cPostParms += CRLF
        cPostParms += '------WebKitFormBoundaryFbmu0bODj7UvfQEV--''
 
        //Seta body na Classe FWRest    
        oRestClient:SetPostParams( cPostParms )
         
        //Fecha o arquivo que foi aberto
        oFile:Close()
 
        //Realiza o envio
        If oRestClient:Post(aHead)
            //Retorno do WS se ok
            varinfo('response', cResult := oRestClient:GetResult())
             
            //Verifica se tem retorno
             If !Empty(cResult)
                //Converte retorno Json String pra Objeto
                oResult:FromJson(cResult)
 
                //Faz um for e recupera cada linha 
                For nX:= 1 to Len(oResult['id'])
             
                    VarInfo('id'   , oResult['id'][nX]   )
                    VarInfo('nome' , oResult['nome'][nX] )
                 
                Next nX
 
            EndIf 
             
        Else
            //Retorno do WS se ok
            varinfo('response',oRestClient:GetLastError())
        EndIf
 
        //Limpa objeto
        oRestClient := Nil
        //Mata Objeto
        FreeObj(oRestClient)
 
    Endif
 
    //Limpa Objeto
    oFile := Nil
    //Mata Objeto
    FreeObj(oFile)
      
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação