DELPHI对Excel的操作问题:怎样把复杂Excel的数据保存到SQL数据库
我想将一个复杂Excel表的全部数据保存到SQL数据库中,将来用反相方法将SQL数据库里的数据逐条反写到Excel表,这样可以实现么?我做了一个简单的程序
while i3<=i1 do
begin
        while i4<=i2 do
        begin  
        wkSheet2.Cells.Item[i3,i4]:=wkSheet.Cells.Item[i3,i4];
        inc(i4);
        end;
inc(i3);
end;
wkSheet和wkSheet2分别对应着结构相同,数据内容不通的两个Excel表,就是说一个有数据一个是空数据
i1是表一的总行数,i2是表一的总行列数
关键是这里
wkSheet2.Cells.Item[i3,i4]:=wkSheet.Cells.Item[i3,i4];
这样应该是将表中相同位置的数据进行COPY,可是操作后,空表的数据没有任何变化,而且,在上面的循环中还发生了异常
请大虾帮忙指教,看有没有更好的办法!

解决方案 »

  1.   

    如果数据结构一样的话,可以用ms sql自带的软件dts导入到mssql里面
      

  2.   

    用ADOQUERY操作好象也不是很快。
    可以考虑用OLE的方法,直接读写数据。
    读操作就不说了,还没找到比较快的方法,一个一个读取;
    写操作可以先写到TSTRINGLIST,写完后利用剪贴板直接复制到工作表中即可,唯一慢一点的是复制的过程。
    具体参考以下文章[转载]
    利用剪贴板实现高速导出数据到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;
      

  3.   

    我要实现的并不是用什么工具解决了就行了,要是用SQL的工具直接倒,我干吗还问阿,我最终的实现目标是:将excel表的数据加密后存入SQL数据库,以后需要将这些数据传输倒网络上,在以后,还有客户端软件从网络上把这些数据读回来,重新显示在excel表里,我这样的要求能实现么~那位大哥能给各工程例子好么?