Função que converte Excel XLS para DBF em AdvPL

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.

Procurando no Windows

Procurando no Windows

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.

Configurações avançadas do sistema

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.

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