Gerando e abrindo o Excel com FWMsExcel, FWMsExcelXLSX e MsExcel – Maratona AdvPL e TL++ 234

Nesse vídeo demonstraremos a utilização das classes FWMsExcel e FWMsExcelXLSX que juntamente com a função MsExcel, servem para criar e abrir uma planilha do Excel.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

/*/{Protheus.doc} User Function zExe234
Gera um arquivo do Excel e abre
@type Function
@author Atilio
@since 20/02/2023
@see https://tdn.totvs.com/display/public/framework/FWMsExcel e https://tdn.totvs.com/display/public/framework/FWMsExcelXlsx
@obs 

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe234()
    Local aArea    := FWGetArea()
	Local aPergs   := {}
	Local cProdDe  := Space(TamSX3('B1_COD')[1])
	Local cProdAte := StrTran(cProdDe, ' ', 'Z')
	Local cTipoDe  := Space(TamSX3('B1_TIPO')[1])
	Local cTipoAte := StrTran(cTipoDe, ' ', 'Z')
	Local nOrden   := 1
    Local nTipoRel := 1
	
	//Adicionando os parametros do ParamBox
    aAdd(aPergs, {1, "Produto De",  cProdDe,  "", ".T.", "SB1", ".T.", 80,  .F.}) // MV_PAR01
    aAdd(aPergs, {1, "Produto Até", cProdAte, "", ".T.", "SB1", ".T.", 80,  .T.}) // MV_PAR02
    aAdd(aPergs, {1, "Tipo De",     cTipoDe,  "", ".T.", "02",  ".T.", 40,  .F.}) // MV_PAR03
    aAdd(aPergs, {1, "Tipo Até",    cTipoAte, "", ".T.", "02",  ".T.", 40,  .T.}) // MV_PAR04
    aAdd(aPergs, {2, "Ordenar por", nOrden,   {"1=Código do Produto", "2=Descrição do Produto", "3=Unidade de Medida"},  100, ".T.", .T.}) // MV_PAR05
    aAdd(aPergs, {2, "Tipo Relat.", nTipoRel, {"1=Excel XML", "2=Excel XLSX"},  80, ".T.", .T.}) // MV_PAR06
    
    //Se a pergunta for confirma, cria as definicoes do relatorio
    If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
        MV_PAR05 := Val(cValToChar(MV_PAR05))
        MV_PAR06 := Val(cValToChar(MV_PAR06))
		Processa({|| fGeraExcel()})
	EndIf
	
	FWRestArea(aArea)
Return

/*/{Protheus.doc} fGeraExcel
Criacao do arquivo Excel na funcao zRel21
@author Atilio
@since 11/12/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function fGeraExcel()
	Local cQryDad  := ""
	Local oFWMsExcel
	Local oExcel
	Local cArquivo    := GetTempPath() + "zRel21.xml"
	Local cWorkSheet := "Produtos"
	Local cTitulo    := "Listagem de Produtos"
	Local nAtual := 0
	Local nTotal := 0
	
	//Montando consulta de dados
	cQryDad := "SELECT "		+ CRLF
	cQryDad += "    B1_COD, "		+ CRLF
	cQryDad += "    B1_DESC, "		+ CRLF
	cQryDad += "    B1_TIPO, "		+ CRLF
	cQryDad += "    ISNULL(X5_DESCRI, '') AS TIPODESCR, "		+ CRLF
	cQryDad += "    B1_UM, "		+ CRLF
	cQryDad += "    ISNULL(AH_DESCPO, '') AS UMDESCR, "		+ CRLF
    cQryDad += "    B1_PESO "		+ CRLF
	cQryDad += "FROM "		+ CRLF
	cQryDad += "    " + RetSQLName("SB1") + " SB1 "		+ CRLF
	cQryDad += "    LEFT JOIN " + RetSQLName("SX5") + " SX5 ON ( "		+ CRLF
	cQryDad += "       X5_FILIAL = '" + FWxFilial("SX5") + "' "		+ CRLF
	cQryDad += "       AND X5_TABELA = '02' "		+ CRLF
	cQryDad += "       AND X5_CHAVE = B1_TIPO "		+ CRLF
	cQryDad += "       AND SX5.D_E_L_E_T_ = ' ' "		+ CRLF
	cQryDad += "    ) "		+ CRLF
	cQryDad += "    LEFT JOIN " + RetSQLName("SAH") + " SAH ON ( "		+ CRLF
	cQryDad += "       AH_FILIAL = '" + FWxFilial("SAH") + "' "		+ CRLF
	cQryDad += "       AND AH_UNIMED = B1_UM "		+ CRLF
	cQryDad += "       AND SAH.D_E_L_E_T_ = ' ' "		+ CRLF
	cQryDad += "    ) "		+ CRLF
	cQryDad += "WHERE "		+ CRLF
	cQryDad += "    B1_FILIAL = '" + FWxFilial("SB1") + "' "		+ CRLF
	cQryDad += "    AND B1_COD >= '" + MV_PAR01 + "' "		+ CRLF
	cQryDad += "    AND B1_COD <= '" + MV_PAR02 + "' "		+ CRLF
	cQryDad += "    AND B1_TIPO >= '" + MV_PAR03 + "' "		+ CRLF
	cQryDad += "    AND B1_TIPO <= '" + MV_PAR04 + "' "		+ CRLF
	cQryDad += "    AND B1_MSBLQL != '1' "		+ CRLF
	cQryDad += "    AND SB1.D_E_L_E_T_ = ' ' "		+ CRLF
	cQryDad += "ORDER BY "		+ CRLF
    cQryDad += "    B1_TIPO, "		+ CRLF
    If MV_PAR05 == 1
	    cQryDad += "    B1_COD "		+ CRLF
    ElseIf MV_PAR05 == 2
        cQryDad += "    B1_DESC "		+ CRLF
    ElseIf MV_PAR05 == 3
        cQryDad += "    B1_UM "		+ CRLF
    EndIf
	
	//Executando consulta e setando o total da regua
	PlsQuery(cQryDad, "QRY_DAD")
	DbSelectArea("QRY_DAD")
	
	//Cria a planilha do excel
    If MV_PAR06 == 1
	    oFWMsExcel := FWMSExcel():New()
    ElseIf MV_PAR06 == 2
        oFWMsExcel := FWMSExcelXLSX():New()
    EndIf
	
	//Criando a aba da planilha
	oFWMsExcel:AddworkSheet(cWorkSheet)
	
	//Criando a Tabela e as colunas
	oFWMsExcel:AddTable(cWorkSheet, cTitulo)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "Produto", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "Descrição", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "Tipo", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "Tp. Descrição", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "UM", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "UM Descrição", 1, 1, .F.)
	oFWMsExcel:AddColumn(cWorkSheet, cTitulo, "Peso", 3, 2, .F.)
	
	//Definindo o tamanho da regua
	Count To nTotal
	ProcRegua(nTotal)
	QRY_DAD->(DbGoTop())
	
	//Percorrendo os dados da query
	While !(QRY_DAD->(EoF()))
		
		//Incrementando a regua
		nAtual++
		IncProc("Adicionando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
		
		//Adicionando uma nova linha
		oFWMsExcel:AddRow(cWorkSheet, cTitulo, {;
			QRY_DAD->B1_COD,;
			QRY_DAD->B1_DESC,;
			QRY_DAD->B1_TIPO,;
			QRY_DAD->TIPODESCR,;
			QRY_DAD->B1_UM,;
			QRY_DAD->UMDESCR,;
			QRY_DAD->B1_PESO;
		})
		
		QRY_DAD->(DbSkip())
	EndDo
	QRY_DAD->(DbCloseArea())
	
	//Ativando o arquivo e gerando o xml
	oFWMsExcel:Activate()
	oFWMsExcel:GetXMLFile(cArquivo)
	
	//Abrindo o excel e abrindo o arquivo xml
	oExcel := MsExcel():New()
	oExcel:WorkBooks:Open(cArquivo)
	oExcel:SetVisible(.T.)
	oExcel:Destroy()
	
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.

4 Responses

  1. Victor disse:

    Bom dia Atilio, teria algum exemplo de como gerar um excel com duas abas, utilizando querys diferentes?

    • Bom dia Victor, tudo joia?

      Nós já fizemos no passado, geração de Excel com múltiplas Worksheets, mas um exemplo pronto disponível no site, ainda não temos.

      Vamos adicionar aqui na lista de sugestões para futuras pautas.

      De antemão, o que você pode fazer, é:
      1. Copiar o fonte desse exemplo
      2. Logo após o DbCloseArea da query, você executa sua nova query
      3. Adiciona o trecho das linhas 115 até 153 depois de executar a query
      4. Muda as variáveis para cWorkShee2 e cTitulo2

      Tenha uma ótima e abençoada quinta feira.

      Um grande abraço.

  2. Victor disse:

    Bom dia Atilio, passando para agradecer, deu certo.

    Obrigado!

Deixe uma resposta

Terminal de Informação