delphi读完excel文件后,如何关闭excel线程?

blueflag 2006-11-11 10:30:55
我读取了excel文件内容,关闭程序后,却总是有excel线程在运行,而且这个时候如果再打开excel是打不开的啊~~ ~ 为什么啊?我是通过dll读取的~~
读取代码如下:

procedure TfrmInportData.Button1Click(Sender: TObject);
var
i, j: integer;
BoxNo: variant;
msExcel, msExcelWorkbook, msExcelWorkSheet: variant;
od: TOpenDialog;
begin
//动态创建打开Excel文件对话框
od := TOpenDialog.Create(Self);
od.Title := '请选择你要导入的Excel文件:';
od.Filter := 'Microsoft Excel文件(*.xls)|*.xls';
//创建Excel对象
msExcel := CreateOleObject('Excel.Application');
msExcel.displayAlerts := false; //禁止运行宏时显示警告和提示信息
msExcel.ScreenUpdating := false; //屏幕更新,提高速度
//打开指定Excel文件
try
try


if od.Execute then
begin
msExcelWorkbook := msExcel.Workbooks.Open(od.FileName, null, null, null, null, null, null, null, null, null, null, null, null, null, 0);
msExcelWorkSheet := msExcelWorkbook.Worksheets[1];
end;

//开始往stringgrid里面写数据

for i := 1 to msExcelWorkSheet.Rows.Count do

for j := 1 to 34 do
begin
BoxNo := msExcelWorkSheet.Range['a' + IntToStr(i)].value;
ProgressBar1.Visible:=true;
progressBar1.Position:=i;
if BoxNo <> '' then
begin

StrGrInport.RowCount := i + 1;
StrGrInport.Cells[0, i] := '第' + IntToStr(i) + '条';
StrGrInport.Cells[j, i] := msExcelworkSheet.Cells.Item[i + 1, j];
end
else
begin
label2.Caption := inttostr(i - 2); //记录当前条数
exit;
end;
end;
except
on E: Exception do
MessageBox(handle, PAnsiChar('错误信息: ' + E.message), '提示', MB_OK + MB_ICONINFORMATION);
end;
begin
//msExcel.Disconnect;//
msExcel.Quit;
showmessage('请选择Excel文件!');
exit;
end;
finally
ProgressBar1.Visible:=false;
showmessage('当前文件导入完毕,请检查并存盘!');
end;
msExcel.Disconnect;
msExcel.Quit;

end;

那里有问题呢???
...全文
936 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2006-11-11
  • 打赏
  • 举报
回复
msExcelWorkbook.Save;
msExcelWorkbook := Unassigned;

msExcel.Quit;
msExcel := Unassigned;

注意先后顺序。
blueflag 2006-11-11
  • 打赏
  • 举报
回复
To: ron_xin(星雨)

不行啊~~ 线程仍然有运行~~
这个释放我放到了
showmessage('当前文件导入完毕,请检查并存盘!');
end;
msExcel.Disconnect;
msExcel.Quit;
BoxNo :=Unassigned;
msExcel :=Unassigned;
.....
踢踏 2006-11-11
  • 打赏
  • 举报
回复
要释放variant变量
if (not VarIsEmpty(msExcel)) then msExcel.Quit;
msExcelWorkbook:=Unassigned;
msExcelWorkSheet:=Unassigned;
msExcel:=Unassigned;
ron_xin 2006-11-11
  • 打赏
  • 举报
回复
要释放variant变量
BoxNo: variant;
msExcel, msExcelWorkbook, msExcelWorkSheet: variant;


BoxNo :=Unassigned;
msExcel :=Unassigned;
.......
....
..
blueflag 2006-11-11
  • 打赏
  • 举报
回复
问题解决~~

msExcelWorkbook := msExcel.Workbooks.Open(od.FileName, null, null, null, null, null, null, null, null, null, null, null, null, null, 0);

这个忘掉关闭了~
.......
end;
finally
ProgressBar1.Visible:=false;
showmessage('当前文件导入完毕,请检查并存盘!');
msExcel.Workbooks.close; <<<<<-------------搞定~~
end;
msExcel.Disconnect;
msExcel.Quit;
msExcel := Unassigned;
end;
踢踏 2006-11-11
  • 打赏
  • 举报
回复
我前面的那种释放方法用了两三年了,在Win2000、WinXp上都用过,一直没什么问题。

那你要测试下,会不会把别的正在使用的Excel进程给杀掉了。
blueflag 2006-11-11
  • 打赏
  • 举报
回复
好像不是顺序的问题~~
msExcel := Unassigned; 这些语句,释放掉的只是对象名,或者说是接口,真正的东西没有释放掉啊~~

我这段代码用在了dll中~~
我想直接在内存中杀掉它,大家意见如何??
var
HwndCalculator : HWnd;
begin
TempExcelFile := ExTractFileName(UserExcelFileName);
HwndCalculator := Winprocs.FindWindow(nil,Pchar('Microsoft Excel - ' + TempExcelFile));
if HwndCalculator <> 0 then
SendMessage(HwndCalculator,WM_CLOSE,0,0);
end;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧