Excel中的資料轉入資料庫 |
答題得分者是:supman
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
jbinfo
一般會員 發表:9 回覆:25 積分:16 註冊:2004-05-10 發送簡訊給我 |
不知這對你有沒有幫助
ExcelApp := CreateOleObject('Excel.Application'); ExcelApp.Visible:=False; ExcelApp.WorkBooks.Open(路徑); ExcelApp.WorkSheets[1].Activate; for iRow := 3 to 7 do begin //-->這裡自行跑迴圈,將每一個cell的資料代出 //-->例:TempValue := String(ExcelApp.Cells[iRow,iCow]) ; end;記得uses ComObj 用最笨的方法,做最穩的事情,雖然並不是那麼的漂亮,初學者的吶喊!!!! |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
謝謝supman大大,jbinfo大大的回應.
我原來也是按兩位大大的說法去跑回圈,可是用戶反應說匯入的速度太慢(確實也是,因為通常有幾3-4萬筆資料要匯入),
以下代碼是我原來的方式,請問有什麼方法讓匯入資料的速度快一點啊.
比如用 class="code">
var
i: Integer;
BoxNo: String;
MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
begin
if OpenDialog1.Execute then
begin
// 清空資料
Query1.Close ;
Query1.Sql.clear ;
Query1.Sql.add('delete from mytest');
Query1.ExecSql; MsExcel := CreateOleObject( 'Excel.Application');
MsExcelWorkBook := msExcel.Workbooks.Open(OpenDialog1.FileName);
MsExcelWorkSheet := msExcel.Worksheets.Item[1]; Query1.Close ;
Query1.Sql.clear ;
Query1.Sql.add('select * from mytest');
Query1.Open; for i := 3 to MsExcelWorkSheet.Rows.Count do
begin
BoxNo := MsExcelWorkSheet.Range[Chr(65) IntToStr(i)].Value;
if BoxNo <> '' then
begin
Query1.Append;
Query1.FieldByName('A01').AsFloat :=strtoFloat(BoxNo);
Query1.FieldByName('A02').AsFloat :=MsExcelWorkSheet.Range[Chr(67) IntToStr(i)].Value;
Query1.FieldByName('RecNo').AsInteger := i-2;
Query1.Post;
end
else
Break;
Application.ProcessMessages;
end;
MessageDlg('匯入資料完成!',mtInformation,[mbOk],0) ;
end;
發表人 - zxy666666 於 2005/05/30 16:54:43
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
您好:
透過OLE是否有加速的方式,小弟我也不曉得,如果有我也很想知道,因為我也是常常轉到資料庫,等到快睡著..zzz
不然可能就要累一點轉成CSV檔,然後手工去將檔案一筆一筆讀出來,再存到資料庫中.
您可以試一下用TStringList去載入,然後自己切割每一行的字串. 用Ado下Query試試看以下方式
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ADOQuery1.active := false;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add('select f1 f2 from [' ListBox1.Items.Strings[ListBox1.ItemIndex] ']');
ADOQuery1.Active:=true;
end; procedure TForm1.Button1Click(Sender: TObject);
var
S:String;
begin
S:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=c:\test\book1.xls;Mode=Share Deny None;Extended Properties=IMEX=1;Excel 8.0;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
S:=S 'Jet OLEDB:Engine Type=35;Jet OLEDB:Dat';
ADOConnection1.ConnectionString:=S;
ADOConnection1.Connected :=true;
ADOConnection1.GetTableNames(ListBox1.Items,false);
end; 如何設定參考下面這篇
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47834 發表人 - supman 於 2005/05/30 17:40:30
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |