DelphiでExcelを起動してForm(ウィンドウ)内に表示させる
DelphiからExcelを操作するには、OLEオートメーションを使ったCreateOleObjectを使います。
このページでは起動したエクセルをDelphiのフォーム(ウィンドウ)にあるTPanel内に表示する方法を紹介します。
エクセルを作成(起動)するには以下ソースコードで、変数exにエクセルが設定されます。
変数exを使ってエクセルを操作できるようになります。
var ex:olevariant; //「エクセル」アプリケーション
ex:=CreateOleObject('excel.application');
新規ワークブックを作成するには以下で、変数wbに作成したワークブックが設定されます。
var wb:olevariant;
wb:=ex.workbooks.Add;
以下で既存のワークブックを開くことが出来ます。
var wb:olevariant;
wb:=ex.workbooks.open('ファイル名.xlsx');
//ワークブックを追加するか既存ワークブックを開いてからエクセルを表示させます。
ex.visible:=True;
1.プロジェクトを作成する
ファイル⇒新規作成⇒Windows VCLアプリケーション -Delphi
から新規アプリを作成します。
フォームにTPanel×1個と、TButton×1個をドラッグドロップして配置します。
Button1をダブルクリックして下記のソースコードを貼り付けます。
Form1.OnClose イベントに FormClose を設定します。
2.ソースコード
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 宣言 }
ex:OleVariant;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses System.win.ComObj {, ExcelXP} ;
procedure TForm1.Button1Click(Sender: TObject);
var book:OleVariant;
FxlfExcelHandle,FxlfExcelXLDESKHandle,FxlfExcelBookHandle:HWND;
style: LongInt;
begin
if not VarIsEmpty(ex) and not VarIsNull(ex) then exit;
//エクセルを起動する
ex:=CreateOleObject('Excel.Application');
//既存ブックを開く場合
//ex.workbooks.open(ExtractFilePath(Application.ExeName)+'..\..\Book1.xlsx');
//新規ブックを追加する場合
ex.workbooks.add;
//エクセルを表示させる
ex.visible:=True;
//Panel1をエクセルの親に設定する
Winapi.Windows.SetParent(ex.hWnd, HWND(Panel1.Handle));
style := GetWindowLong(ex.hwnd, GWL_STYLE);
style := style and not (WS_CAPTION or WS_THICKFRAME);
SetWindowLong(ex.hwnd, GWL_STYLE, style);
ShowWindow(ex.hWnd, SW_SHOWMAXIMIZED);
SetWindowPos(ex.hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
//リボン(メニュー)を非表示にする
ex.ExecuteExcel4Macro('SHOW.TOOLBAR("Ribbon",FALSE)');
// 数式バーを非表示にする
ex.DisplayFormulaBar := False;
// ステータスバーを非表示にする
ex.DisplayStatusBar := False;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if not VarIsEmpty(ex) and not VarIsNull(ex) then
begin
//リボン(メニュー)を表示にする
ex.ExecuteExcel4Macro('SHOW.TOOLBAR("Ribbon",TRUE)');
// 数式バーを表示にする
ex.DisplayFormulaBar := True;
// ステータスバーを表示にする
ex.DisplayStatusBar := True;
ex.quit;
end;
end;
end.
3.実行する
実行して Button1 をクリックすると Panel1内にExcelが表示されます。
