Delphi Programming / Object Pascal
[掲載 2007年03月11日] [更新 2014年02月13日] Delphi サンプルプログラム集 |
420_TExcelApplication でグラフの作成例 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010 |
|
420_Excel_ChartObject.zip [665 KB] 2014年01月12日版 (EXE 同梱) |
TExcelApplication によるグラフの作成例 |
TExcelApplication を使用して,指定のシートにグラフを作成する例です.
Microsoft Office 2000 オートメーションサーバーラッパーコンポーネントを使用しています.使用する Office つまりエクセルのラッパークラスのバージョンによっては,使用可能なプロパティやメソッドあるいは,メソッドの引数が違う場合があります.
TExcelChart というコンポーネントがありますが,以下のコードでは,ChartObjectを使用してグラフに対する操作を行っています. |
エクセルのオブジェクトを MSDN の記事で調べるには,例えば PlotArea であれば,PlotArea オブジェクトを調べます.階層的になっていなので注意が必要です. |
|
図1
設計時画面
- 以下のコンポーネントを配置
TExcelApplication
TExcelWorkBook
TExcelWorkSheet
|
|
図2
添付のブックを開いた直後
|
|
図3
[チャート作成] 実行 |
|
図4
[チャートの操作] 実行 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Excel2000, OleServer;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
OpenDialog1: TOpenDialog;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private 宣言 }
procedure BookOpen(ABookName: String);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
const
LCID: DWORD = LOCALE_SYSTEM_DEFAULT;
{$R *.DFM}
//=============================================================================
// エクセルに隠れないようにこのFormを常に最前面の右上に表示するようにする
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
FormStyle := fsStayOnTop;
Self.Left := Screen.PrimaryMonitor.Width - Self.Width;
Self.Top := Screen.PrimaryMonitor.Top;
end;
//=============================================================================
// Formを閉じる時はエクセルの終了処理も実行
//
// 順番にDisconnect.TExcelApplicationはQuitが必要.
// もし複数のWorkbook,WorkSheetオブジェクトを生成している場合はそれらのClose
// やDisconnect処理も必要.
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ExcelApplication1.Application.Visible[LCID] then begin
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Close(False,EmptyParam);
Application.ProcessMessages;
ExcelWorkbook1.Disconnect;
end;
ExcelApplication1.Quit;
ExcelApplication1.Disconnect;
end;
//=============================================================================
// ブックを開く
// ファイルオープンダイアログを使用して選択
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
EFile: String;
begin
//開く対象はエクセルのブック
OpenDialog1.Filter := 'Excelブック (*.xls)|*.xls';
//初期フォルダは起動フォルダ
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
if OpenDialog1.Execute then begin
EFile := OpenDialog1.FileName;
BookOpen(EFile);
end;
end;
//=============================================================================
// エクセルを閉じて終了
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
//=============================================================================
// ブックを開くメソッド
// 開いたらSheet1をアクティブにする
//=============================================================================
procedure TForm1.BookOpen(ABookName: String);
var
objExcelApp : OleVariant;
begin
//表示更新停止
ExcelApplication1.ScreenUpdating[LCID] := False;
if ExcelApplication1.Application.Visible[LCID] then begin
//現在のシートとブックのDisconnect処理
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Close(False, EmptyParam, False,LCID);
end;
ExcelWorkbook1.Disconnect;
//ブックを開いてWorkbook,WorkSheetに接続
//Openメソッドの引数は多いので,省略するためにOleVariant型で扱うものとする
objExcelApp := ExcelApplication1.Application;
objExcelApp.Workbooks.Open(FileName := ABookName);
ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets['Sheet1'] as _Worksheet);
ExcelWorksheet1.Activate;
//終了時に保存確認ダイアログを表示しない
ExcelApplication1.DisplayAlerts[LCID] := False;
//表示更新開始
ExcelApplication1.ScreenUpdating[LCID] := True;
ExcelApplication1.Visible[LCID] := True;
end;
//=============================================================================
// チャート(グラフ)の作成
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
ExcelHandle : HWND;
ARange : ExcelRange;
objChart : Excel2000._Chart;
begin
ExcelHandle := FindWindow('XLMAIN', nil);
LockWindowUpdate(ExcelHandle);
//チャート(グラフ)を作成
ExcelApplication1.Charts.Add(EmptyParam, EmptyParam, 1, EmptyParam, LCID);
//データ範囲(項目と系列ラベル分を含む)
ARange := ExcelWorksheet1.Range['A1', 'C4'];
//作成したばかりの時点ではこのグラフがActive.このグラフをSheet1に表示
objChart := ExcelApplication1.ActiveChart.Location(xlLocationAsObject, 'Sheet1');
objChart.ChartWizard(
ARange, //グラフ化するデータの範囲
xlColumn, //グラフの種類
EmptyParam, //組込みオートフォーマットのオプション番号
xlColumns, //データ系列の方向.xlRowsまたはxlColumns
1, //データ範囲の項目ラベルの行または列数
1, //データ範囲の系列ラベルの行または列数
True, //凡例を表示するにはTrue
'グラフサンプル', //グラフのタイトル文字列
'製品名', //項目軸のタイトル文字列
'出荷数', //数値軸のタイトル文字列
EmptyParam, //3-D系列軸または2-Dの第2数値軸のタイトル
LCID
);
LockWindowUpdate(0);
end;
//=============================================================================
// いろいろ操作
// テストのためChartObjectと,ActiveChartの両方を使用してみた
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
ExcelHandle : HWND;
AChart : ChartObject;
objChart : Excel2000._Chart;
objCollection : OleVariant;
begin
ExcelHandle := FindWindow('XLMAIN', nil);
LockWindowUpdate(ExcelHandle);
//チャートオブジェクトの選択
AChart := ExcelWorksheet1.ChartObjects('グラフ 1') as ChartObject;
//表示位置を変更(数値はポイント単位)
AChart.Left := 20;
AChart.Top := 100;
AChart.Width := 400;
AChart.Height := 300;
AChart.Activate;
objChart := ExcelApplication1.ActiveChart;
objChart.PlotArea[LCID].Top := 20;
//プロット領域の背景はxlNone
objChart.PlotArea[LCID].Interior.ColorIndex:=xlNone;
//全体のフォントサイズは12pt
objChart.ChartArea[LCID].Font.Size := 12;
//グラフのタイトルだけは20pt
objChart.ChartTitle[LCID].Font.Size := 20;
//棒グラフの色を変更
objCollection := objChart.SeriesCollection(1, LCID);
objCollection.Interior.ColorIndex := 35;
objCollection := objChart.SeriesCollection(2, LCID);
objCollection.Interior.ColorIndex := 15;
LockWindowUpdate(0);
end;
end.
|