忘れないように書いておこう
DelphiでExcel出力するのに最近はよくOLEを使う。PCにインストールされているExcelを非表示で起動し、ワークブックを追加、書き込みを行った後、保存して終了、という手順だ。
ところがすでにExcelが起動しているとき、これをやると前から開いていたワークブックもろともExcelが終了してしまう。
今までは、このようなプログラムを使うときはユーザーにはあらかじめ開いているExcelは終了させるようにして貰っていたのだが。
まあ、プログラムからなんの警告もないのに、事前にExcelを終了させろと言うのも無理がある。
そこで、すでに起動しているExcelがあるときはそれを閉じずに終わるように書き換えたので、備忘録。いや、ユーザーからクレームが来たんです、せめて『Excelを閉じてね』ってメッセージを表示させろって。何度か、保存していないワークブックが消滅したらしい。
フォームに TExcelApplicationをポトリしておく。
Uses
??
Excel2000, OleServer, OleCtrls, ExcelXP;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
ExcelApplication1: TExcelApplication;
??
procedure TForm1.WriteExcel;
var
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
ExcelRunning : Boolean;
begin
ExcelWorkbook1 := TExcelWorkbook.Create(nil);
ExcelWorksheet1 := TExcelWorksheet.Create(nil);
try
ExcelApplication1.Connect; // Excel 起動
ExcelApplication1.Visible[0] := false; // 非表示
if (ExcelApplication1.Workbooks.Count>0) // 既にワークブックがあるかどうか
then ExcelRunning := True // あれば、Excelが起動中
else ExcelRunning := False;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(xlWBatWorkSheet, 0)); // ブック追加
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _WorkSheet);
ExcelWorksheet1.Name := ‘Sheet1′;
ExcelWorksheet1.Range[’A1′, EmptyParam].Value2 := ‘テスト’; // 書き込み
ExcelWorkbook1.SaveAs(SaveDialog1.FileName, // Filename
Integer(xlNormal), //FileFormat
EmptyParam, //Password
EmptyParam, //WriteResPassword
False, //ReadOnlyRecommended
False, //CreateBackup
xlNoChange, //AccessMode
EmptyParam, //ConflictResolution
EmptyParam, //AddToMru
EmptyParam, //TextCodepage
EmptyParam, //TextVisualLayout
EmptyParam, //Local
0); //LCID
finally
ExcelWorkbook1.Close;
ExcelWorkbook1.Disconnect;
ExcelWorkbook1.Free;
if not ExcelRunning then begin
ExcelWorksheet1.Disconnect;
ExcelWorksheet1.Free;
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
end else begin
ExcelApplication1.Visible[0] := true; // 表示
end;
end;
close;
end;
試行錯誤しながらなんとか出来たが、これが正しい方法かどうかは知らない。
WindowsXP + MS Office 2003、Windows7 + MS Office 2010でも大丈夫そう。――開発環境はDelphi2007だったかな。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/805
この投稿には、まだコメントが付いていません