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