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;