Detectar archivo abierto en clase TFileXls

Post Reply
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Detectar archivo abierto en clase TFileXls

Post by fespinoza »

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
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Post by horacio »

Se me ocurre que tendrías que comprobar la existencia del archivo antes de volver a generarlo

If( File( "c:\excel\archivoExcel.xls" ) )
Return 0
End
CreaArchivoExcel()
Return 0

Saludos
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post by fespinoza »

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.
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Post by thefull »

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.
Utiliza la funcion FOPEN() y que lo intente abrir en EXCLUSIVA, si no puede,
porque esta en uso, entonces ya sabes que esta en uso ;-)
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Detectar archivo abierto en clase TFileXls

Post by leandro »

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:

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
 
El problema es que siempre dice que no hay nadie mas abriendo el archivo...... devuelve resultados como 1125,1116

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 ]
puenteda
Posts: 19
Joined: Thu Oct 02, 2014 3:51 am

Re: Detectar archivo abierto en clase TFileXls

Post by puenteda »

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
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Detectar archivo abierto en clase TFileXls

Post by acuellar »

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.
Post Reply