徒然なるままに、日ぐらしP/Cに向ひて――
メインメニュー
ブログカレンダー
2012年 6月
« 5月   7月 »
 12
3456789
10111213141516
17181920212223
24252627282930
WordPress カテゴリ一覧
WordPress 検索


富士カメラ5

Kestrel とは、チョウゲンボウのことです。ハトくらいの小さな猛禽類、つまりワシの仲間で、ハヤブサに似ています。
チョウゲンボウにはホバリングという特技があります。よく農地の上空で空中に停止している姿が見られます。小さいけれどカッコイイ、そして最近は都会でも繁殖している頼もしいタカです。
このサイトのURLは、そんなチョウゲンボウから名前を借りました。

2012年6月27日(水曜日)

忘れないように書いておこう

カテゴリー: - flyman @ 23時05分00秒

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

このコメントのRSS

TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/805

この投稿には、まだコメントが付いていません

コメント

_CM_NOTICE

20 queries. 0.024 sec.
Powered by WordPress Module based on WordPress ME & WordPress

ヘッドライン
nikkansports
IT Pro
レスポンス
テーマ選択

(4 テーマ)