Olá pessoal…
Hoje vou mostrar como converter uma planilha do Excel para a extensão DBF, utilizando uma função em AdvPL.
Primeiramente pessoal, a conversão que iremos utilizar, usará como base o LibreOffice, dessa forma, ele que ficará encarregado de converter para dbf, assim, só utilizaremos o dbf.
Portanto, é necessário fazer o download do LibreOffice (pt-br.libreoffice.org/baixe-ja/libreoffice-stable/), depois disso procure as configurações avançadas do sistema.
Caso não encontre, você pode pressionar Windows+Pause Break, e depois clicar em configurações avançadas. Caso não encontre mesmo assim, abra o meu computador, clique com o botão direito em cima do meu computador, depois clique em Propriedades, e por último, configurações avançadas do sistema.
Na aba Avançado, clique no botão “Variáveis de Ambiente”, nas variáveis do sistema, escolha a variável “Path”, clique em editar, vá no final dela, adicione um ponto e vírgula (;), e depois o caminho program do LibreOffice (por exemplo, C:Program Files (x86)LibreOffice 4program).
Para testar, abra o Prompt de Comando no Windows, e digite soffice no terminal, se abrir o LibreOffice, a parametrização deu certo.
A rotina, deve-se passar dois parâmetros, o caminho de origem e o de destino (dentro da protheus data). Abaixo o código fonte desenvolvido.
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zExcel2DBF
Função que converte arquivos do excel (*.xls*) em arquivos dBase (*.dbf), utilizando o LibreOffice para conversão
@author Atilio
@since 10/10/2014
@version 1.0
@param cOrigem, Caracter, Arquivo origem do Excel que será convertido
@param cDestino, Caracter, Caminho dentro da Protheus_Data que ficará o .dbf
@return lOk, Define se o arquivo dbf foi gerado
@example
lGerouDbf := u_zExcel2DBF("C:\arquivo.xlsx", "\especificos\")
@obs
Comandos Originais testados:
soffice --convert-to dbf "E:\TOTVS11\Protheus_Data\especificos\arquivo.xlsx" --outdir "E:\TOTVS11\Protheus_Data\especificos" --invisible
soffice --convert-to dbf "/home/atilio/arquivo.xlsx" --outdir "/home/atilio/Documents/" --invisible
Vale ressaltar, que para o devido funcionamento em ambientes Windows, você deve adicionar o caminho de execução do LibreOffice na Path do sistema.
Ex.:
Clique com o botão direito em Meu Computador > Propriedades > Configurações Avançadas do Sistema > Variáveis de Ambiente
Em variáveis do sistema, ache a variável Path, clique em editar, no fim da variável, pressione ';', e coloque o caminho da instalação
como C:\Program Files (x86)\LibreOffice 3.5\program\
Para testar, pelo MS-DOS (Prompt de Comando), execute:
> soffice --help
/*/
User Function zExcel2DBF(cOrigem, cDestino)
Local cComando := ""
Local cArq := ""
Local cCamFull := GetSrvProfString ("ROOTPATH","") + cDestino
Local lOk := .f.
Local cRaiz := ""
//Se for servidores, linux / unix / bsd, a barra será normal (/) e a raíz será '/'
If IsSrvUnix()
cArq := SubStr(cOrigem,RAT("/",cOrigem)+1,Len(cOrigem))
cCamFull := StrTran(cCamFull,"\","/")
cRaiz := "/"
//Se não (Windows), a barra será invertida (\) e a raíz será 'C:\'
Else
cArq := SubStr(cOrigem,RAT("\",cOrigem)+1,Len(cOrigem))
cCamFull := StrTran(cCamFull,"/","\")
cRaiz := "C:\"
EndIf
//Gerando o comando de conversão do LibreOffice, também é possível utilizar o scalc
cComando += 'soffice --convert-to dbf "'+cCamFull+cArq+'" --outdir "'+SubStr(cCamFull,1,Len(cCamFull)-1)+'" --invisible'
//Copiando o arquivo da estação para o servidor
CpyT2S(cOrigem, cDestino)
//Gravando e Executando o comando no servidor, aguardando ele ser executado, passando a raiz como referência
MemoWrite(cDestino+"comando.txt", cComando)
lOk := WaitRunSrv(cComando, .T., cRaiz)
Return lOk
/*/{Protheus.doc} zTstConv
Testa a conversão de arquivos xls e monta uma tabela temporária para manipulação
@author Atilio
@since 10/10/2014
@version 1.0
@example
u_zTstConv()
/*/
User Function zTstConv()
Local aArea := GetArea()
Local cTabTmp := 'TMP'
Local cArqXLS := 'C:\TOTVS\arquivo.xlsx'
Local cArqDBF := ''
Local cDirSrv := '\especificos\'
Local nLinha := 1
Local lGerou := .F.
//Se não existir o diretório, cria
If !ExistDir(cDirSrv)
MakeDir(cDirSrv)
EndIf
//Pegando o nome arquivo dbf, tirando o caminho absoluto e a extensão
cArqDBF := SubStr(cArqXLS, RAt('\', cArqXLS)+1, Len(cArqXLS))
cArqDBF := SubStr(cArqDBF, 1, At('.',cArqDBF))
cArqDBF += "dbf"
//Convertendo de xls para dbf
lGerou := u_zExcel2DBF(cArqXLS, cDirSrv)
//Se o dbf estiver gerado
If lGerou
//Usando o dbf como tabela temporária
dbUseArea(.T., "DBFCDXADS", cDirSrv+cArqDBF, cTabTmp, .T., .F.)
(cTabTmp)->(DbGoTop())
//Enquanto tiver registros na tabela temporária
While !((cTabTmp)->(EoF()))
nLinha++
(cTabTmp)->(DbSkip())
EndDo
(cTabTmp)->(DbCloseArea())
EndIf
RestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.

