Delphi5控制Excel时,内存管理的问题(100分)

  • 主题发起人 主题发起人 tuba
  • 开始时间 开始时间
T

tuba

Unregistered / Unconfirmed
GUEST, unregistred user!
我要连续从100个Excel表中读取数据,我使用循环语句来控制,在循环体内,我都会打开(OPEN)当前要处理的Excel表,处理完后,再将其关闭(CLOSE)。
但是我发现,调用CLOSE方法以后,并不能马上关闭,也就不能马上释放内存,结果导致内存溢出,有什么办法能解决么?(呵呵呵呵呵.....加内存是不行了)
 
v := unassigned;
 
你有没把所有的对象都释放?
关闭Excel.

Try

ExcelApplication1.Quit;

ExcelWorksheet1.Disconnect;

ExcelWorkbook1.Disconnect;

ExcelApplication1.Disconnect;

Except

End;

 
li2老大,因为我要处理很多个文件(总数大概有3000个),所以我每处理完一个文件之后就调用workbook1.disconnect,全部处理完之后再调用Application1.disconnect。
使用过程中我发现,调用workbook1.disconnet之后,并不马上释放内存。
 
按照你这个处理方式,建议你不要使用Com,因为这样速度会n慢。
同时确实存在你说的不释放内存的问题。

========================
以下为摘抄
========================
用ADOTable控件打开Excel 文件
1)设置属性ConnetionString
选择 Microsoft Jet 4.0 OLE DB provider
Select or enter a datasorce name -> 选择你要打开Excel文件
User name默认是Admin 密码默认为空,可以不用理会
Extended properties 设为:Excel 8.0 (Excel 2000 好象不可以写成Excel 9.0)就可以读取Excel 97以下得版本的Excel文件

2)属性TableDirect 设为True (否则会出现“FROM 子句的语法错误。”的错误提示 )
3)这时可以从Table属性里面选择table了,所有的文件都是加了$符号的,程序中动态显示的话
可以参考我这个例子:
procedure TForm1.Button1Click(Sender: TObject);
var ProviderStr:string;
Str1,Str2,Str3:String;
SQLstr:string;
i:integer;
begin
ADOTable.Active:=False;
ProviderStr:=ADOTable.ConnectionString;
Str3:=StrPos(PChar(ProviderStr), PChar(';Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0'));
Str1:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=admin;';
Str2:='Data Source='+FileList1.FileName;
ADOTable.ConnectionString:=Str1+str2+str3;

for i:=Length(FileList.FileName) downto 1 do
if Copy(FileList.FileName,i,1)='/' then
break;
SQLStr:=Copy(FileList.FileName,i+1,Length(FileList.FileName)-i-4);
SQLStr:=SQLStr+'$';
ADOTable.TableName:= SQLStr;
// SHOWMESSAGE(ADOTable.ConnectionString);
// Showmessage(SQLStr);
try
QdbfOrd.Active:=True;
except
{Error message};
end;

end;

如果用ADOQuery和ADODataSet的话,我就不知到如何设置,老是出现“FROM 子句的语法错误。”的错误提示

链接Excel 2000 的时候Extended Properties=Excel 8.0是正确的。
在MSDN中说明:
Excel 97 对应 ‘Excel 97’
Excel 2000 对应 ‘Excel 8.0’
我试过2000的可以相连。


在ADOQuery中 select * From [Sheet1$]就可以将对应的表的内容读出
记住一定要在表名两边加[]在表名后面加$,不然就报FROM 子句的语法错误
在ADOTable中选择表名时也应手工将这两个符号加上
 
高,如果可以的话,确实是个好主意
 
接受答案了.
 
后退
顶部