2011-08-30 13 views
6

Estoy trabajando en un gadget de Windows 7 que necesita extraer datos de un documento de Excel. El problema es que el proceso de Excel no se descargará una vez que haya recuperado los datos que necesito.Windows 7 Gadget no libera el objeto ActiveX

Aquí está el código que utilizo en mi función de inicialización:

var Excel = new ActiveXObject("Excel.Application"); 
    Excel.Visible = false; 
    Excel.DisplayAlerts = false; 
    var workbooks = Excel.Workbooks; 
    var workbook = workbooks.Open("\\\\SERVER\\Documents\\Sample.xlsx", 0, true); 
    var activesheet = workbook.ActiveSheet; 
    var cell = sheet.Cells(1, 1); 
    var value = cell.Value; 
    document.getElementById("content").innerHTML = value; 
    delete value; 
    value = null; 
    delete cell; 
    cell = null; 
    delete activesheet; 
    activesheet = null; 
    delete workbook; 
    workbook = null; 
    delete workbooks; 
    workbooks = null; 
    Excel.Quit(); 
    delete Excel; 
    Excel = null; 

Esto es todo envuelto en un bloque try-catch y puedo comprobar que todo está sucediendo. Todas las eliminaciones y las asignaciones nulas son mi intento de liberar cualquier referencia a los objetos COM, pero parece que me falta algo. ¿Hay alguna forma en que pueda forzar el proceso de Excel para descargar?

Respuesta

6

Así es como funciona Internet Explorer/JScript — las referencias se mantienen durante un período de tiempo hasta que se ejecuta el recolector de elementos no utilizados. La referencia debe ser recogida de basura después de un tiempo si establece la variable en null. También puede obligarlo a ser recogida mediante el uso de la (relativamente indocumentado) Método CollectGarbage() disposición de JScript y el IE:

var Excel = new ActiveXObject("Excel.Application"); 

//... blah ... 

Excel.Quit(); 
Excel = null; 
window.setTimeout(CollectGarbage, 10); 

cuenta que es necesario dejar una pequeña cantidad de tiempo (10 ms aquí) antes de llamar a CollectGarbage(), de lo contrario cuando llama a la función, es posible que la variable no se haya marcado aún para la recopilación.

relacionada artículo de soporte: http://support.microsoft.com/kb/266088

+0

Tenga en cuenta que esto sólo he probado ahora en un gadget de escritorio y puedo confirmar si remueve el proceso de la lista de procesos. –

+0

Impresionante: disculpe, me tomó un tiempo llegar a las pruebas, pero funciona como esperaba ahora. – Eclipse

+0

@Eclipse: no hay problema en absoluto :-) –

0

No tengo instalado Microsoft Office en mi máquina actual, pero creo que debe cambiar Excel.Quit() por Excel.Application.Quit().

Esto se debe a que Excel se inicializó como un objeto ActiveX, específicamente Excel.Application, y no Excel por sí mismo.

Cuestiones relacionadas