csv导为excel模板文件速度慢问题(100分)

  • 主题发起人 主题发起人 gxw
  • 开始时间 开始时间
G

gxw

Unregistered / Unconfirmed
GUEST, unregistred user!
最近需要将数千个行数达3000以上的csv文件编程导入xls模板. 模板格式很简单,就是1标题行加1空行,此空行内共8个cell,各cell已设置好各种需要的格式.

目前对付办法:
1)把模板的空行先复制为对应csc文件的行数;
2)打开csv逐行逐逗号取值,再逐一填入模板对应的cell
3)存为xls文件.

问题是这样虽能导入,但速度巨慢,测试发现3800行的csv导入模板几乎要半小时,大概时间全耗费在逐行逐逗号取值上了~~狂汗!

不知道那位能给个高速处理的算法, 最好有例句~~[:D]

哎,以前Excel.Application用的少啊~~
 
你测试了时间花在逐行逗号取值了?
我的想法相反。你把填入excel的代码取消,看看需要多长时间。
另外,你使用什么方式分解逗号分隔的数据?把代码拿出来。
个人认为,这部分花的时间应该很少。使用pos(..)函数的效率不错。
 
Ole 对象的使用本身就是一个费时的过程,如果你把Excel Application 的Visible设成False会快一点,但有有限的狠
 
private
Value: array[1..8] of string;
public
{ Public declarations }
end;

............

procedure GetCellsValue(ss: string)
//csv当前行字符串分解为8个值
var i,j,c,k: integer;
begin
c:=length(ss)
k:=0
j:=1;
for i:=1 to c do
begin
if ss=',' then
begin
inc(k)

Value[k]:=copy(ss,j,i-j)

j:=i+1;
if k=7 then //此后字符视作Value[8]值,i不再循环
begin
   //Value[k+1]:=trim(copy(ss,j,255));
Value[8]:=copy(ss,j,255);
break;
end;
end;
end;
end;


Excel Application 的Visible已经是False
上面的子程序则是分离csv行8个值用的。

记得以前看过一段VB程序,里面好象没这么复杂,可惜现在google不出来了。。。[:(]
 
目前拟创建2个Ole对象x1,x2,用x1直接打开csv, x2则打开模板文件, 然后x2复制空行后直接从x1取数据填入。因为测试发现x1直接打开csv好象很快,而且不用使用子程序。。。。
 
我给你一个建议,csv本身其实就是文本文件,不使用excel打开,你会发现速度成倍提高。
var fp:textfile;
tstr:string;
assignfile(fp,filename);
reset(fp);
repeat
readln(fp,tstr);
GetCellsValue(tstr)
//csv当前行字符串分解为8个值
填入你另外的excel,
until eof(fp);
 
To zywcd:
用文本方式打开csv始终没法回避显式分解字符值,而改用excel对象打开则一步到位,应该会更快些。刚才测试过,excel对象打开3800行的csv也就1秒左右啊~[:)]
 
但是你读的时候速度怎么样?
那你这样测试,取消csv分解这部分,随机往另外excel填入数据,看看需要多少时间。
 
用2个ole对象处理的结果:由原来的近30分钟缩短为8-9分钟左右,比原来读文本分解8个值再处理速度有点进步。先结贴,特别谢谢zywcd的关注,也谢谢完颜康,希望以后还有机会讨论~~~[:D]

zywcd--80 完颜康--20
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部