【エクセル入出力基礎】
TExcelApplication,TExcelWorkbook,TExcelWorksheetクラスを利用し
OLE経由でエクセルの直接操作を行う。
■エクセル関連コンポーネントのツリー構造
・TExcelApplication //エクセルアプリケーション
・TExcelWorkbook //エクセルワークブック
・TExcelWorksheet //エクセルワークシート
【TExcelApplication】
エクセルファイルの操作を行うコンポーネント
■メソッド
・Create
インスタンス生成
例)xlaMain := TExcelApplication.Create(nil); //xlaMainはTExcelApplication型
・Workbooks.Open
エクセルファイルをオープンする
・Connect
エクセルアプリケーションの起動
・Quit
エクセルアプリケーションの終了
・Disconnect
エクセルアプリケーションの終了
・Free
エクセルアプリケーションの開放
→違いがわからん…未調査。
■プロパティ
・Workbooks
ワークブック(TExcelWorkbook)の集合を管理するプロパティ
※Workbooks[1].(TExcelWorkbookのメソッド) のような形で利用可能。
・ActiveWorkBook
現在アクティブなワークブック
・DisplayAlerts
アラート表示・非表示設定
eaExcelApp.DisplayAlerts[0] := False;
・ConnectKind
ckNewInstance;
・Visible[LCID] := False;
アプリケーションの可視状態
※以下のようなイメージで、TExcelApplication→TExcelWorkbook→TExcelWorksheetの
プロパティやメソッドを直接操作可能。
eaExcelApp.Workbooks[1].Worksheets.Count
【TExcelWorkbook】
エクセルの1ワークブック単位での操作を行う。
■メソッド
・Create
xlwBook := TExcelWorkbook.Create(nil);
xlsShet := TExcelWorksheet.Create(nil);
・ConnectTo
ワークブックを展開
xlwBook.ConnectTo(xlaMain.Workbooks.Add(EmptyParam, LCID));
・Workbooks[1].SaveAs
エクセルファイルの保存
・SaveAs
ファイルの保存
例) SaveAs(pXlsFileName, NULL, NULL, NULL, NULL, NULL,0, NULL, NULL, NULL, NULL, 0);
■プロパティ
・Worksheets
ワークシートの集合体。
//シート数が2毎以上ある場合は削除
while eaExcelApp.ActiveWorkBook.Worksheets.Count > 1 do
【TExcelWorkSheet】
■基礎知識
エクセルの1シート単位での操作を行う。
■メソッド
・ConnectTo
現在のシートを読み込む
例)xlsShet.ConnectTo(xlwBook.activesheet as _Worksheet);
■プロパティ
・Cells
1セル単位で選択する。以下のようにセルに値をセットする。
例)Cells.Item[1, 1] := 'abc';
・Range
セルを矩形選択する。
左上のセル~右下のセル を指定することで、範囲指定する。
・1セルのみを選択する場合
ExcelWorksheet1.Range['A1','A1'].Value := Edit1.Text;
とすれば、A1のセルに値が入る。
・複数のセルに同時に値を挿入する
ExcelWorksheet1.Range['A1','B2'].Value := Edit1.Text;
とすれば、A1~B2の4つのセルに同じ値を同時に挿入可能。
・これの応用で、1次元、2次元の配列の値を一度に入力する方法。
SetLength(ArrXlsHd, 3, 7); (タテ3行、横7列の要素をもつ配列)
Range[Cells.Item[1, 1],Cells.Item[3, 7]].Value := ArrXlsHd;
これで、セルの 1,1~3,7 の範囲に、配列の全要素の値が挿入される。
・シートをクリアする方法
ewExcelSheet.Range[ewExcelSheet.Cells.Item[1, 1],
ewExcelSheet.Cells.Item[ewExcelSheet.Rows.Count,
ewExcelSheet.Columns.Count]].Value := '';
【サンプル集】
■エクセルファイルオープン
eaExcelApp := TExcelApplication.Create(nil);
eaExcelApp.ConnectKind := ckNewInstance; //エクセルを別スレッドで起動する
ewExcelSheet := TExcelWorksheet.Create(nil);
eaExcelApp.Connect;
eaExcelApp.Visible[0] := False;//True; //エクセルの可視/不可視
■エクセルファイルクローズ
//上書き確認のダイアログを表示させない
eaExcelApp.DisplayAlerts[0] := False;
ewExcelSheet.Free;
eaExcelApp.ActiveWorkbook.Close(False,EmptyParam,False,0);
eaExcelApp.Quit;
eaExcelApp.Disconnect;
eaExcelApp.Free;
■シート削除
eaExcelApp.DisplayAlerts[0] := False;
//エクセルブック保存
eaExcelApp.Workbooks[1].SaveAs(pXlsFileName, NULL, NULL, NULL, NULL, NULL,
0, NULL, NULL, NULL, NULL, 0);
//ワークブックの1つめのシートをアクティブに
(eaExcelApp.ActiveWorkbook.Worksheets[1] as _WorkSheet).Activate(0);
//シート数が2毎以上ある場合は削除
while eaExcelApp.ActiveWorkBook.Worksheets.Count > 1 do
begin
i := eaExcelApp.ActiveWorkBook.Worksheets.Count;
eaExcelApp.DisplayAlerts[0] := False;
(eaExcelApp.ActiveWorkbook.Worksheets[i] as _WorkSheet).Delete(0);
end;
【Tips】
■エクセルの最終行取得
//最終列取得
iMaxRow := Cells.Item[1, 1].End[xlDown].Row;
SetLength(Xls1, iMaxRow - 1);