Página 1 de 1

Gravar relatório como XLS

Enviado: 22 Abr 2009 15:08
por JAIR RANGEL
Olá, Pessoal !

Alguém poderia me indicar uma maneira de gravar um relatório como planilha do Excel !
Estou gravando um DBF temporário durante o processamento do relatório. Ao final deste, renomeio o DBF para XLS. Assim funciona.
Mas gostaria de emitir o realtório direto no formato XLS !
Assim, não seria necessário gravar um DBF.

Não sei se me fiz entender.
Mesmo assim, obrigado pra quem responder !

:D

Re: GRAVAR RELATÓRIO COMO XLS

Enviado: 24 Abr 2009 13:21
por sygecom
Olá Jair,

Abaixo tem alguns exemplos de como gerar excel:

Exemplo de como gerar um Excel apartir de um BROWSE na tela, esse pode ser mais util para você que esta em Hwgui, mas pode facilmente ser migrado para qualquer LIB visual.

Código: Selecionar todos

***********************
Function Gera_Excel(oTB)
***********************
local oSheet
local i,linha
Local cText := ""
LOCAL nRecord := 0, nCount := 0

TRY
   oExcel := GetActiveObject( "Excel.Application" )
CATCH
   TRY
      oExcel := CreateObject( "Excel.Application" )
   CATCH
      MsgStop( "Erro! O Excel não esta Ativado ou Não instalada nesse Computador","Aviso do Sistema")
      RETURN
   END
END

oExcel:WorkBooks:Add()
oSheet = oExcel:ActiveSheet

for i := 1 TO Len(oTB:aColumns)
   cCell  := oTB:aColumns[i]:heading
   oSheet:Cells( 1, i ):Value = cCell
next

Eval (oTB:bGoTop) // start from the top
linha=2

WHILE ! EOF() .AND. EVAL(oTB:bWhile)
   for i := 1 TO Len(oTB:aColumns)
      oCol := oTB:aColumns[i]:block
      uColData := Eval(oCol)

      do case
      case ValType(uColData) == "C" // characters
         if ! Empty(oTB:aColumns[i]:picture)
            cCell := Transform (alltrim(uColData), oTB:aColumns[i]:picture)
         else
            cCell := alltrim(uColData)
         endif
         cCell="'"+cCell
      case ValType(uColData) == "N" // numbers
         cCell := uColData
      case ValType(uColData) == "L" // logicals
         cCell := if (uColData, "Sim", "Nao")
      case ValType(uColData) == "D" // dates
         cCell := uColData
      otherwise
         cCell := "error"
      endcase
      oSheet:Cells( linha, i ):Value = cCell
   next

   IF EVAL(oTB:bFor)
     nCount++
   ENDIF
   linha++

   DBSKIP()
ENDDO

Eval (oTB:bGoTop)

oSheet:Rows( "1:1" ):Font:bold:=.t.
oSheet:Columns:AutoFit()
oExcel:Visible := .t.

Return NIL
Exemplo para gera excel para console a partir do tbrowse:

Código: Selecionar todos

*********************
Function TB2Excel(oTB)
*********************
local oExcel := CREATEOBJECT( "Excel.Application" )
local oSheet
local i,linha

oExcel:WorkBooks:Add()
oSheet = oExcel:ActiveSheet

for i := 1 TO oTB:ColCount
   oCol := oTB:GetColumn(i)
   cCell := oCol:Heading
   oSheet:Cells( 1, i ):Value = cCell
next

Eval (oTB:goTopBlock) // start from the top
linha=2
do while .t.
   for i := 1 TO oTB:ColCount
      oCol := oTB:GetColumn(i)
      uColData := Eval(oCol:Block) // column data (of yet unknown type)
      do case
      case ValType(uColData) == "C" // characters
         if ! Empty(oCol:picture)
            cCell := Transform (alltrim(uColData), oCol:picture)
         else
            cCell := alltrim(uColData)
         endif
         cCell="'"+cCell
      case ValType(uColData) == "N" // numbers
         cCell := uColData
      case ValType(uColData) == "L" // logicals
         cCell := if (uColData, "Sim", "Näo")
      case ValType(uColData) == "D" // dates
         cCell := uColData
      otherwise
         cCell := "error"
      endcase
      oSheet:Cells( linha, i ):Value = cCell
   next

   nTemp := Eval (oTB:SkipBlock, 1)
   if nTemp != 1
      exit
   endif
   linha++
enddo
Eval (oTB:goTopBlock)

oSheet:Rows( "1:1" ):Font:bold:=.t.
oSheet:Columns:AutoFit()
oExcel:Visible := .t.
return NIL
Exemplo de Excel com Grafico:

Código: Selecionar todos

FUNCTION EXCEL3_CHART
   Local oExcel, oHoja, oChart
   Local aDbf:={}
   GERAFILE()  // gera um nome temporario e guarda em cFILE
   // Creamos el archivo DBF de prueba
   AADD(Adbf,{"ENE","N",7,0})
   AADD(Adbf,{"FEB","N",7,0})
   AADD(Adbf,{"MAR","N",7,0})
   AADD(Adbf,{"ABR","N",7,0})
   dbcreate(cFILE,aDbf)

   // Lo cargamos con datos de prueba
   use (cFILE)
   append blank
   Replace ENE with 34,;
   FEB with 24,;
   MAR with 78,;
   ABR with 22

   append blank
   Replace ENE with 8,;
   FEB with 16,;
   MAR with 5,;
   ABR with 54

   append blank
   Replace ENE with 28,;
   FEB with 12,;
   MAR with 33,;
   ABR with 88

   USE // Cerramos el archivo DBF

   // Abrimos Excel
   oExcel:= CreateObject( "Excel.Application" )

   // Verificamos si hay error
   if Ole2TxtError() != 'S_OK'
     	MsgInfo('Excel no esta disponible','Advertencia')
      Return
   endif

   oExcel:Visible := .T. // Hacemos visibles los ca,bios

   oExcel:Workbooks:Open(cFILE) // Abrimos el BDF

   oExcel:Set("DisplayAlerts",.F.) // Deshabilitamos mensajes de Error

   oHoja:=oExcel:Get( "ActiveSheet" ) // Activamos la hoja

   oHoja:Range("A1:D4"):Select() // Definimos Rango

   oChart:=oExcel:Charts:Add() // Creamos una grafico de barras

   oChart:Hastitle:=.T. // Definimos el titulo
   oChart:ChartTitle:Text:="Titulo dos Grafico"
   oExcel:Visible := .t.
RETURN

Re: GRAVAR RELATÓRIO COMO XLS

Enviado: 26 Abr 2009 19:58
por JAIR RANGEL
Olá, Sygecon !

Obrigado por responder.
Vou verificar os fontes.
:xau

Gravar relatório como XLS

Enviado: 27 Set 2011 16:35
por Mario Mesquita
Boa tarde, colegas.

Estou com esse problema tambem, de fornecer um levantamento em formato .XLS e as dicas do forum estão me ajudando a buscar a solução. Falta coisa, mas vamos nessa...

Minha pergunta é: Alguem tem o sabe onde pegar alguma documentação sobre a OLE dos aplicativos Windows? Já vi com os tutoriais que os colegas aqui me arrumaram, vi nos downloads do forum, mas não encontrei nada sobre.

Alem de precisar de mais coisas sobre a criação/atualização do .XLS, como por exemplo, comando de gravação da planilha, etc. o conhecimento dos comandos da OLE possibilitam acesso a diversos recursos do ambiente muito uteis.

Se alguem tiver alguma informação, agradeço desde já.

Sds,
Mario.