全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7513
推到 Plurk!
推到 Facebook!

讀取Excel檔後,要如何釋放....

答題得分者是:fatmoon1
long.Her
一般會員


發表:2
回覆:3
積分:1
註冊:2005-03-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-12 16:47:51 IP:211.74.xxx.xxx 訂閱
各位大大:

請幫忙看看....下面程式是否有問題...因為在關閉程式後,
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-12 17:28:53 IP:211.75.xxx.xxx 訂閱
請參考:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-13 08:42:20 IP:211.74.xxx.xxx 訂閱
我試過 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-09 17:56:53 IP:61.63.xxx.xxx 未訂閱
建議 如果將 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-09 18:04:20 IP:59.124.xxx.xxx 訂閱
重新調整一下FREE的順序,並檢查是否有東西沒有FREE,
如果那段紅色的程式沒有錯,應該是Kingon前輩說的free順序造成的問題。

不過我個人是覺得是那段紅色的程碼有問題,而非excel檔釋放的問題。
編輯記錄
agogorz 重新編輯於 2007-10-09 18:08:19, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-11 15:39:03 IP:210.66.xxx.xxx 訂閱
(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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-11 18:30:17 IP:218.175.xxx.xxx 未訂閱
加兩行 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-12 08:42:44 IP:211.74.xxx.xxx 訂閱
謝謝 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;
編輯記錄
long.Her 重新編輯於 2007-10-12 08:45:17, 註解 無‧
long.Her 重新編輯於 2007-10-12 08:48:01, 註解 無‧
系統時間:2024-04-28 12:06:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!