一直不喜欢使用delphi操作Excel,一是因为Excel本身设置复杂,又是公式又是宏的,再就是因为网上关于delphi操作的文章动辄就长篇大论,可操作性差,而我们使用excel一般不会那么负责,只不过用于存储而已,所以我偷懒只是用文本来存储,大不了用excel打开文本文件罢了。
这周单位需要,又编写了两个程序,本来以为是一次性操作,用完了就算了,谁知前台人员感觉比较方便,希望改进一下能够日常使用,但如果再用文本存储,可能麻烦了了点,所以就想简单改进一下,直接操作excel试试。
网上文章很多,但基本上都是转来转去,大差不差,找了一些文件,又总结了一下,主要参考的是http://news.ccw.com.cn/elife/htm2007/20070611_271052_2.shtml和http://www.cnblogs.com/LuckyJan/articles/70559.html这两篇文章。
1、首先加入uses ComObj。
2、读取excel文件的话,先定义var XL: Variant;Sheet: Variant;
XL := CreateOleObject(‘Excel.Application’);
XL.WorkBooks.add(文件名);
Sheet:=xl.workBooks[1].worksheets[1];
定义好了sheet表之后,就可以操作了 s1:=sheet.cells[i,1];读取数据。
取表中文件数是个问题,如果简易的话,可以通过判断单元格是否为空来判断,但不能直接用定义的sheet.cells来判断,我是用笨办法:
m:=1;
i:=1;
while m>0 do
begin
ss:=trim(sheet.cells[i,1]);
if ss=” then
m:=0 else
begin
s1:=sheet.cells[i,1];
s2:=sheet.cells[i,2];
memo1.Lines.Add(s1+’-‘+s2);
i:=i+1;
end;
end;
这样就可以读取excel表中的数据了。
3、将数据写入excel反而要简单一些了,定义xl,sheet同上,下面就是:
if save1.Execute then
begin
TRY
XL := CreateOleObject(‘Excel.Application’);
Sheet:=CreateOleObject(‘Excel.Sheet’);
EXCEPT
showmessage(‘error’);
END;
S:=save1.FileName;
Sheet:=xl.workBooks.add;
for i:=1 to memo1.Lines.Count do
begin
ss:=memo1.Lines[i-1];
m:=pos(‘ ‘,ss);
s1:=copy(ss,1,m-1);
delete(ss,1,m-1+length(‘ ‘));
m:=pos(‘ ‘,ss);
s2:=copy(ss,1,m-1);
xl.Cells[i,1]:=s1;
xl.Cells[i,2]:=s2;
end;
sheet.SaveAS(S);
sheet.close;
XL.Quit;
end;
其中加红的那句很重要,通过这样才能激活当前表。
用了一个下午,程序已经可以运行起来了,速度虽然慢了一点,但用起来操作要简单直观一些,不用再通过文本转换了,但问题在于系统必须安装了excel,这也是我一直不愿意使用这个组合的原因。