Page 1 of 1

¿Cómo exportar listados DBF o Excel?

Posted: Thu Nov 10, 2005 1:06 pm
by Manuel Calomarde Gomez
Hola :-)

Pues nada, que tengo que poder exportar los listados de mi aplicación a Excel o a una DBF (preferiblemente a Excel).

¿Alguna forma o idea?

Gracias a todos :-) y un saludo

Posted: Thu Nov 10, 2005 1:18 pm
by dbzap
esta es mi forma ( al la vieja..... )

Function Dbf2Excel( oPadre, cFileDbf, lSQL, cOtraTabla, aOtrosCampos )
Local hExcel, oDDEs
Local Planilla, aNuevo, cCelda, xValor
Local cFileXls := Spac(250)
Local j, nRegistros, nCampos
Local cEjecut := "C:\MSOFFICE\EXCEL\Excel.Exe"
Local i := 0
Local lCerrarExcel := .F.
Local aTareas := GetTasks()
Local hStmt := 0
Local TMaes := {}
Local aResult := {}
Local nOpcion := 0
Local xCampos
Local qq := Chr(34)
MEMVAR DEFATMP

DEFAULT lSQL := .F.

If aScan( aTareas, {|x| "EXCEL.EXE" $ Upper(x) } ) > 0
* excel ya fue cargado en memoria
MsgStop(OemToAnsi("Debe cerrar Excel para realizar este proceso y luego continuar"),;
"Error de Operador")
Return NIL
EndIf

If !MsgGet( "Grabar en Archivo Excel...",;
OemToansi("Nombre de Salida (sin extension .xls)"),;
@cFileXls )
Return NIL
EndIf

cFileXls := AllTrim( cFileXls )
If File( cFileXls )
MsgStop("Nombre de archivo ya existe...","Error de Operador")
Return NIL
ElseIf Empty( cFileXls )
MsgStop("Nombre de archivo no corresponde...","Error de Operador")
Return NIL
EndIf

* parece que esta bueno
cFileXls := DEFATMP+"\"+cFileXls+".Xls"
SysRefresh()

oPadre:bDdeInit := {|hWndClient, cAppName, cTopicName| MsgBeep() }
oPadre:bDdeExecute := {|hWndClient, cCommand | &(cCommand) }

DEFINE DDE oDDEs ;
SERVICE "Excel" ;
TOPIC "System"

If aScan( aTareas, {|x| "EXCEL.EXE" $ Upper(x) } ) == 0
lCerrarExcel := .T.
If ( hExcel:= WinExec( cEjecut, 8) ) < 32
If hExcel > 0
MsgStop( "Excel no cargado..." )
Return Nil
Endif
EndIf
Else
lCerrarExcel := .F.
* excel ya fue cargado en memoria
EndIf

hExcel := GetWndTask(1)
If hExcel = Nil
MsgInfo( "Programa Excel no encontrado")
Return Nil
Endif

ACTIVATE DDE oDDEs
CursorWait()

Select (cFileDbf)
COPY TO _Dbf2Xls

oDDEs:Execute("[Open(" +qq+ DEFATMP+"\_Dbf2Xls.Dbf" +qq+ ")]")
oDDEs:Execute( "[Save.As(" +qq+ cFileXls +qq+ ",1)]" )

If lCerrarExcel
SendMessage( hExcel, WM_DESTROY )
EndIf
oDDEs:End()
oDDEs := Nil

CursorArrow()

Borrar( "_Dbf2Xls.dbf" )

Return NIL
//-----------------------------------

ademas viktor tomas tiene una clase re-buena para hacer conexion con excel, creo que se llama TFILEXLS.

Saludos y espero te sirva.

OK peroooo ¿DDE?

Posted: Thu Nov 10, 2005 1:28 pm
by Manuel Calomarde Gomez
Hola :-)

Muchas muchas gracias por la superrespuesta.
Solo una cosa ¿Que es DDE?

Un saludo :-)

Posted: Thu Nov 10, 2005 6:14 pm
by dbzap
de lo que entiendo es Dinamic Data Exchange, o intercambio dinamico de datos....
ahora saber que es exactamente...mmmm dificil.

se que lo hace y eso me deja tranquilo un rato.
Saludos

Posted: Thu Nov 10, 2005 8:24 pm
by Canarias
DDE = Dynamic Data Exchange.
Intercambio Dinámico de Datos. Conjunto de especificaciones de Microsoft para el intercambio de datos y control de flujo entre aplicaciones.

Saludos

Posted: Fri Nov 11, 2005 1:40 am
by R.F.
Si estas trabajando a 16 bits utiliza la FileXLS de Ramon Avendaño, te genera archivos XLS nativos de Excel sin necesidad de DDE ni de OLE, es mas, no necesitas tener ni siquiera excel instalado.

OK gracias perooo :-)

Posted: Fri Nov 11, 2005 7:42 am
by Manuel Calomarde Gomez
OK, ya veo lo de DDE pero supongo que es necesaria una librería al respecto ¿o no?

Muchisimas gracias a todos y un saludo :-)

Posted: Fri Nov 11, 2005 11:15 am
by Antonio Linares
Manuel,

El DDE lo proporciona Windows automaticamente, de todas maneras, como te indica René, lo idóneo es usar la clase de Ramón que te evita tener que usar DDE, tener Excel instalado, etc. Pero ambas soluciones te servirán.