[求助]DELPHI合并多个EXCEL文件后仍有EXCEL进程 ( 积分: 200 )

  • 主题发起人 主题发起人 blackeagle136
  • 开始时间 开始时间
B

blackeagle136

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
这段程序是将多个EXCEL文件合并为一个文件,操作完成后已经退出了EXCEL并释放了变量,但是任务管理器里还是有EXCEL进程,这个问题已经困扰我很多天了,请各位大侠帮忙看看问题出在哪里,多谢!
procedure TCollect.copydata(Sender: TObject);
var
fnames,fnamed,INIFileName,fnr: string;
mwhd,fnc,IC,ffn,iv: integer;
begin
iv:=1;
fnamed:='汇总模板';
ExApp := CreateOleObject( 'Excel.Application' );
ExApp.Visible:=False;
ExApp.WorkBooks.Open( ExtractFilePath(Application.Exename)+fnamed+'.xls');
INIFileName:=ExtractFilePath(paramstr(0))+'/'+'config.ini';
MyIniFile:=TIniFile.Create(INIFileName);
IC:=StrToInt(MyIniFile.ReadString('文件名','FNC','err'));
ProgressBar.Max :=IC;
for fnc:=1 to IC do
begin
ProgressBar.StepBy(1);
fnames:=MyIniFile.ReadString('文件名','FN'+IntToStr(fnc),'err');
doing.Caption:=fnames;
Application.ProcessMessages;
ExApp.WorkBooks.Open(Pathshow.Text+'/'+fnames+'.xls',EmptyParam,True);
sheetd:=ExApp.WorkBooks[1].WorkSheets[1];
sheets:=ExApp.WorkBooks[2].WorkSheets[1];
if ExApp.WorkBooks[1].readon_ly=true then
begin
showmessage('目标文件只读,可能已经打开,请关闭文件后再试一次。');
ExApp.DisplayAlerts:=false;
ExApp.quit;
ExApp:=Unassigned;
sheets:=Unassigned;
sheetd:=Unassigned;
exit;
end;
sheets.Activate;
mwhd:=sheetd.UsedRange.rows.count;
if ExApp.CountA(sheetd.Rows[mwhd]) = 0 then
begin
repeat
mwhd:=mwhd-1;
until
ExApp.CountA(sheetd.Rows[mwhd]) <> 0;
end;
if FillName.Checked then
for ffn:=iv to mwhd-1 do
sheetd.Cells[ffn+1,11].value:=fnr;
iv:=mwhd+1;
fnr:=fnames;
if ExApp.CountA(sheetd.Rows[mwhd+1]) = 0 then
begin
sheets.UsedRange.copy;
sheetd.Activate;
sheetd.Range['A'+IntToStr(mwhd+1)].Select;
sheetd.Paste;
if (FillName.Checked) and (fnc=IC) then
begin
mwhd:=sheetd.UsedRange.rows.count;
repeat
mwhd:=mwhd-1;
until
ExApp.CountA(sheetd.Rows[mwhd]) <> 0;
for ffn:=iv to mwhd-1 do
sheetd.Cells[ffn+1,11].value:=fnames;
end;
end
else
begin
showmessage('末尾行计算错误,为防止数据被覆盖,将终止操作,请检查。'+inttostr(mwhd));
ExApp.DisplayAlerts:=false;
ExApp.quit;
ExApp:=Unassigned;
sheets:=Unassigned;
sheetd:=Unassigned;
exit;
end;

//关闭EXCEL源文件
//ExApp.WorkBooks[1].save;
ExApp.DisplayAlerts:=False;
ExApp.WorkBooks[2].close;
end;
ExApp.DisplayAlerts:=False;
sheetd.Cells[5,5].Select;
ExApp.WorkBooks[1].SaveAs(Pathshow.Text+'/'+'汇总.xls');
ExApp.WorkBooks[1].close;
ExApp.quit;
ExApp:=Unassigned;
sheets:=Unassigned;
sheetd:=Unassigned;
doing.Caption:='汇总完成。';
Application.Terminate;
end;
 
一部分一部分运行,先进行一小部分操作,然后关闭EXCEL,看是否成功。
 
不行,我曾经只让软件操作一个小的文档,但是不行,内存中仍然有EXCEL进程.
 
//楼主先执行这段代码 看看有无进程存留 如果没有,则再慢慢的找问题
procedure TForm1.Button1Click(Sender: TObject);
var
ExApp: OleVariant;
begin
ExApp := CreateOleObject('Excel.Application' );
ExApp.Visible:=False;
ExApp.quit;
ExApp:=Unassigned;
end;
 
Avalon:这段代码没有问题,我以前编的软件都是用这种方法退出EXCEL,都没有问题,这次不知道是什么原因,就是在内存中有EXCEL进程.
 
最好的方法只好逐行的屏蔽代码来找了 看看能不能定位在某一行上
 
Avalon:我试过,把EXCEL设置为可见状态,看到EXCEL正常退出,文件正常关闭,可是
ExApp:=Unassigned;
sheets:=Unassigned;
sheetd:=Unassigned;
执行完后,内存中的EXCEL进程没有变化,仍然留在内存中.
 
做个极端的考量

if ExApp.WorkBooks[1].readon_ly=true then
改为
if ExApp.WorkBooks[1].readon_ly=false then

其实就是不让做任何实质的文件操作 是否还有进程存留??
 
只要是分配了变量,退出是就会有进程残留,郁闷啊!
 
分配了变量 具体在那一行呢?
 
根据我的感觉,只要你引用了EXCEL对象体系中任何一个对象,如果没有释放就会有进程残留。

我原来用ACCESS VBA调用EXCEL,就遇到这个问题,后来一行一行试,最后发现 有引用了EXCEL对象的变量 没有显式释放,是自己水平问题。

不过是第一次,后来自己找出原因,自己解决。后来没有发生过。
 
Avalon:我用的是全局的变量,这只是程序的一部分,变量声明部分我没有贴出来,我刚才又看了看,发现程序应该没有多大问题,我这里有几个EXCEL文档,只要一操作一个叫PLC的文档就会有残留,别的文件则没有问题,文档是从别人那里拷来的,用EXCEL软件操作非常正常,也看不出这个文档和别的文档有什么区别,用
procedure TForm1.Button1Click(Sender: TObject);
var
ExApp: Variant;
begin
ExApp := CreateOleObject('Excel.Application' );
ExApp.workbooks.open('D:/PLC.xls');
ExApp.workbooks.close;
ExApp.Visible:=False;
ExApp.quit;
ExApp:=Unassigned;
end;
操作这个文档就会有残留,如果操作别的文档则能够全部释放,我用记事本打开这个文档可以发现Date: Fri, 2 Mar 2007 22:08:19 +0800
MIME-Version: 1.0
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106
的信息,不知道这个文档是不是用别的版本的EXCEL创建的,和我的系统环境不兼容?我的操作系统是2000 SP4 ,编程平台是Delphi 7.0 EXCEL2000,真不知道为什么会出现这样的怪问题,谢谢。
 
xukehg@yeah.net
这个问题我也是第一次遇到 不涉及保密的话 请将这个文件发给我吧
我们一起研究一下
 
Avalon:我已经将那个文件发给您了,请帮忙分析一下,谢谢了.
 
我也遇到过类似的问题,如果装的是Office2003则不能释放,但如果装的是Office2007时确能释放。
 
难道是我的OFFICE有问题?
 
我用OFFICE2003试了一下,没问题,能正常释放,可是OFFICE2000就不行,但是DELPHI7自带的控件就是OFFICE2000的啊,真不知道为什么?而且我用2000时,别的文件没问题,只有那一个文件有问题,又是为什么呢?郁闷......
 
在装Delphi的时候貌似有一个选择Office的版本的选项
 
是啊,我装的是2000的,安装的时候也是选的2000的啊
 
也就这样吧,谢谢大家了.
 
后退
顶部