为何以下代码读写EXCEL文件,效率这么低的?两个1000多条的记录表,运行半小时还没完啊(100分)

L

luckyly

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);

var ExcelAll,ExcelPart : OleVariant;
MaxRowAll,MaxColAll,MaxRowPart,MaxColPart,I,J : integer;
begin
try
begin
ExcelAll := CreateOLEObject('Excel.Application');
ExcelPart := CreateOLEObject('Excel.Application');
end;
except
ShowMessage('Excel没有安装');
Exit;
end;
try
ExcelAll.WorkBooks.Open(DBEditEh1.Text);
MaxRowAll:=ExcelAll.WorkSheets[1].UsedRange.Rows.Count;
MaxColAll:=ExcelAll.WorkSheets[1].UsedRange.Columns.Count;

ExcelPart.WorkBooks.Open(DBEditEh2.Text);
MaxRowPart:=ExcelPart.WorkSheets[1].UsedRange.Rows.Count;
MaxColPart:=ExcelPart.WorkSheets[1].UsedRange.Columns.Count;

ProgressBar1.Max := MaxRowPart ; //进度条
ProgressBar1.Position :=1 ;

I:=1;
while i <= MaxRowPart do
begin
J:=1;
while J <=MaxRowAll do
begin
if ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value then
ExcelAll.Cells[i,MaxColAll+1].value :='T';
J :=J+1 ;
end ;
ProgressBar1.Position := ProgressBar1.Position +1 ;
I := I+1 ;
end;

finally
begin
ExcelAll.ActiveWorkBook.Save ;
Excelall.Visible := True;

ExcelPart.WorkBooks.Close ;
ExcelPart.Quit;

end;

end;
end;
 
MaxColAll:=ExcelAll.WorkSheets[1].UsedRange.Columns.Count;
这个太大了,1000* MaxColAll,可能有1千万条
 
运算次数是1000*1000次,才一百万次多点
 
只选择有数的列和行,没有数据的单元格不要去循环。这样还快一些,不过还是速度很忙的,不知道为什么,我做过把文本转到EXCEL文件中也是速度很慢。
 
试一下用ADO连接,作为数据表,看速度是不是会提高
 
已经是"没有数据的单元格不要去循环",就是这么慢
 
用ADO链接速度还可以,进行固定单元写数据,不用双重循环,你实现的好像是判断是否相等, ExcelAll.Cells[J,1].value = ExcelPart.Cells[I,1].value ,一直在重复写ExcelAll.Cells[i,MaxColAll+1].value :='T';在i 没循环完时,都是写同一个单元,只有i变化后,才写下一个单元,还不如直接将 J =MaxRowAll直接进行判断。这样就直接循环1000次,等到一个1000行× 1列的数据。
这是我对你的循序看后的结果,因为在i不变时,永远都知道同一个单元格ExcelAll.Cells[i,MaxColAll+1]进行写,循环无意义。
 
最后还是用ADO解决,代码如下
procedure TForm1.Button1Click(Sender: TObject);
var ConnStrPart,ConnStrAll : String ;
Var I : Integer ; //统计配对笔数。
begin
ConnStrAll :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBEditEh1.Text
+';Extended Properties=Excel 8.0;Persist Security Info=False';
ConnStrPart :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBEditEh2.Text
+';Extended Properties=Excel 8.0;Persist Security Info=False';

AdoAll.ConnectionString := ConnStrAll ;
AdoPart.ConnectionString := ConnStrPart ;

AdoPart.Open;
AdoAll.Open;

I :=0 ;
AdoPart.First;
cxProgressBar1.Properties.Max := AdoPart.RecordCount ; //进度条

while not AdoPart.Eof do
begin
AdoAll.First;
while not AdoAll.Eof do
begin
if AdoAll.Fields[0].Value = AdoPart.Fields[0].Value then
begin
AdoAll.Edit;
AdoAll.Fields[6].Value := 'T';
AdoAll.Post;
I := I+1 ;
End;
Application.ProcessMessages;
AdoAll.Next ;
end;

cxProgressBar1.Position :=AdoPart.RecNo ; //进度条

Application.ProcessMessages;
AdoPart.Next ;
end;

AdoPart.Close;
AdoAll.Close ;
ShowMessage('数据处理完成,共成功'+IntToStr(I)+ '笔。');
end;
 
多人接受答案了。
 
顶部