怪!导入Excel 到一定量时要死机(10分)

G

gymmy

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我最近碰到一个很怪的问题,我有一个39列2100多条记录的表从后台用ole方法导
入到Excel中,如果全部选中39列的话,每次导的时候到1771条就不动了,但如果我选20-30列
时就可以全部导完没有问题,真是奇怪死了,现在我每次出报表都要分两半分别来导,最后再
在Excel里合并,痛苦啊!是不是我的内存太小128M可用实际物理内存为11%.我是用D6+ADO+sql server7
下面是我的代码,请各位帮忙找找原因.解决我的这块心病,多谢了,
try
XLApp:=CreateOleObject('Excel.Application');
except
Application.MessageBox('Excel没有安装!','提示信息',MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
exit;
end;
XLApp.visible:=True;
XLApp.Caption:='AFC DATA';
XLApp.Workbooks.add;
XLAPP.WorkSheets[1].Activate;
j:=0;
for i:=0 to Listbox2.Items.Count-1 do
begin
XLApp.cells.Item[1,j+1]:=Listbox2.Items;
j:=j+1;
end;
end;
row:=2;
while Not(ADOQuery2.eof) do
begin
column:=1;
for i:=0 to Listbox2.Items.Count-1 do
begin
j:=Listbox1.Items.IndexOf(listbox2.Items);
XLApp.cells.Item[row,column]:=ADOQuery2.Fields[j].Asstring;
column:=column+1;
end;
ADOQuery2.next;
row:=row+1;
我是用两个Listbox把选中的字段从Listbox1移到Listbox2,ADOQuery2 为select * from table1
Try...end之间的代码是设置excel表的表头字段
 
如果我没猜错, 不应该是死机了而是变得很慢. 你只要在循环中加入
Application.ProcessMessages就可以看到结果了.
 
to tseug:
好象不是速度问题,因为在1771前还是很快的,就是到1771条是突然停止了。是不是
内存太小了缓冲只能容纳1771条?另外Application.ProcessMessages是什么意思?放在哪里?
先谢谢了。
 
这样速度快,是理想的解决办法

利用剪贴板实现高速导出数据到Excel amei2000go(原作)

关键字 Excel



在很多的时候,我们需要将我们的数据导出到Excel中进行加工,在Access中有现成的工具可以实现
可是在Delphi中却偏偏没有,无论如何我们需要这么一个工具,那么,事不宜迟,细细一想,最好的方法莫过
于直接在程序中按照Excel的格式生成Excel文件,使用Ole技术直接调用Excel实例,由于第一种方法技术实现
过于复杂,好在一般的计算机上已经安装了Office,在此就第二种方法“抛一块砖”。
在此做一个示例以方便说明,我们考虑到导出数据有很多的情况是Master/Detail数据,因此就用两个
TQuery和一个TDataSource,如果有更多的层次,只需要增加TQuery和TDataSource即可,以下使用了两个TQuery
,分别是:qryMaster和qryDetail,一个TDataSource:dsSource;
步骤是:
1.建立一个Excel实例
2.创建一个工作表
3.创建一个TStringList,用来装数据
4.穷举数据表,将数据存入TStringList
5.将TStringList的数据复制到剪贴板
6.把剪贴板中的数据粘贴到Excel
本方法的优点在于:比逐条写入到Excel中的速度大大提高,我曾试过,在P3933,256M的机器上用普通
的方法,导出1000条数据大约需要2分钟,而该用本方法后只需要8秒。

function ToExcel():boolean;
var
y :integer;
tsList :TStringList;
s :string;
aSheet :Variant;
begin
result:=true;
Excel.Connect; // 打开Excel
Excel.Visible[0]:=true; // 显示Excel
Excel.Workbooks.Add(xlWBATWorksheet,0);
aSheet:=excel.Worksheets.Item[1];

tsList:=TStringList.Create;
try
try
with qryMaster do
begin
Open;
First;
While Not Eof do
begin
s:='';
for y:=0 to FieldCount-1 do
begin
s:=s+Fields[y].AsString+#9;
Application.ProcessMessages;
end;
tsList.Add(s);
// 从表
if qryDetail<>nil then
begin
with qryDetail do
begin
Open;
First;
while Not Eof do
begin
s:='';
for y:=0 to FieldCount-1 do
begin
s:=s+Fields[y].AsString+#9;
Application.ProcessMessages;
end;
tsList.Add(s);
next;
end;
end;
end;
next;
end;
Close;
end;
Clipboard.AsText:=tsList.Text;
except
result:=false;
end;
finally
tsList.Free;
end;

Excel.Disconnect;
aSheet.Paste;
MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION or MB_OK);
end;
 
楼上老兄的方法明天我会去试一下,不过哪位能告诉我,我自己的方法为什么就不行呢?
到底是程序问题还是内存或机器的问题?我很想知道知道。
 
没人碰到过这种问题吗?没人知道吗?
 
顶部