超高效率導出到Excel——60萬個數據9秒導出

數據庫中的數據導出到Excel通常的方式有幾種:

1.Ole控件方式,創建一個Excel文檔,一個數據一個數據往裏面寫,該方法效率比較低,數據量大時不可用。

2.使用文件流的方法,直接寫Excel文件,對Excel的文件結構要有了解,網上代碼有現成的,但需要調試,代碼也比較複雜,效率應該可以。

3.用粘貼板方式,將數據寫到一個TListString變量中,每個數據用#9分隔,再將ListString內容複製到Windows粘貼板,再粘貼到一個打開的Excel文檔中,該方法爲OLE方法的變種,但是效率較高,60萬個數據30s左右。

4.Excel的ADO方法導出,就是剛試驗成功的一個方法,在網上找了一下,好像沒看到有人說到。下面重點說說這個方法。

在進行Excel導入Access的操作時,發現可以用ADO操作,用Jet或者ACE數據庫引擎,把Excel看成一個數據庫,每個工作簿爲一個表

  ExcelCon1:=TADOConnection.Create(nil);
  try
    ExcelCon1.Connected:=false;
    if ExtractFileExt(ExcelPath)='.xlsx' then
      ExcelCon1.ConnectionString:='Provider=Microsoft.ACE.OLEDB.12.0;Password="";Data Source='
                                +ExcelPath+
                                ';Extended Properties=Excel 12.0;Persist Security Info=True;'
    else
      ExcelCon1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
                                +ExcelPath+
                                ';Extended Properties=Excel 8.0;Persist Security Info=False';
    Excelcon1.LoginPrompt:=false;
    Excelcon1.Connected:=true;
    Excelcon1.Open;
   except
    //MessageBox(Mainform.Handle,'無法打開 Excel文件!','系統提示', MB_OK);
    showmessage('無法打開 Excel文件!');
    ExcelCon1.Close;
    ExcelCon1.Free;
    exit;
  end;
    sl := TStringList.Create;
    ExcelCon1.GetTableNames(sl);
    Excelcon1.Close;
    Excelcon1.Free;
在Access用ADO方法導入Excel,ADOQuery的SQL爲:

    str:='INSERT INTO '+dbTableName
            +' SELECT * FROM '+sExcelTableName+' in "'+sExcelFile+'" "EXCEL 12.0;"'    //追加到Access表,Excel版本爲2007以上時爲Excel 12.0
  
    str:='SELECT * into '+dbTableName
            +' FROM '+sExcelTableName+' in "'+sExcelFile+'" "EXCEL 5.0;"';      //導入到新的Access表,Excel版本爲2003以下時爲Excel 5.0


後來反過來想,既然Excel可以當成數據庫操作,那Excel也可以用insert into 語句組合in 加外部數據源實現數據導出到Excel,二話不說趕緊試一下。

        ExcelDBQuery:=TADOQuery.Create(nil);
        ExcelDBQuery.Connection:=ExcelCon1;  //該ADOConnection 爲前面代碼所創建。
        With ExcelDBQuery  do
        begin
          close;
          sql.clear;
          sql.text:='insert into  [sheet1$] select * from exceltmp in "'+ExtractFilePath(ParamStr(0))+'DB\accdb.mdb"'; //注意路徑要加雙引號
          //showmessage(sql.Text);
          ExecSQL;
          close;
          free;
        end;

導出成功!60萬個數據只用了9s!!!果然是親生的數據庫引擎,快到不可想像!

不過需要保證Excel文件的表頭與Access導出的表的表頭一致,可以採取新建一個Excel文檔,將Access表頭用寫單元格的方式寫到Excel中,再用上面方法導出,代碼簡單明瞭,效率奇高。

不知道ACE、Jet引擎對外部數據源支持多少種,有空可以研究下。Jet引擎的SQL語法可以看《MicrosoftJetSQL語言參考》,裏面有簡單介紹。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章