【求助】关于JavaScript里ActiveXobject对象内存释放的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 zhbwyztl
  • 开始时间 开始时间
Z

zhbwyztl

Unregistered / Unconfirmed
GUEST, unregistred user!
最近写了一个段JavaScript代码,实现网页数据保存到EXCEL的功能。
有一个奇怪的现象。
下面是代码:
try {
var xls = new ActiveXObject ( "Excel.Application"
);
}
catch(e)
{
alert( "Open Excel Faile!");
return ;
}
xls.visible = true;
var xlBook = xls.Workbooks.Add;
var xlsheet = xlBook.Worksheets(1);
xlsheet.Select;
//填充数据
xlsheet.Cells(1,1).Select;

var fname = xls.Application.GetSaveAsFilename("*.xls", "Excel Spreadsheets (*.xls), *.xls");
if (fname!="") xlBook.SaveAs(fname);
xlBook.Close (savechanges=false);

xls.Quit();
上面的代码大家应该比较熟悉了,
问题就在最后一句话: xls.Quit();
数据保存完毕后,内存里多了一个EXCEL的进程,
如果不主动刷新页面,这个进程就一直在内存里呆着,不释放!!!
这时如果通过资源管理器打开刚刚保存的文件,系统会一直处于等待状态!
如果保存完数据,主动刷新一下页面,那个EXCEL进程就释放了,再打开保存的文件一切正常。
我想,问题可能出在JAVA虚拟机的内存回收上,代码执行完后,xls对象句柄没有马上释放,好像在等待什么!
请教高手,这个问题该怎么解决?
是代码本身有问题吗?
 
最近写了一个段JavaScript代码,实现网页数据保存到EXCEL的功能。
有一个奇怪的现象。
下面是代码:
try {
var xls = new ActiveXObject ( "Excel.Application"
);
}
catch(e)
{
alert( "Open Excel Faile!");
return ;
}
xls.visible = true;
var xlBook = xls.Workbooks.Add;
var xlsheet = xlBook.Worksheets(1);
xlsheet.Select;
//填充数据
xlsheet.Cells(1,1).Select;

var fname = xls.Application.GetSaveAsFilename("*.xls", "Excel Spreadsheets (*.xls), *.xls");
if (fname!="") xlBook.SaveAs(fname);
xlBook.Close (savechanges=false);

xls.Quit();
上面的代码大家应该比较熟悉了,
问题就在最后一句话: xls.Quit();
数据保存完毕后,内存里多了一个EXCEL的进程,
如果不主动刷新页面,这个进程就一直在内存里呆着,不释放!!!
这时如果通过资源管理器打开刚刚保存的文件,系统会一直处于等待状态!
如果保存完数据,主动刷新一下页面,那个EXCEL进程就释放了,再打开保存的文件一切正常。
我想,问题可能出在JAVA虚拟机的内存回收上,代码执行完后,xls对象句柄没有马上释放,好像在等待什么!
请教高手,这个问题该怎么解决?
是代码本身有问题吗?
 
各位大侠:
没有看到我的问题?!
还是我的问题太简单了?!
我自己顶顶吧,不然,沉到底了!!!!!!!!
大侠们可以试试吗?看看问题是不是真存在!
谢谢了!
我自己有个半通的解决办法:
在最后加一句话:
document.exeComond("Refresh");
自动刷新页面,那个EXCEL进程也可以自动释放,
但又带来一个新问题:
如果页面是刚刚访问完数据库,或者其他什么的,用户会得到一个重新访问页面的提示,
不太友好!
大侠们,别睡着了!!!!!
 
是我提问的地方不对吧?
斑竹呢?
告诉我该在哪儿提?
 
JavaScript不是运行在JAVA虚拟机上的,这是两个不同的东西。
还有,用JavaScript来杀死 进程是不可能的。
 
用xls.Application.Quit();来试一下。
 
谢谢:yangxiao_jiang!
“xls.Application.Quit();”这样写法我以前也试过了,
但是,效果一样!
我并不是想杀死什么进程,只是,这是一个需要解决的问题!
 
试试加一行
xls=null;
如果还是不行,就把这段代码放到隐藏帧去做吧,做完刷一下隐藏帧也不会有什么大不了的了。
 
后退
顶部