讀取Excel檔後,要如何釋放.... |
答題得分者是:fatmoon1
|
long.Her
一般會員 發表:2 回覆:3 積分:1 註冊:2005-03-30 發送簡訊給我 |
各位大大:
請幫忙看看....下面程式是否有問題...因為在關閉程式後, windows 工作管理員的"處理程序",不會自動關閉程式及excel....要如何修改,才能釋放excel ?? 經 try 後是紅色部份的問題.... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); ADO:= TADOQuery.Create(self); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; MsExcel.WorkBooks.close; MsExcel.Quit; MsExcel:=Unassigned; end; end; 編輯記錄
taishyang 重新編輯於 2007-09-12 16:58:05, 註解 無‧
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
請參考:
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=89403 ===================引 用 long.Her 文 章=================== 各位大大: 請幫忙看看....下面程式是否有問題...因為在關閉程式後, windows 工作管理員的"處理程序",不會自動關閉程式及excel....要如何修改,才能釋放excel ?? 經 try 後是紅色部份的問題.... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); ADO:= TADOQuery.Create(self); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; MsExcel.WorkBooks.close; MsExcel.Quit; MsExcel:=Unassigned; end; end;
------
先查HELP 再查GOOGLE 最後才發問 沒人有義務替你解答問題 在標題或文章中標明很急 並不會增加網友回答速度 Developing Tool: 1.Delphi 6 2.Visual Studio 2005 3.Visual Studio 2008 DBMS: MS-SQL |
long.Her
一般會員 發表:2 回覆:3 積分:1 註冊:2005-03-30 發送簡訊給我 |
我試過 eaglewolf 提示的文章,但是還是不行耶!!
如果只有開啟Excel檔時... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; ....... MsExcel.WorkBooks.close; MsExcel.Quit; MsExcel:=Unassigned; end; end; 是可釋放的.... 但是,如果加上紅色的部份....仍然無法釋放..... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); ADO:= TADOQuery.Create(self); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; ADO.Free; MsExcel.WorkBooks.close; VarClear(aSheet); VarClear(MsExcelWorkBook); MsExcel.Quit; VarClear(MsExcel); // MsExcel.Quit; // MsExcel:=Unassigned; end; end; ===================引 用 eaglewolf 文 章=================== 請參考: http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=89403 ===================引 用 long.Her 文 章=================== 各位大大: 請幫忙看看....下面程式是否有問題...因為在關閉程式後, windows 工作管理員的"處理程序",不會自動關閉程式及excel....要如何修改,才能釋放excel ?? 經 try 後是紅色部份的問題.... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); ADO:= TADOQuery.Create(self); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; MsExcel.WorkBooks.close; MsExcel.Quit; MsExcel:=Unassigned; end; end; |
fatmoon1
初階會員 發表:3 回覆:29 積分:36 註冊:2004-05-24 發送簡訊給我 |
建議 如果將 ADO 與 MsExcel 分開執行 可以嗎?
如下 procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin ADO:= TADOQuery.Create(self); with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; ADO.Free; MsExcel:=CreateOleObject('Excel.Application'); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; MsExcel.WorkBooks.close; VarClear(aSheet); VarClear(MsExcelWorkBook); MsExcel.Quit; VarClear(MsExcel); // MsExcel.Quit; // MsExcel:=Unassigned; end; end;
------
才疏學淺 |
agogorz
初階會員 發表:9 回覆:34 積分:28 註冊:2005-04-09 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
(1)你是不是可以先將 引用Excel和ADO的部分分開測試
(如 fatmoon1 兄的建議) (2)Excel 作為 Automation Server, 只要還有Reference, 它就不會 自動結束程式的執行, 所以你要先檢查, 測試動作執行完後,Excel被 引用的狀態. 以下測試動作, 僅供參考: 下列的兩個測試動作, 當 不執行Books.Close()時, Excel就不會自動結束, 即使用來引用介面的變數被 設為空指標也是一樣; 若有執行Books.Close()時, 則Excel會正常結束. 所以建議你去檢查所有可能引用的狀況, 包含 WorkBook, WorkSheet... [code delphi] implementation uses Excel_TLB, ComObj; {$R *.dfm} // import Type Library: use smart interface procedure TfrmMain.Button1Click(Sender: TObject); var App: ExcelApplication; Books: Workbooks; begin App := CoExcelApplication.Create; try Books := App.Workbooks; //參數太多沒用過的, 通通用 NULL Books.Open('D:\BOOK1.XLS', NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,false,NULL,NULL,NULL,0); try Sleep(1000); Books.Close(0); finally Books := nil; end; finally App := nil; end; end; //使用Variant取得 interface. procedure TfrmMain.Button2Click(Sender: TObject); var App, Books: Variant; begin App := CreateOleObject('Excel.Application'); try Books := App.WorkBooks.Open('D:\BOOK1.XLS'); try Sleep(1000); Book.Close(); finally Books:= NULL; end; finally App := NULL; end; end; [/code] 僅供參考^^,
編輯記錄
jow 重新編輯於 2007-10-11 15:41:00, 註解 無‧
|
u86210779
一般會員 發表:16 回覆:41 積分:16 註冊:2004-06-08 發送簡訊給我 |
加兩行 MsExcel.WorkBooks := Unassigned;
aSheet := Unassigned; 試一試 ===================引 用 long.Her 文 章=================== 各位大大: 請幫忙看看....下面程式是否有問題...因為在關閉程式後, windows 工作管理員的"處理程序",不會自動關閉程式及excel....要如何修改,才能釋放excel ?? 經 try 後是紅色部份的問題.... procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin MsExcel:=CreateOleObject('Excel.Application'); ADO:= TADOQuery.Create(self); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; MsExcel.WorkBooks.close; MsExcel.Quit; MsExcel:=Unassigned; end; end;
編輯記錄
u86210779 重新編輯於 2007-10-11 18:32:11, 註解 無‧
|
long.Her
一般會員 發表:2 回覆:3 積分:1 註冊:2005-03-30 發送簡訊給我 |
謝謝 fatmoon1兄及各位大大的指點,真是一語驚醒夢中人 ....
這個程式是要將Excel的檔案(有兩個頁籤) 同時 轉入資料庫 其實只要改成下面的例子就可以了....謝謝大家的指導 if dm1.OpenDialog1.Execute then begin try ADO:= TADOQuery.Create(self); with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' dm1.OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [sheet1$] A '; open; First; while not eof do begin file_check.Append; for i:=0 to Fields.Count-1 do file_check.FieldByName(ADO.Fields[i].FieldName).Value:= ADO.FieldValues[ADO.Fields[i].FieldName]; file_check.Post; next; end; end; with ADO do begin close; sql.Clear; SQL.Text:='SELECT A.* FROM [sheet2$] A '; open; First; while not eof do begin WCHIPDTL.Append; for i:=0 to Fields.Count-1 do WCHIPDTL.FieldByName(ADO.Fields[i].FieldName).Value:= ADO.FieldValues[ADO.Fields[i].FieldName]; WCHIPDTL.Post; next; end; end; finally ADO.Close; ADO.Free; end; end; ===================引 用 fatmoon1 文 章=================== 建議 如果將 ADO 與 MsExcel 分開執行 可以嗎? 如下 procedure TForm1.Button1Click(Sender: TObject); var qty:double; i,pes:integer; ADO :TADOQUERY; MsExcel,aSheet,MsExcelWorkBook: Variant; begin if OpenDialog1.Execute then begin ADO:= TADOQuery.Create(self); with ADO do begin ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; ' 'Data Source=''' OpenDialog1.FileName ''';' 'Extended Properties=IMEX=1;Excel 8.0; ' 'Persist Security Info=False'; SQL.CLEAR; SQL.Text:='SELECT A.* FROM [' aSheet.name '$] A '; open; end; ADO.Close; ADO.Free; MsExcel:=CreateOleObject('Excel.Application'); MsExcelWorkBook:=MsExcel.WorkBooks.Open('' OpenDialog1.FileName ''); aSheet:=MsExcel.WorkSheets[1]; MsExcel.WorkBooks.close; VarClear(aSheet); VarClear(MsExcelWorkBook); MsExcel.Quit; VarClear(MsExcel); // MsExcel.Quit; // MsExcel:=Unassigned; end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |