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.
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.
Bom dia Atilio, passando para agradecer, deu certo.
Obrigado!
Bom dia Victor, tudo joia?
Opa, nós que agradecemos pelo feedback.
Tenha um ótimo e abençoado fim de semana.
Um grande abraço.