起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 244|回复: 6

【结贴】excel进程无法退出

[复制链接]
发表于 2010-4-23 09:27:22 | 显示全部楼层 |阅读模式
我们把所有对象创建后,再按顺序释放后,excel的进程在任务管理嚣中还存在。

代码如下:
lExcel:=comobj.CreateOleObject('Excel.application');
  lapp :=system.DispatchHelper.Create(lexcel);
  lWorkBook:=lApp.PropertyGet('WorkBooks',[]);
  ldocs :=system.DispatchHelper.Create(lWorkBook) ;
  ldocs.InvokeMethod('ADD',[]);
  lOsheet:=lapp.PropertyGet('Sheets',[]);
  lsheets :=system.DispatchHelper.Create(lOsheet);
  lsheetNum :=lsheets.PropertyGet('Count',[]);

    lsheets.InvokeMethod('Add',[]);  //这代码加上excel 进程就还在。注释后在任务管理器中有没有excel的进程了



   //保存Excel
  lOAD:=lApp.PropertyGet('ActiveWorkbook',[]);
  lADoc:=System.DispatchHelper.Create(lOAD);
  lADoc.InvokeMethod('saveas', [lOpenDialog.FileName+'.xls']);

  lADoc.InvokeMethod('Close',[]) ;
  ldocs.InvokeMethod('close',[]) ;

  lApp.InvokeMethod('Quit', []);

  ( lOAD  as System.IDisposable).Dispose ;
  (lOsheet as System.IDisposable).Dispose;
  (lWorkBook as System.IDisposable).Dispose;
  (lExcel as System.IDisposable).Dispose;
回复

使用道具 举报

发表于 2010-4-23 09:49:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-23 09:55:40 | 显示全部楼层
这我们都看了几次了。都按上面说的做的。结果还是一样
lsheets.InvokeMethod('Add',[]);  //这代码加上excel 进程就还在。注释后在任务管理器中有没有excel的进程了
帮忙看一下这。去掉这代码就没问题了
回复 支持 反对

使用道具 举报

发表于 2010-4-23 10:39:23 | 显示全部楼层
完整代码贴一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-23 10:47:00 | 显示全部楼层
procedure TSBZGSCT.CSExcel;
var
   I,lJ:Integer;
   lExcel,lWorkBook,lOsheet,lSheetNum,lOWorksheetbject;
   lOADbject;
   lApp,ldocs,ldoc,lSheets,lADoc:system.DispatchHelper;
   lWorksheet{,lworksheet}:system.DispatchHelper;
   lOpenDialog:TOpenDialog;
begin
  lOpenDialog := TSaveDialog.Create(nil);
  lOpenDialog.Filter := 'Microsoft Excel (*.xls|*.xls|All files (*.*)|*.*';
  if not lOpenDialog.Execute then   exit ;
  if FileExists(lOpenDialog.FileName+'.xls')  then
  begin
    if JsDialogs.ConfirmBox('该文件已经存在,是否要覆盖该文件?','询问',2)=false
     then
      exit;
  end;
//创建Excel
  lExcel:=comobj.CreateOleObject('Excel.application');
  lapp :=system.DispatchHelper.Create(lexcel);
  lWorkBook:=lApp.PropertyGet('WorkBooks',[]);
  ldocs :=system.DispatchHelper.Create(lWorkBook) ;
  ldocs.InvokeMethod('ADD',[]);
  lOsheet:=lapp.PropertyGet('Sheets',[]);
  lsheets :=system.DispatchHelper.Create(lOsheet);


    lsheets.InvokeMethod('Add',[]); //这代码加上excel 进程就还在。注释后在任务管理器中有没有excel的进程了

  
    //保存Excel
  lOAD:=lApp.PropertyGet('ActiveWorkbook',[]);
  lADoc:=System.DispatchHelper.Create(lOAD);
  lADoc.InvokeMethod('saveas', [lOpenDialog.FileName+'.xls']);

lADoc.InvokeMethod('Close',[]) ;
  ldocs.InvokeMethod('close',[]) ;

  lApp.InvokeMethod('Quit', []);

  ( lOAD  as System.IDisposable).Dispose ;
  (lOsheet as System.IDisposable).Dispose;
  (lWorkBook as System.IDisposable).Dispose;
  (lExcel as System.IDisposable).Dispose;
end;
回复 支持 反对

使用道具 举报

发表于 2010-4-23 10:48:10 | 显示全部楼层
lsheets.InvokeMethod('Add',[]);
这句话返回的是一个对象,你要定义一个,然后释放他。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-23 11:21:29 | 显示全部楼层
谢谢,明白了!解决问题,结帖吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-9 04:14 , Processed in 0.035864 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表