トップへ(mam-mam.net/)

DelphiでExcelを起動してForm(ウィンドウ)内に表示させる

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が表示されます。