Delphi で Excel Creator 3.6 を使う + Delphi で Excel を使う一番簡単な方法 2015/02/25 API コード追加

Excel Creator は、Excel が無い環境でも、Excel ファイルを高速に作成、読み書きできるというライブラリです。
ActiveX なので、Excel からでも使えます。また、通常の DLL のように XlsxCrt.dll を ライブラリ として使えます。

Excel Creator 3.6 がインストールされていない場合は、XlsxCrt.dll をレジストリに登録する必要があります。
インストール後の環境では、XlsxCrt.dll は、
32 ビット環境では、C:\Windows\System32 フォルダに、64 ビット環境では、、C:\Windows\CSysWOW64 フォルダにあります。

 ※Excel Creator 3.6 単体では、販売されていませんが、体験版は単体でダウンロード可能です。
 ※メーカー(アドバンスソフトウェア株式会社様)のリンクはこちらです。

 ※メーカーのホームページやマニュアルには、Delphi で使うことは書いてありませんが、使用環境 Delphi でユーザー登録すると、
  Delphi XE3 まで動作確認されたパッケージ、ユニット、サンプルが提供されます。

以下は、コンポーネントとして登録する方法で、DLL をそのまま使う時は、不要です。

[コンポーネント] - [コンポーネントのインポート] - [ActiveXコンポーネントの取り込み] で、コンポーネントを追加します。
(詳しい追加方法は、他のページを参考にしてください。)



コンポーネントは、ツールパレットの [ActiveX] カテゴリに [Xlsx] として追加されます。
これをフォームに貼り付けます。



実行画面です。


サンプルコード
※テストのために、ReadBook、CloseBookを分けています。
※テストのために、TXlsx を2個使っていますが、複数ファイルを操作する場合は、OPEN した ファイルID を使うようです。

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.OleCtrls, XlsxCrt_TLB;

type
  TForm1 = class(TForm)
    Xlsx1: TXlsx;
    Xlsx2: TXlsx;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 同じファイルが同時に読めるかのテスト

  // 保存されているファイルを読むので、編集中の値は取れない
  // ExcelCreator で Open しているときに、Excelで 上書き保存しても
  // エラーにはならない
  // が、ReadBook で Open した時点の値が読み込まれる。
  // CloseBook し、再度 ReadBook する必要がある。実用上問題なし。

  Xlsx1.ReadBook('D:\Book1.xlsx');
  Xlsx2.ReadBook('D:\Book1.xlsx');

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Xlsx1.CloseBook;
  Xlsx2.CloseBook;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // セルの値の取得

  // 戻り値 Value は、OleVariant型
  // 文字列と決まっている場合は、.Str でOK

  // Cell は Col, Row, 相対 Col 範囲, 相対 Row 範囲 の順(添え字は 'A1' から)
  Edit1.Text := Xlsx1.Cell['C2', 0, 0].Value;

  // Pos は Col, Row, 絶対 Col 範囲, 絶対 Row 範囲 の順(添え字は 0, 0 から)
  Edit2.Text := Xlsx2.Pos[2, 1, EmptyParam, EmptyParam].Value;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  try
    // Excelによって開かれている場合は、書込みエラーが発生するが、編集前の値は取得できる
    // 編集中であるかの判断に使えそう
    // ExcelCreator で 2重に OpenBook してもエラーとはならない
 
    Xlsx1.OpenBook('D:\Book1.xlsx');

    Edit1.Text := Xlsx1.Cell['A1', 0, 0].Value;
 
    Xlsx1.CloseBook;
  except
    // エラーメッセージを表示
    ShowMessage(Xlsx1.ErrorMessage);
  end;
end;
end.

API サンプルコード
※XlsxCrt.dll を ライブラリ として使っています。
※XlsxCrtApi.pas ユニットは、メーカーから提供されています。

uses XlsxCrtApi;

procedure TForm2.Button1Click(Sender: TObject);
var
  fname : TFileName;
  // ExcelCreatorオブジェクトのID
  dwID: DWORD;
  // 複数のExcelファイルを切り替えるための識別ID
  nID: Integer;
  buf : array[0..1023] of char;

  FileNames: TStringDynArray;
  s : string;
begin
  fname := '';
  with OpenDialog1 do begin
    Filter := 'エクセルファイル|*.xls*';
    if Execute then begin
      fname := FileName;
    end;
  end;
  if FileExists(fname) then begin
    // ExcelCreator のインスタンス作成
    XlsxCreate(dwID);

    // 読込専用で開く
    XlsxReadBookW(dwID, fname, nID);
    // シートIndex(0~)
    XlsxPutSheetNo(dwID, 1);

    // 対象セル( Col, Row の順で0~)( -1 は引数省略)
    XlsxPos(dwID, 11, 3, -1, -1);

    // 対象セル( 'A1' 形式 )
    XlsxCell(dwID, 'L8', 0, 0);

    // 文字列を取得
    XlsxGetStringW(dwID, buf);

    Edit1.Text := buf;

    // ファイルを閉じる
    XlsxCloseBook(dwID, False);

    // ExcelCreator オブジェクトの解放
    XlsxRelease(dwID);
  end;
end;

Delphi で Excel を使う一番簡単な方法

クラス名とか、忘れてしまいがちなので、自分のためにメモしておきます。
下記コードの場合、対象は起動中のエクセルです。

// uses ComObj が必要
procedure TForm1.Button1Click(Sender: TObject);
var
  xls : OleVariant;
  s : string;
begin
  s := 'TEST';
  // エクセルのウィンドウハンドルを取得
  if FindWindow('XLMAIN', nil) = 0 then
    MessageBox(Handle, PChar('EXCEL が見つかりません.'), '', MB_OK)
  else begin
    try
      // 起動中のエクセルを取得
      xls := GetActiveOleObject('Excel.Application');
      // Cells[Row, Col] :添え字は 1 から(StringGrid とは異なるので注意)
      xls.ActiveWorkbook.ActiveSheet.Cells[2, 1].Value := s;
      xls := unAssigned;
    except
      ;
    end;
  end;
end;