Uso la clase TFileXls para exportar datos a archivos Excel, todo funciona bien y super rápido; pero resulta que siempre esa exportación la hago a un archivo que tiene siempre el mismo nombre; pero cuando el dichoso archivo esta abierto, se da un problema.
El programa se ejecuta bien, pero el archivo como esta abierto se queda con los datos que tenía originalmente, si cierro el archivo en Excel, e intento de nuevo a creación del archivo Excel ahi si se genera bien.
Que puedo hacer, o que se hace para saber si el archivo esta abierto y previemente cerrarlo.
Saludos
Fernando Espinoza
Detectar archivo abierto en clase TFileXls
Utiliza la funcion FOPEN() y que lo intente abrir en EXCLUSIVA, si no puede,fespinoza wrote:Horacio
Ya intente eso, lo que pasa es que no se lo puede borrar al archivo porque esta abierto; entonces lo mejor sería primero cerarlo en Excel y ahi si sobreescribirlo.
porque esta en uso, entonces ya sabes que esta en uso
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Re: Detectar archivo abierto en clase TFileXls
Buenas tardes para todos
Vuelvo a abrir este hilo.... por que estoy buscando detectar si un archivo en excel esta abierto... , el codigo es el siguiente:
El problema es que siempre dice que no hay nadie mas abriendo el archivo...... devuelve resultados como 1125,1116
De antemano gracias
Saludos
Vuelvo a abrir este hilo.... por que estoy buscando detectar si un archivo en excel esta abierto... , el codigo es el siguiente:
Code: Select all
If ( nHF := FOPEN("C:\xpmake\dbfs\importar.xlsx", "W" ) ) = -1
Msginfo( "Archivo Abierto por otro usuario")
Else
Msginfo( "No hay nadie mas abriendo el archivo")
EndIf
De antemano gracias
Saludos
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
Re: Detectar archivo abierto en clase TFileXls
Estimado:
Yo lo que hago es capturar la ventana para verificar si el archivo esta abierto en el excel y mandarlo a cerrar:
cFile3:='NV'+OT:CMES
oWndCapt := TWCapture():New( "Microsoft Excel - "+cFile3)
if oWndCapt:lCaptured
MSGALERT('El archivo '+cFile3+' se encuentra en uso.'+CRLF+;
'Cierre el archivo para gener uno nuevo','Archivo abierto')
oWndCapt:Setfocus()
oWndCapt:End()
FOR I:=1 TO 10
oWndCapt := TWCapture():New( "Microsoft Excel - "+cFile3)
if oWndCapt:lCaptured
syswait(4)
IF I == 10
MSGALERT('El archivo '+cFile3+' se encuentra en uso.'+CRLF+;
'Cierre el archivo para gener uno nuevo','Archivo abierto')
RETURN NIL
ENDIF
else
EXIT
endif
NEXT
IF FILE(cFile)
FERASE(cFile)
ENDIF
else
* ? 'no se pudo capturar la ventana'
endif
Saludos
Daniel Puente
Santa Cruz, Argentina
danielpuente101@gmail.com
Yo lo que hago es capturar la ventana para verificar si el archivo esta abierto en el excel y mandarlo a cerrar:
cFile3:='NV'+OT:CMES
oWndCapt := TWCapture():New( "Microsoft Excel - "+cFile3)
if oWndCapt:lCaptured
MSGALERT('El archivo '+cFile3+' se encuentra en uso.'+CRLF+;
'Cierre el archivo para gener uno nuevo','Archivo abierto')
oWndCapt:Setfocus()
oWndCapt:End()
FOR I:=1 TO 10
oWndCapt := TWCapture():New( "Microsoft Excel - "+cFile3)
if oWndCapt:lCaptured
syswait(4)
IF I == 10
MSGALERT('El archivo '+cFile3+' se encuentra en uso.'+CRLF+;
'Cierre el archivo para gener uno nuevo','Archivo abierto')
RETURN NIL
ENDIF
else
EXIT
endif
NEXT
IF FILE(cFile)
FERASE(cFile)
ENDIF
else
* ? 'no se pudo capturar la ventana'
endif
Saludos
Daniel Puente
Santa Cruz, Argentina
danielpuente101@gmail.com
Re: Detectar archivo abierto en clase TFileXls
Debes cerrar el excel y se cierran las planillas abiertas
Code: Select all
CerrarProceso ( "EXCEL.EXE" )
....
FUNCTION CerrarProceso ( cProceso )
Local oWMIob, oWMIserver, aProcess, objProcess
try
oWMIob := CreateObject( "wbemScripting.SwbemLocator" )
catch
RETURN nil
END
oWMIserver := oWMIob:ConnectServer()
aProcess :=oWMIserver:ExecQuery( "Select * from Win32_Process" )
For Each objProcess in aProcess
IF UPPER(objProcess:Name) = UPPER(cProceso)
objProcess:Terminate()
Endif
next
RETURN nil
Saludos,
Adhemar C.
Adhemar C.