300分吐血发起一个讨论,关于大批量数据的传递问题,欢迎大家来参加。 (300分)

  • 主题发起人 主题发起人 Wizard00
  • 开始时间 开始时间
W

Wizard00

Unregistered / Unconfirmed
GUEST, unregistred user!
有这样几个问题:
1、从文本导数据到数据库(我的是oracle),insert into web_tmp values ....
用delphi 逐条导入 30000 数据用了大约10分钟,用PB做的程序大约3分钟。
怎么才能快一点。
2、已经取出数据到 query 或adoquery 中,逐条导入到 Excel 11万数据用了
28分钟(靠!跟牛一样慢)。
3、我的个人的一个问题,想程序控制增加Excel的sheet的数量,已经发了一个50分的帖子, http://www.delphibbs.com/delphibbs/dispq.asp?lid=2280547

我的代码如下:
var
ExcelApp,ExcelWorkSheet:Variant;
sheet:oleVariant;
begin
ExcelApp:=CreateOleObject('Excel.Application');
Excelapp.visible:=true;
ExcelWorkSheet:=Excelapp.WorkBooks.Add;
sheet:=ExcelWorkSheet.Sheets[1];
........
end;
不知道能实现否。

有什么好的办法可以让速度快一点么?请大家不吝赐教,谢谢!
 
使用Delphi自带的Ole对象
 
可以用混编实现
 
1、BatchMove
2、用DBGridEh控件的导出功能
 
2、已经取出数据到 query 或adoquery 中,逐条导入到 Excel 11万数据用了
28分钟(靠!跟牛一样慢)。

这样确实太慢了,用剪切板导入Excel速度很快,每字段间加空格,每一条记录间加回车,
然后从ClipBoard中一次导入Excel
Excel.Paste;
 
對於第一點,你可以導入100條(或更大點)才提交一次,這樣速度明顯快很多。
2.你可以用多線程。先取出數據到list中,然後把它一次性寫到excel中,另外一個線程就到數據到另list中,完後給list,這樣循環。也會快很多
3.應該可以控制的。
 
感谢大家的建议,但是好像都说的不详细,请大家再费心详细写一下,有如下疑问:

to lich:怎么使用?
to hongxin_dl:请细说看看,代码是什么?我没有用过。
to hunyuan: 怎样才能把数据放到剪切板中去,写一个代码看看吧。
tospringson: 你说的是不是 cachesize?我改成100也是一样的效果,如果不是,那么怎么改?
怎么没有人理我?星期天休息么?
 
用cachesize效果不是很好,我說的是100條插入sql語句,放在一塊,給query.sql.text,然後execsql提交,會快很多。因為一條語句就execsql會慢很多。
 
to springson: 想法比较奇特!有机会我试一试。
拜托 hunyuan ,给一个往剪切板里面存放数据的例子,多谢了!

to all:我的第三个问题已经试验出来了,

ExcelWorkSheet.sheets.select;
ExcelWorkSheet.sheets.add;
表示连续增加 3 个sheet;
ExcelWorkSheet.sheets[3].select;
ExcelWorkSheet.sheets.add;
表示在 sheet3 之前加一个sheet。
问题是现在我想在sheet3之后加一个sheet,
不知道怎么直接加,别告诉我先在前面加然后mov,那我就晕了。

 
用CREATEOLEOBJECT就是慢,当EXCEL中行数多于2000行就体现出来了,分多批导入试一下,一次读1000行,提交,再取下1000行,这样导入过程可用PROGRESSBAR表现出来,只是一个想法,试一下吧,对你的现有程序也不用做太大改动。
也可以用ADO试一下。这个我没试过。
 
我用这样的语句:
while not query1.Eof do
begin
.........
for j:=1 to query1.FieldCount do
sheet.cells(line+1,j):=query1.Fields[j-1].AsString;
query1.Next;
end;
 
刚刚查询了一下,往剪切板里面存文字,大多是
edit1.CopyToClipboard;
没有别的好办法么?
 
将QUERY的记录数限制在1000条记录以下,导出后,再读下1000条。如果可行,也可多用几个线程,效果会更好一些。
如果不是非要做在程序中可用DTS导,快,如要做在程序中,以前有贴子说明如何在DELPHI中用DTS。
 
to whhtao:谢谢。我必须要写程序。
to the others: 刚刚试验成功怎么往剪切板里面存东西,
Clipboard.SetTextBuf('asdfsdfs adfsadfasdfsad');
sheet1.range['A1'].select;
sheet1.paste;
现在往里面加字符串不可以,提示 string 和pchar 不能匹配。

 
用剪切板往Excel里面添数据,实现了。速度比原来快了一点,11万数据,每1000行paste一次,22分钟(靠!比牛快一点呀)。真羡慕 FoxPro 的导出,11万数据顶多用10秒钟,有没有更好的方法!郁闷中.......
 
我不知道, orcale 有没有倒入导出的功能, sql server 2000 有,直接用这个功能,倒入到数据库中,速度特别快,
 
直接使用tdxDBGrid的导出到excel的功能,非常快,我刚刚测试过,
4.6万条记录,26个字段,用不了5秒钟,生成的文件近14M大小,因为它根本就不需要
启动excel,而是直接生成xls格式文件。如果你不信,你可以去 www.51delphi.com
下载一个测试一下,最新版本是DevExpress QuantumGrid 4.5 。
我使用的是tdxdbgrid 3.22版本。
 
如果用的是oracle

load data infile '/oracle/bill/data/mydata.txt'
into table tmp_mydata
( fd1 position(1:8) char,
fd2 position(9:20) char,
fd3 position(21:10) char)
 
我不是用的oracle,我用的是本地的VFO文件,先下载一个东西测试一下。
有一个adoquery.savetofile 语句,能不能保存成 txt 文件,如果能保存的话,可以直接在adoquery里面修改,然后保存成扩展名为xls的文件应该可以。
 
to chnplzh:
50M 好大呀,怎么给别人用。[:(]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
579
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
后退
顶部