超高效率匯出到Excel——60萬個資料9秒匯出
阿新 • • 發佈:2019-01-02
資料庫中的資料匯出到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看成一個數據庫,每個工作簿為一個表
在Access用ADO方法匯入Excel,ADOQuery的SQL為: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;
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語言參考》,裡面有簡單介紹。