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;