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.
Ola, td bem? vc tem algum exemplo ao invés de abrir a planilha, mandar direto pra impressora?
Bom dia Antonio, tudo joia graças a Deus e você?
Você poderia tentar usar a ExecInClient() ou um ShellExecute() mandando o comando para ir para impressora, ao invés de dar o Open na MsExcel.
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.
Bom dia! Se so estiver o BrOffice instalado na maquina esta classe vai funcionar?
Obrigado!
Marcos
Bom dia Marcos, tudo joia?
A montagem da planilha sim (FWMsExcel*), agora a abertura dela não (MsExcel).
Então, a primeira parte do fonte para a montagem da planilha, você pode aproveitar, agora a segunda parte para abrir ela, ou você aciona o programa padrão via ShellExecute para abrir o arquivo ou você aciona direto na pasta onde esta instalado o outro office.
Tenha uma ótima e abençoada sexta feira.
Um forte abraço.