unit Unit3; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ComObj,StdCtrls; const L_ARR_CHAR:array[0..77]of string=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ','BA','BB','BC','BD','BE','BF','BG','BH','BI','BJ','BK','BL','BM','BN','BO','BP','BQ','BR','BS','BT','BU','BV','BW','BX','BY','BZ'); type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FExcelApplication: TExcelApplication; FExcelWorkbook: TExcelWorkbook; FExcelWorkSheet: TExcelWorksheet; excelApp,excelBook,excelSheet:Variant; FOnExportFront: TNotifyEvent; FOnExportAfter: TNotifyEvent; FOnExportToExcel: TNotifyEvent; Procedure ExcelWorkbookBeforeClose(ASender: TObject; var Cancel: WordBool); Procedure ExecOnExportFront(Sender: TObject); virtual; Procedure ExecOnExportToExcel(Sender: TObject); virtual; Procedure ExecOnExportAfter(Sender: TObject); virtual; protected property OnExportToExcel: TNotifyEvent read FOnExportToExcel write FOnExportToExcel; property OnExportFront: TNotifyEvent read FOnExportFront write FOnExportFront; property OnExportAfter: TNotifyEvent read FOnExportAfter write FOnExportAfter; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin FExcelApplication.Connect; // 方法1跟方法2在给应用赋值的时候是一样的。 FExcelApplication.Caption := FFormCaption + 'Excel导出'; FExcelApplication.Workbooks.Add(EmptyParam,0); FExcelWorkbook.ConnectTo(FExcelApplication.ActiveWorkbook as _Workbook); FExcelWorkbook.Activate; FExcelWorksheet.ConnectTo(FExcelWorkbook.ActiveSheet as _WorkSheet); FExcelWorksheet.Activate; OnExportFront := ExecOnExportFront; OnExportToExcel := ExecOnExportToExcel; OnExportAfter := ExecOnExportAfter; excelApp := CreateOleObject('Excel.Application'); excelBook := excelApp.workbooks.add; excelSheet := excelbook.worksheets.item[1]; excelSheet.Range[L_ARR_CHAR[0]+inttostr(1) + ':' + L_ARR_CHAR[2]+inttostr(3)].clearcontents; excelSheet.Range[L_ARR_CHAR[0]+inttostr(1) + ':' + L_ARR_CHAR[2]+inttostr(3)].merge; excelSheet.Range[L_ARR_CHAR[0]+inttostr(1) + ':' + L_ARR_CHAR[2]+inttostr(3)].merge(False); //方法2的显示 excelApp.visible := true; excelApp.caption := '裴晓斌'; end; procedure TForm1.Button2Click(Sender: TObject); begin excelApp.quit; end; procedure TForm1.ExcelWorkbookBeforeClose(ASender: TObject; var Cancel: WordBool); begin if Assigned(FExcelApplication) then begin FExcelApplication.disconnect; FExcelApplication.Quit; end; FreeAndNil(FExcelWorksheet); FreeAndNil(FExcelWorkbook); FreeAndNil(FExcelApplication); end; procedure TForm1.ExecOnExportAfter(Sender: TObject); begin // 方法1的显示 FExcelApplication.Visible[0] := True; end; procedure TForm1.ExecOnExportFront(Sender: TObject); begin ; end; procedure TForm1.ExecOnExportToExcel(Sender: TObject); begin ; end; procedure TForm1.FormCreate(Sender: TObject); begin try FExcelApplication := TExcelApplication.Create(nil); FExcelWorkbook := TExcelWorkbook.Create(nil); FExcelWorkSheet := TExcelWorkSheet.Create(nil); //wookBook关闭前的方法; // ole 不需要这么做 FExcelWorkbook.OnBeforeClose := ExcelWorkbookBeforeClose; except showmessage('对不起,您没有安装Excel'); FreeAndNil(FExcelWorksheet); FreeAndNil(FExcelWorkbook); FreeAndNil(FExcelApplication); end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(FExcelWorksheet); FreeAndNil(FExcelWorkbook); FreeAndNil(FExcelApplication); end; end.
开发背景:手头有个老系统,是前几年用delphi7 开发出来的。里面有个 Excel导出的功能,使用的是Delphi7 自带的Excel导出单元。单元名是 Excel97.pas; 从名字上可以看出,delphi7支持的Excel版本。现在excel版本已经出来 excel2013了,还有些客户为了便宜或者其他原因,买了WPS企业版。在使用Excel导出的时候就遇见了问题。 系统不可以调用WPS进程。经过查证,delphi7下的Excel导出有2种方式,1种是调用delphi7的单元或者delphi7的控件。一种是通过OLE来编程的。下面先来介绍一下2个调用方法下的编程。