Criando duas abas em um Excel usando a classe FWMsExcelXlsx | Ti Responde 0217

No vídeo de hoje, vamos demonstrar em como criar um arquivo Excel com duas abas usando a classe FWMsExcelXlsx.

A dúvida de hoje, nos perguntaram, como poderia ser criado um Excel, com duas abas (duas WorkSheets) separadas, com dados distintos de queries distintas usando a classe FWMsExcelXlsx.

 

Pensando nisso, montamos um exemplo, onde vamos mostrar em como criar as duas abas, adicionar uma tabela em cada aba, e adicionar informações de query em cada tabela.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"

//Declaração da namespace
Namespace custom.terminal.youtube

#Define CRLF Chr(13) + Chr(10) //Carriage Return Line Feed

/*/{Protheus.doc} User Function video0217
Excel de Clientes e Fornecedores
@author Atilio
@since 22/10/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
@example custom.terminal.youtube.u_video0217()
/*/

User Function video0217()
	Local aArea          := FWGetArea()                      As Array
	Local aParameters    := {}                               As Array
	Local cInitCustomer  := Space(TamSX3("A1_COD")[1])       As Character
	Local cLastCustomer  := StrTran(cInitCustomer, " ", "Z") As Character
	Local cInitSupplier  := Space(TamSX3("A2_COD")[1])       As Character
	Local cLastSupplier  := StrTran(cInitSupplier, " ", "Z") As Character
	
	//Adicionando os parametros do ParamBox
	aAdd(aParameters, {1, "Cliente De",     cInitCustomer,      "", ".T.", "SA1", ".T.", 80,  .F.})
	aAdd(aParameters, {1, "Cliente Até",    cLastCustomer,     "", ".T.", "SA1", ".T.", 80,  .T.})
	aAdd(aParameters, {1, "Fornecedor De",  cInitSupplier,   "", ".T.", "SA2", ".T.", 80,  .F.})
	aAdd(aParameters, {1, "Fornecedor Até", cLastSupplier,  "", ".T.", "SA2", ".T.", 80,  .T.})
	
	//Se a pergunta for confirmada, chama o preenchimento dos dados do .dot
	If ParamBox(aParameters, 'Informe os parâmetros', /*aRet*/, /*bOk*/, /*aButtons*/, /*lCentered*/, /*nPosx*/, /*nPosy*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
		Processa({|| exportExcel()})
	EndIf
	
	FWRestArea(aArea)
Return

/*/{Protheus.doc} exportExcel
Criacao do arquivo Excel na funcao video0217
@author Atilio
@since 22/10/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function exportExcel()
	Local cQuery          := ""                                                                                      As Character
	Local oFWMsExcel                                                                                                 As Object
	Local oExcel                                                                                                     As Object
	Local cFile           := GetTempPath() + 'video0217_' + dToS(Date()) + '_' + StrTran(Time(), ':', '-') + '.xlsx' As Character
	Local nCurrent        := 0                                                                                       As Numeric
	Local nTotal          := 0                                                                                       As Numeric
    //Aba 01 de Clientes
    Local cWorkSheet01    := "Clientes"                                                                              As Character
	Local cTitle01        := "Listagem de Clientes"                                                                  As Character
    //Aba 02 de Fornecedores
    Local cWorkSheet02    := "Fornecedores"                                                                          As Character
	Local cTitle02        := "Listagem de Fornecedores"                                                              As Character
	
	//Cria a planilha do excel
	oFWMsExcel := FWMsExcelXlsx():New()
	
	//Criando a aba da planilha (Clientes)
	oFWMsExcel:AddworkSheet(cWorkSheet01)
	
        //Criando a Tabela e as colunas
        oFWMsExcel:AddTable(cWorkSheet01, cTitle01)
        oFWMsExcel:AddColumn(cWorkSheet01, cTitle01, "Código", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet01, cTitle01, "Nome", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet01, cTitle01, "Nome Fantasia", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet01, cTitle01, "Site", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet01, cTitle01, "eMail", 1, 1, .F.)

        //Montando consulta de dados buscando os clientes
        cQuery := " SELECT "		+ CRLF
        cQuery += " A1_COD, "		+ CRLF
        cQuery += " A1_NOME, "		+ CRLF
        cQuery += " A1_NREDUZ, "		+ CRLF
        cQuery += " A1_HPAGE, "		+ CRLF
        cQuery += " A1_EMAIL "		+ CRLF
        cQuery += " FROM "		+ CRLF
        cQuery += "    " + RetSQLName("SA1") + " SA1 "		+ CRLF
        cQuery += " WHERE "		+ CRLF
        cQuery += "    A1_FILIAL = '" + FWxFilial("SA1") + "' "		+ CRLF
        cQuery += "    AND A1_COD >= '" + MV_PAR01 + "' "		+ CRLF
        cQuery += "    AND A1_COD <= '" + MV_PAR02 + "' "		+ CRLF
        cQuery += "    AND SA1.D_E_L_E_T_ = ' '"		+ CRLF
        cQuery += " ORDER BY "		+ CRLF
        cQuery += "    A1_COD "		+ CRLF
        
        //Executando consulta e setando o total da regua
        PlsQuery(cQuery, "QRY_DAD")
        DbSelectArea("QRY_DAD")
        
        //Definindo o tamanho da regua
        nCurrent := 0
        Count To nTotal
        ProcRegua(nTotal)
        QRY_DAD->(DbGoTop())
        
        //Percorrendo os dados da query
        While !(QRY_DAD->(EoF()))
            
            //Incrementando a regua
            nCurrent++
            IncProc("Adicionando registro " + cValToChar(nCurrent) + " de " + cValToChar(nTotal) + "...")
            
            //Adicionando uma nova linha
            oFWMsExcel:AddRow(cWorkSheet01, cTitle01, {;
                QRY_DAD->A1_COD,;
                QRY_DAD->A1_NOME,;
                QRY_DAD->A1_NREDUZ,;
                QRY_DAD->A1_HPAGE,;
                QRY_DAD->A1_EMAIL;
            })
            
            QRY_DAD->(DbSkip())
        EndDo
        QRY_DAD->(DbCloseArea())

    //Criando a aba da planilha (Fornecedores)
	oFWMsExcel:AddworkSheet(cWorkSheet02)
	
        //Criando a Tabela e as colunas
        oFWMsExcel:AddTable(cWorkSheet02, cTitle02)
        oFWMsExcel:AddColumn(cWorkSheet02, cTitle02, "Código", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet02, cTitle02, "Nome", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet02, cTitle02, "Nome Fantasia", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet02, cTitle02, "Site", 1, 1, .F.)
        oFWMsExcel:AddColumn(cWorkSheet02, cTitle02, "eMail", 1, 1, .F.)

        //Montando consulta de dados buscando os fornecedores
        cQuery := " SELECT "		+ CRLF
        cQuery += " A2_COD, "		+ CRLF
        cQuery += " A2_NOME, "		+ CRLF
        cQuery += " A2_NREDUZ, "		+ CRLF
        cQuery += " A2_HPAGE, "		+ CRLF
        cQuery += " A2_EMAIL "		+ CRLF
        cQuery += " FROM "		+ CRLF
        cQuery += "    " + RetSQLName("SA2") + " SA2 "		+ CRLF
        cQuery += " WHERE "		+ CRLF
        cQuery += "    A2_FILIAL = '" + FWxFilial("SA2") + "' "		+ CRLF
        cQuery += "    AND A2_COD >= '" + MV_PAR01 + "' "		+ CRLF
        cQuery += "    AND A2_COD <= '" + MV_PAR02 + "' "		+ CRLF
        cQuery += "    AND SA2.D_E_L_E_T_ = ' '"		+ CRLF
        cQuery += " ORDER BY "		+ CRLF
        cQuery += "    A2_COD "		+ CRLF
        
        //Executando consulta e setando o total da regua
        PlsQuery(cQuery, "QRY_DAD")
        DbSelectArea("QRY_DAD")
        
        //Definindo o tamanho da regua
        nCurrent := 0
        Count To nTotal
        ProcRegua(nTotal)
        QRY_DAD->(DbGoTop())
        
        //Percorrendo os dados da query
        While !(QRY_DAD->(EoF()))
            
            //Incrementando a regua
            nCurrent++
            IncProc("Adicionando registro " + cValToChar(nCurrent) + " de " + cValToChar(nTotal) + "...")
            
            //Adicionando uma nova linha
            oFWMsExcel:AddRow(cWorkSheet02, cTitle02, {;
                QRY_DAD->A2_COD,;
                QRY_DAD->A2_NOME,;
                QRY_DAD->A2_NREDUZ,;
                QRY_DAD->A2_HPAGE,;
                QRY_DAD->A2_EMAIL;
            })
            
            QRY_DAD->(DbSkip())
        EndDo
        QRY_DAD->(DbCloseArea())
	
	//Ativando o arquivo e gerando o arquivo
	oFWMsExcel:Activate()
	oFWMsExcel:GetXMLFile(cFile)
    oFWMsExcel:DeActivate()
	
	//Abrindo o excel e abrindo o arquivo
    oExcel := MsExcel():New()
	oExcel:WorkBooks:Open(cFile)
	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.

Deixe uma resposta

Terminal de Informação