數據庫中的數據導出到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語言參考》,裏面有簡單介紹。