シートのヘッダに画像を表示する,という設定をしていないために表示されないのでしょう。
Office XPのExcel VBAのヘルプより引用しますが,
> With ActiveSheet.PageSetup.LeftHeaderPicture
> .FileName = "C:\Sample.jpg"
(省略)
> End With
>
> ' 左ヘッダーのイメージの表示を有効にします。
> ActiveSheet.PageSetup.LeftHeader = "&G"
最後のLeftHeaderに"&G"を設定することが抜けています。
で,C#でCOMを扱う上での鉄則ですが,必ずメソッド/プロパティで取得したオブジェクトは変数等に代入し,不要になった時点でMarshal.ReleaseComObjectを行ってください。
今回はExcel起動したら放ったらかすようなので問題ないのですが,COMをReleaseし忘れると,QuitしてもExcelが終了しない等の問題を抱えます。
提示されたプログラムを書き換えるなら,こうなるでしょうか。
var objects = new List<object>(); // 面倒なので,最後に一気に行うために溜める
try {
// エクセル起動
var excel = new Excel.Application();
objects.Add(excel);
// ブック追加
var books = excel.Workbooks;
objects.Add(books);
var newBook = books.Add(Type.Missing);
objects.Add(newBook);
// シート選択
var worksheets = newBook.Worksheets;
objects.Add(worksheets);
var targetSheetObject = worksheets[1]; // OfficeのCOMはVBA用なので,1から数え始める
objects.Add(targetSheetObject);
var targetSheet = (Worksheet)targetSheetObject;
// ヘッダに画像を追加
var pageSetup = targetSheet.PageSetup;
objects.Add(pageSetup);
var leftHeaderPicture = pageSetup.LeftHeaderPicture;
objects.Add(leftHeaderPicture);
leftHeaderPicture.Filename = @"xxx.bmp";
pageSetup.LeftHeader = "&G";
// エクセル表示
excel.Visible = true;
} finally {
objects.Reverse();
foreach (var obj in objects) {
try {
if (Marshal.IsComObject(obj)) Marshal.ReleaseComObject(obj);
} catch {
// finally節中なので,例外の送出は阻止する。ログ等への書き出しはあった方が良い
}
}
}
まだ調査していないのですが,C# 4.0のdynamic使ったCOMバインダでも,少なくともβ1時点ではReleaseComObjectが必須だったようです。
http://blogs.msdn.com/b/shozoa/archive/ ... n-dlr.aspx
C#ではRAIIが使えない上にGCがCOMと異なるため,非常に面倒ですが,Marshal.ReleaseComObject (or Marshal.FinalReleaseComObject) を忘れないようにする必要があります。