■TPrinterを使った印刷

■メタファイルの使い方

■Queryの利用(IB&FB)

■TeeChart

■TExcelApplication

TExcelApplicationの使い方

エクセルを制御してデータベースから任意のフォーマットで書き出したいと思うことがあります。
で、役に立つのがServersのTExcelApplicationコンポーネントです。
掲示板とかで質問してもVBAを勉強しましょう。とか言われて、急ぎのときに困るので最低限度必要な処理を残します。

コンポーネント配置
フォームなりデータモジュールに3つのコンポーネントを配置します。
慣れたら、動的生成(Create)もいいかもしれません。

var
//名称は自由に、自分はこれくらいの長さがちょうど良いので
ExcelApp:TExcelApplication;
ExcelBook:TExcelWorkBook;
ExcelSheet:TExcelWorkSheet;

//ExcelAppを用いて、エクセルを起動し、制御体勢をとります。
//ExcelBookでエクセルファイルを制御できるようにします。
//ExcelSheetでエクセルファイルのそれぞれのシートを個別に制御できるようにします。
//ExcelSheetは、基本1対1の状態でシートを制御するので複数シートを連携する場合は、複数のコンポーネントを用意します。
//順次切り替えでかまわない場合は、1個で大丈夫、ConnectToとDisconnectメソッドを使って、切り替えれます。

スマートな制御(データ出力のみ)

自分の中のスマートな制御として

@エクセルファイルの雛形を用意しておく
Aエクセルファイルをデスクトップなどにコピーして、コピーしたモノを制御して書き出す。
B書き出し中は、プログレスバー(自作DLL)などにして、エクセルを見せない。
C最後に自動保存

var
//ファイルコピー関連の変数
FromPath,ToPath:String;
LCID:Windows.LCID;
FileOp:TShFileOpStruct;
//エクセル関連の変数
SelectRange:ExcelRange;
cnt:Integer;
//プログレスバーのカウント
measure:Integer;


//ファイル原本コピー
FromPath := DocumentPath + '\管理表.xls' + #0#0;
ToPath := ExportPath + '\管理表.xls' + #0#0;
with FileOp do
begin
Wnd := Handle;
wFunc := FO_COPY;
pFrom := PChar(FromPath);
pTo := PChar(ToPath);
fFlags := FOF_NOCONFIRMATION;//上書き問い合わせ無し
end;
SHFileOperation(FileOp);

//エクセルの制御
//起動処理
//OLEサーバー処理LocalID取得
LCID := GetUserDefaultLCID;
ExcelApp.Connect;
//ExcelApp.Visible[LCID] := True;//開発中はここでもいい。
ExcelApp.DisplayAlerts[LCID] := False;//警告なし
//実ファイルと接続。引数ながーーいよ。
ExcelBook.ConnectTo(Excelapp.Workbooks.Open(ToPath,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,LCID));

try
//プログレスバーの準備
measure := RecordCount;
ProgressShow(0,1,measure,1,PChar('EXCEL出力処理中'));//オリジナルDLLのAPI
for cnt := 1 to StringGlird.RowCount - 1 do
begin
//メインの書き出し記述

//プログレスバーの進捗
ProgressStep;
end;
//最後まで書き出せたら保存
ExcelBook.Save;
finally
//エクセルを表示。最初に見せるより最後に見せる方が、トラブルが起きにくい。
//ただし、時間がかかる場合があるので、プログレスバーを使って経過を知らせるのが望ましい。

ExcelApp.Visible[LCID] := True;
//プログレスバーの終了
ProgressEnd;//オリジナルDLLのAPI
//最後必ず、接続を解放すること。でないと、エクセルが操作不能になる。

ExcelSheet1.Disconnect;//1個のシートで複数制御する場合は、For文などの最後に記述してもいい。
ExcelBook.Disconnect;
ExcelApp.Disconnect;
end;

セルの選択

範囲指定での入力や編集と単体セルへの入力があります。

//単セルへの文字入力
// AColとARowの位置がStringGridと逆なんで注意
Cells.Item[ARow,ACol].Value := '文字列';
//セルの範囲選択
//範囲変数もあるので、入れてみる
var SelectRange:ExcelRange;
SelectRange := ExcelSheet1.Range['A1','E5'];
//セル名称の取得
//A1とかを文字化するのが面倒なんで、数列からの対応策

var RangeCode1,RangeCode2:String;
RangeCode1 := ExcelSheet1.Cells.Item[ARow,ACol].Address;
//上記だと、固定文字'$'がくっついてくるので
RangeCode2 := StringReplace(ExcelSheet1.Cells.Item[ARow,ACol].Address,'$','',[rfReplaceAll]);
SelectRange := ExcelSheet1.Range[RangeCode1,RangeCode2];
SelectRange.Select;
//上記と同様の処理
ExcelSheet1.Range[RangeCode1,RangeCode2].Select;
//選択された範囲を含むすべての行を選択(セルの左端灰色セルをクリックした状態)
SelectRange.EntireRow.Select;


セルの設定

セルの設定。


単セル(Cells.Items[ARow,ACol]) or 範囲(Range)
機能名 関数名 意味
     
固定セル名の取得 Address 固定セル名称の取得
シートの選択 Select シートを選択します。
  Activate  
  Cut  
コピー Copy シートをコピーします。
削除 Delete シートを削除します。
移動 Move シートタブを移動します。
挿入 Insert 行または列の挿入
引数:xlShiftDown,xlShiftUp, xlShiftToLeft,xlShiftToRight
消去 Clear すべてをクリアします。
書式消去 ClearFormats 書式をクリアします。
データ消去 ClearContents データのみクリアします。
コメント消去 ClearComments コメントをクリアします。
オートフィル AutoFill セルを引っ張るやつです。
改ページ PageBreak

選択セルを改ページして先頭行にします。

  FormatConditions  
オートフィット AutoFit  

 

単セル(Cells.Items[ARow,ACol]) or 範囲(Range)
項目名 プロパティ名 意味
セル内の文字 Value String 実際に入力される文字列
数字の表示形式 NumberFomula String セルの書式のユーザー定義のところを参照コピペ
条件付き書式 FormatConditions    
セルの結合 Merge Boolean ※Rangeのときのみ使用可
フォント Font TFont フォントのフォント名や色やオプションを設定できます。
セル内の文字の折り返し WrapText Boolean セル内の文字が収まりきらないときに、折り返すかどうか。
セル内の文字の縮小全表示 ShrinkToFit Boolean セル内の文字が収まりきらないとき、縮小表示するかどうか。
インデントを追加する AddIndent Boolean インデントを追加します。
  IndentLevel Integer インデントの移動量を設定します。AddIndentとセット利用。
       
       
       
縦位置 VerticalAlignment    
横位置 HorizontalAlignment    
列幅 ColumnWidth    
行高 RowHeight    

 

//セルの書式
ExcelSheet.Range['A1','A2'].NumberFomula := '#,##0;[赤]-#,##0';

//セルの結合
ExcelSheet.Range['A1','A2'].MergeCells := True;

//オートフィル(単列)
var RangeCode1,RangeCode2:String;

RangeCode1 := ExcelSheet.Cells.Item[ARow1,ACol1].Address;
RangeCode2 := ExcelSheet.Cells.Item[ARow2,ACol2].Address;
ExcelSheet.Range[RangeCode1,RangeCode1].AutoFill(Range[RangeCode1,RangeCode2],xlFillDefault);
※RangeCode1とRangeCode2は、縦一列か横1列でないとエラーが出るヨ。

//オートフィル(複数列)
var RangeCode1,RangeCode2,RangeCode3:String;

RangeCode1 := ExcelSheet.Cells.Item[ARow1,ACol1].Address;
RangeCode2 := ExcelSheet.Cells.Item[ARow2,ACol2].Address;
RangeCode3 := ExcelSheet.Cells.Item[ARow3,ACol3].Address;
ExcelSheet.Range[RangeCode1,RangeCode2].AutoFill(Range[RangeCode1,RangeCode3],xlFillDefault);
※RangeCode1とRangeCode3は対角線であることが必要

//改ページ
Range[RangeCode3,RangeCode3].PageBreak := 1;
※いろいろ試しましたが、何ページ目だろうが、入力するのは1

//セルの色変更
Range[RangeCode3,RangeCode3].Interior.ColorIndex := 6;
//セルの文字色変更
Range[RangeCode3,RangeCode3].Font.ColorIndex := 6;


TExcelWorkSheet

エクセルファイルのシート単位での制御に使用します。

TExcelWorkSheet
機能名 関数名 意味
接続 ConnectTo 実在シートと接続し、制御可能にします。
接続解除 DisConnect シートとの接続を解除します。
シートの選択 Select シートを選択します。
  Activate  
コピー Copy シートをコピーします。
削除 Delete シートを削除します。
移動 Move シートタブを移動します。
印刷 Print 印刷プレビューを表示します。
印刷プレビュー PrintPreview 印刷します。
     

 

TExcelWorkSheet
項目名 変数名 意味
セル Cells   単体のセル。セル位置を指定しない場合は、すべてのセルを対象とします。
用紙向きと用紙サイズ PageSetup    
  .Orientation   用紙の向き
  .PaperSize   用紙のサイズ
  .LeftMargin   左余白
  .RightMargin   右余白
  .TopMargin   上余白
  .BottomMargin   下余白
       

 

//セルを指定
ExcelSheet.Cells[1,1].Select;

//すべてのセルを指定
ExcelSheet.Cells.Select;

//用紙設定
with ExcelSheet.PageSetup do
begin
Orientation := xlPortrait;
PaperSize := xlPaperA4;
LeftMargin := 1;
RightMargin := 1;
TopMargin := 1;
BottomMargin := 1;
end;

TExcelWorkBook
エクセルファイル全体の制御に使用します。



TExcelWorkBook
機能名 関数名 意味
保存 Save  
名前を付けて保存 SaveAs  





TExcelWorkBook
項目名 変数名 意味
  Count    
       
       
       
       
       
       
       

 
TExcelApplication
エクセルアプリ自体の制御に使用します。



TExcelApplication
機能名 関数名 意味
接続 Connect  
接続解除 Disconnect  
表示終了 Quit  
     
     





TExcelApplication
項目名 変数名

意味
表示 Visible[integer] Boolean  
警告表示 DisplayAlerts[integer] Boolean  
       
       
       
       
       
       




超簡単プログレスバーのDLL

スマートな制御で利用したプログレスバーのソースを公開

プログレスバーフォームの表示
プログレスバーのダイアログフォームを起動初期化します。

function ProgressShow(hWnd: THandle;AMin,AMax,AStep:Integer;Title:PChar):Wordbool;stdcall;
begin
Result := False;
Application.Handle := hWnd;
frmProgress := TfrmProgress.Create(Application);
try
frmProgress.pbrInfo.Min := AMin;
frmProgress.pbrInfo.Max := AMax;
frmProgress.pbrInfo.Step:= AStep;
frmProgress.Caption := Title;
frmProgress.Show;
finally
Result := True;
end;
end;

Exports ProgressShow;


プログレスバーのステップアップ
プログレスバーをひとつ進めます。

procedure ProgressStep;stdcall;
begin
frmProgress.pbrInfo.StepIt;
end;

Exports ProgressStep;

 

プログレスバーフォームの終了
フォームを終了します。

procedure ProgressEnd; stdcall;
begin
frmProgress.Release;
Application.Handle := 0;
end;

exports ProgressEnd;

 


Copyright 2011 studio-take All Rights Reserved.