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.