1. 程式人生 > >DELPHI中四種EXCEL訪問技術實現

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檔案非常有效。