我正在开发一个需要从 Excel 文档中提取数据的 Windows 7 小工具。问题是,在我检索到我需要的数据后,Excel 进程不会卸载。
这是我在初始化函数中使用的代码:
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;
这一切都包含在一个 try-catch block 中,我可以验证它是否全部成功。所有的删除和空赋值都是我试图释放对 COM 对象的任何引用,但我似乎遗漏了一些东西。有什么方法可以强制卸载 Excel 进程吗?
最佳答案
这就是 Internet Explorer/JScript 的工作方式——引用会保留一段时间,直到垃圾收集器运行。如果您将变量设置为 null
,引用应该在一段时间后被垃圾回收。您还可以使用 JScript 和 IE 可用的(相对未记录的)CollectGarbage()
方法强制收集它:
var Excel = new ActiveXObject("Excel.Application");
//... blah ...
Excel.Quit();
Excel = null;
window.setTimeout(CollectGarbage, 10);
请注意,您需要在调用 CollectGarbage()
之前留出少量时间(此处为 10 毫秒),否则当您调用该函数时,变量可能尚未被标记为收集。
Related support article: http://support.microsoft.com/kb/266088
关于javascript - Windows 7 小工具不释放 ActiveX 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7249465/