C#でエクセル操作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
なつ

C#でエクセル操作

#1

投稿記事 by なつ » 15年前

こんばんわ。

C#でエクセルのヘッダ部分に画像を張り付けたいんですけど、できるのでしょうか??
できるのでしたら、参考になるような分りやすいサイトを教えてください!!

よろしくお願いします。

Mr.Vince

Re:C#でエクセル操作

#2

投稿記事 by Mr.Vince » 15年前

恐らくできるものと思いますが(Worksheet.PageSetup.headerオブジェクトからアクセス)
探してみて解説サイトが見つかりませんでしたので、自分がマイクロソフト公式リファレンスから調べた感じ、こんな感じになると思います。


//事前に該当ワークシートをoWorksheetとして取得している物と仮定
//画像ファイルパスがdat\a.bmpと仮定

oWorksheet.PageSetup.CenterHeaderPicture.Filename = "dat\a.bmp";



参考:公式リファレンスのPageSetupのメンバ
http://msdn.microsoft.com/en-us/library ... mbers.aspx

なつ

Re:C#でエクセル操作

#3

投稿記事 by なつ » 15年前

ありがとうございます。

参考にさせていただきます。
分らなくなったら、またお願いします。

なつ

Re:C#でエクセル操作

#4

投稿記事 by なつ » 15年前

こんばんわ。

↑参考にしてしてみました。
でも、ヘッダに画像はつきませんでした。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Excel.Application oXlsApp;
Excel.Worksheet oSheet;

private void button1_Click(object sender, EventArgs e)
{
// エクセル起動
oXlsApp = new Excel.Application();

// ブック追加
oXlsApp.Application.Workbooks.Add(Type.Missing);

// シート選択
oSheet = (Excel.Worksheet)oXlsApp.Worksheets[1];
oSheet.PageSetup.LeftHeaderPicture.Filename = @"xxx.bmp";

// エクセル表示
oXlsApp.Application.Visible = true;

}
}
}
ご指摘お願いします。

Mr.Vince

Re:C#でエクセル操作

#5

投稿記事 by Mr.Vince » 15年前

上のプログラムをそのまま使っているのだとしたら、1点、疑問点があります

oXlsApp.Worksheets[1]
→C#でも配列インデックスは「0」から始まります。正しいWorksheetを見ておりますでしょうか?(若しくは、そのWorksheetは存在しておりますか?)

以上で動かない場合、Visual C#環境ならば、ブレイクポイントをoXlsApp.Worksheets[1] 辺りに取り付け、ちゃんと各パーツ(Workbook、Worksheet等)が正しく設定されているかどうかをチェックすることをお勧めします。

YuO

Re:C#でエクセル操作

#6

投稿記事 by YuO » 15年前

シートのヘッダに画像を表示する,という設定をしていないために表示されないのでしょう。
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) を忘れないようにする必要があります。

なつ

Re:C#でエクセル操作

#7

投稿記事 by なつ » 15年前

Mr.Vince さん
YuO さん

ありがとうございます。
無事ヘッダに挿入できました。

閉鎖

“C言語何でも質問掲示板” へ戻る