Se você já precisou gerar um Excel de uma tela com FWBrowse, veja essa função criada.
Antes de acionar a rotina, ela foi pensada em FWBrowse que utilizem tabela temporária, então duas variáveis Private devem ser criadas antes de acionar a função.
A primeira variável é a cAliasTmp que é o nome do alias usado na tela, e a segunda é a aColunas, que é o array com os dados de FWBrwColumn.
A partir disso, basta acionar u_zBrw2Exc(), seja em um botão, ou em algum bloco de código que dessa forma irá gerar automaticamente o Excel.
Abaixo o código fonte desenvolvido:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zBrw2Exc Função que exporta dados de um FWBrowse para Excel @type Function @author Atilio @since 02/06/2021 @obs A variável aColunas (array com FWBrwColumn) tem que ser uma variável Private antes de acionar esse fonte E a variável cAliasTmp também deve ser Private, com o nome da temporária usada na tela /*/ User Function zBrw2Exc() Processa({|| fExportar()}, "Processando...") Return Static Function fExportar() Local aAreaTmp := (cAliasTmp)->(GetArea()) Local nColAtu := 0 Local nAtual := 0 Local oFWMsExcel Local oExcel Local cArquivo := GetTempPath() + "browse_" + dToS(Date()) + "_" + StrTran(Time(), ":", "-") + ".xml" Local cWorkSheet := "Planilha" Local cTituloExc := "Exportação de Informações" Local aLinha := {} //Cria a planilha do excel oFWMsExcel := FWMSExcel():New() //Criando as abas da planilha oFWMsExcel:AddworkSheet(cWorkSheet) //Criando as Tabelas e as colunas oFWMsExcel:AddTable(cWorkSheet, cTituloExc) For nColAtu := 1 To Len(aColunas) //Se a coluna for numérica, alinha a direita If aColunas[nColAtu]:cType == "N" oFWMsExcel:AddColumn(cWorkSheet, cTituloExc, aColunas[nColAtu]:cTitle, 3, 2, .F.) //Senão, alinha a esquerda Else oFWMsExcel:AddColumn(cWorkSheet, cTituloExc, aColunas[nColAtu]:cTitle, 1, 1, .F.) EndIf Next //Posiciona no topo da temporária DbSelectArea(cAliasTmp) (cAliasTmp)->(DbGoTop()) Count To nTotal ProcRegua(nTotal) (cAliasTmp)->(DbGoTop()) //Enquanto houver dados While ! (cAliasTmp)->(EoF()) nAtual++ IncProc("Adicionando na planilha registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...") aLinha := {} For nColAtu := 1 To Len(aColunas) aAdd(aLinha, eVal(aColunas[nColAtu]:bData)) Next oFWMsExcel:AddRow(cWorkSheet, cTituloExc, aLinha) (cAliasTmp)->(DbSkip()) EndDo //Esperando 5 segundos para gerar o arquivo Sleep(5000) //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() RestArea(aAreaTmp) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.