DELPHI中四種EXCEL訪問技術實現
一、引言
EXCEL在處理中文報表時功能非常強大,EXCEL報表訪問也是資訊系統開發中的一個重要內容,本文總結以往開發中所用到的幾中EXCEL檔案訪問方法,在實際工作中也得到了很好的驗證,本文列舉了其中四種方法的例項與讀者共享,程式已在WINDOWS2000作業系統、OFFFICE2000應用軟體和DELPHI7環境下除錯通過。
二、ADO方式訪問EXCEL檔案
ADO方式訪問EXCEL檔案時,將EXCEL檔案看作一個等同Oracle、MS SQLServer等資料庫的一個ODBC資料來源本文應用示例主要功能是開啟EXCEL檔案,並實現對EXCEL檔案的編輯修改功能。實現過程及主要原始碼如下:
1.在工程中新建視窗類TfrmADOEXCEL,在視窗中定義私有變數型別為TADOConnection的元件Conn,加入TADOTable元件ADOTabXLS、TDataSource元件DSXLS、TDBNavigator元件NavXLS 、TDBGrid元件GridXLS和TButton元件btnOpen,使用btnOpen可以開啟EXCEL檔案,使用NavXLS可以瀏覽編輯EXCEL檔案資料。
2.編寫btnOpen元件的OnClick事件。需要注意兩點,Conn元件的Extend Properties屬性要定義成excel 8.0,另外,EXCEL檔案中的表單名“人員資訊表”作為表明時要寫成“[人員資訊表$]”。
procedure TfrmADOEXCEL.btnOpenClick(Sender: TObject);
//開啟EXCEL檔案程式碼
begin
Conn:=TADOConnection.Create(nil);
Conn.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ExtractFileDir(Application.ExeName)+'/PersonData.xls;Extended Properties=excel 8.0;Persist Security Info=False';
Conn.LoginPrompt:=false;
Conn.Connected:=true;
ADOTabXLS.Connection:=Conn;
ADOTabXLS.TableName:='['+'人員資訊表'+'$]';
ADOTabXLS.Active:=true;
DSXLS.DataSet:=ADOTabXLS;
GridXLS.DataSource:=DSXLS;
except;
FreeAndNil(Conn);
end;
end;
三、COM方式動態訪問EXCEL檔案
COM方式動態訪問EXCEL檔案時,基本方法是利用元件複用技術呼叫Office軟體平臺提供的COM服務元件,充分利用COM元件提供的方法操縱EXCEL檔案。本文應用示例簡單演示瞭如何利用COM技術將DataSet資料集的資料輸出到EXCEL檔案。實現過程及主要原始碼如下:
在工程中新建視窗類TfrmCOMEXCEL,在視窗中定義私有變數型別為TADOConnection的元件Conn,加入TADOTable元件ADOTabXLS和TButton元件btnOpen,使用btnOpen可以將資料輸出到EXCEL檔案。編寫btnOpen元件的OnClick事件程式碼如下:
procedure TfrmCOMEXCEL.btnOpenClick(Sender: TObject);
var
XL: Variant; //開啟EXCEL檔案的Variant變數
Sheet: Variant;//指向EXCEL表單的Variant變數
RecNo,I: Integer;//記錄資料表的當前記錄號
begin
try
XL := CreateOleObject('Excel.Application');
XL.Visible := true;
if FileExists(ExtractFileDir(Application.ExeName)+'/test.xls') then
begin
XL.WorkBooks.Open(ExtractFileDir(Application.ExeName)+'/test.xls');
end
else XL.WorkBooks.Add;
XL.WorkBooks[XL.WorkBooks.Count].WorkSheets[1].Name := 'test';
Sheet := XL.WorkBooks[XL.WorkBooks.Count].WorkSheets[Trim('test')];
RecNo := 1;
ADOTabXLS.First;
while not ADOTabXLS.Eof do
begin
for I := 0 to ADOTabXLS.FieldCount - 1 do
if not (ADOTabXLS.Fields[I].DataType in [ftBlob, ftGraphic,
ftParadoxOle, ftDBaseOle, ftTypedBinary,
ftReference, ftDataSet, ftOraBlob, ftOraClob, ftInterface,
ftIDispatch]) then
begin
Sheet.Cells.NumberFormat := '@';
Sheet.Cells[RecNo, I+1] := ADOTabXLS.Fields[I].AsString;
end;
Inc(RecNo);
ADOTabXLS.Next;
end;
try
XL.WorkBooks[XL.WorkBooks.Count].SaveAs(ExtractFileDir(Application.ExeName)+'/test.xls');
except ;
end;
end;
四、擴充套件OLEContainer方式訪問EXCEL檔案
在使用OLE方式訪問EXCEL檔案時,OLE容器在失去焦點會遮蔽正在訪問的EXCEL檔案操作;另外,使用in_place方式啟用OLE容器時,會另外開啟一個視窗,程式執行顯得有些混亂,造成這些問題的主要原因是因為OLE容器響應了CM_UIDEACTIVATE訊息,OLE容器不能始終保持啟用狀態。為此可將此訊息結果使OLE容器始終處於啟用狀態。解決方法是過載OLE容器的CM_UIDEACTIVATE訊息。在程式中臨時建立過載後擴充套件OLE容器OLEContainerEx。程式碼如下:
type
TOleContainerEx=class(TOleContainer)
private
FJH: Boolean;
//重寫CM_UIDEACTIVATE訊息響應
procedure CMUIDeactivate(var Message: TMessage); message CM_UIDEACTIVATE;
published
property JH: Boolean read FJH write FJH;
end;
// 過程CMUIDeactivate的程式碼實現
procedure TOleContainerEx.CMUIDeactivate(var Message: TMessage);
begin
if not JH then
inherited;
end;
在使用TOLEContainerEx時,可採用臨時建立的方式,也可進一步封裝成可安裝組建以便設計期使用。本文應用示例採用了臨時建立的方式。在工程中新建視窗類TfrmEXOLEEXCEL,並定義Public變數 OleCon,型別為: TOleContainerEx;在視窗中定一個Tpanel型別元件panel1和Tbutton型別變數btnOpen,編寫btnOpen的Click事件,主要源程式程式碼如下:
procedure TfrmEXOLEEXCEL.btnOpenClick(Sender: TObject);
begin
//建立並顯示擴充套件OLE類元件
OleCon := TOleContainerEx.Create(nil);
OleCon.Parent := Panel1;
OleCon.Align:=alClient;
OleCon.allowactivedoc := true;
OleCon.AllowInPlace := True;
OleCon.AutoActivate := aaGetFocus;
OleCon.Anchors := [akTop,akLeft,akRight,akBottom];
OleCon.Visible := True;
OleCon.SizeMode := smClip;
OleCon.CreateObjectFromFile(ExtractFileDir(Application.ExeName)+
'/PersonData.xls',false);
TOleContainerEx(OleCon).JH := True;
OleCon.SetFocus;
end;
五、DELPHI標準組件訪問EXCEL檔案
Delphi中封裝了一組Microsoft Office自動化物件(Automation servers)。它使得我們很容易地把Office中的應用程式(Excel等)當作一個COM應用伺服器進行控制。使用這組VCL元件可以在設計時進行屬性設定,也可以在執行時動態訪問EXCEL。利用標準組件動態訪問EXCEL檔案時,充分利用VCL元件提供的方法操縱EXCEL檔案。本文應用示例簡單演示瞭如何利用VCL元件將DataSet資料集的資料輸出到EXCEL檔案。實現過程及主要原始碼如下:
在工程中新建視窗類TfrmSTDCNTREXCEL,在視窗中加入TADOConnection元件ADOConnXLS,TADOTable元件ADOTabXLS、TButton元件btnOpen、TexcelApplication元件ExcelApplication1,TexcelWorkbook類元件ExcelWorkbook1和TExcelWorksheet1類元件ExcelWorksheet1,使用btnOpen可以將資料輸出到EXCEL檔案。編寫btnOpen元件的OnClick事件程式碼如下。
procedure TfrmSTDCNTREXCEL.btnOpenClick(Sender: TObject);
var
aWorksheet: _WorkSheet;
tmpI,aRowIndex:integer;
aStr:string;
begin
ADOConnXLS.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ExtractFileDir(Application.ExeName)+'/PersonData.xls;Extended Properties=excel 8.0;Persist Security Info=False';
ADOConnXLS.LoginPrompt:=false;
ADOConnXLS.Connected:=true;
ADOTabXLS.Connection:=ADOConnXLS;
ADOTabXLS.TableName:='[人員資訊表$]';
ADOTabXLS.Active:=true;
if ADOTabXLS.IsEmpty then exit;
Try
ExcelApplication1.Connect;
Except
MessageDlg('你還沒有安裝MicroSoft Excel,請先安裝MicroSoft Excel!',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption := '新建EXCEL檔案';
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));
aWorksheet:=ExcelWorkbook1.WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0) as _WorkSheet;
ExcelWorkSheet1.ConnectTo(aWorksheet);
aRowIndex:=1;
while not ADOTabXLS.Eof do
begin
for tmpI:=0 to ADOTabXLS.FieldCount-1 do
ExcelWorksheet1.Cells.Item[aRowIndex,tmpI+1]:=ADOTabXLS.FieldList[tmpI].AsString;
aRowIndex:=aRowIndex+1;
ADOTabXLS.Next;
end;
//儲存EXCEL檔案,並關閉EXCEL應用程式
Try
aStr:=ExtractFileDir(Application.ExeName)+'/EXCEL檔案.xls';
ExcelWorkbook1.SaveAs(aStr,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam ,
xlNoChange ,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;
ADOTabXLS.Active:=false;
ADOConnXLS.Connected:=false;
except
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;
ADOTabXLS.Active:=false;
ADOConnXLS.Connected:=false;
End;
end;
六、總結
綜上所講,本文分別舉例討論了EXCEL檔案訪問的幾種方法,包括ADO、COM、擴充套件OLEContainer和DELPHI標準組件方式。在實際應用過程中,這幾種方法也各有特色。ADO方式訪問EXCEL檔案適用於以資料庫訪問方式維護EXCEL檔案,COM方式動態訪問程式設計設計與VBA訪問介面方式相似,此種方法適用於EXCEL檔案資料維護和複雜報表輸出,擴充套件OLE方式訪問EXCEL檔案時能夠保持EXCEL應用程式的友好介面,DELPHI標準組件訪問方式與COM訪問方式相似,但DELPHI對各類介面進行了更加友好的封裝,在對COM方式不是很長熟悉的情況下,使用這種方式訪問和輸出資料到EXCEL檔案非常有效。