1. 程式人生 > >超高效率匯出到Excel——60萬個資料9秒匯出

超高效率匯出到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語言參考》,裡面有簡單介紹。