- PR -

エクセル上の画像の取得方法について

1
投稿者投稿内容
JAVA素人
常連さん
会議室デビュー日: 2004/06/15
投稿数: 22
投稿日時: 2005-02-02 16:12
いつもいろいろと勉強させていただいております。

現在、asp.net、C#でシステムを開発しています。

クライアントからエクセルファイルをサーバーにアップロードし、その内容をDBに更新する必要があります。
エクセル上のセルのデータの取得方法はわかりました。

エクセルに貼り付けてある画像を取得し、「jpeg」形式で別途保存したいのですが、エクセルに貼り付けてある
画像を取得し、保存するやり方がわかりません。どなたがご存知でしたらご教授ください。

private void Button1_Click(object sender, System.EventArgs e)
{
Excel.Application oXL;
Excel._Worksheet oSheet;
Excel.Range oRng;

try
{
oXL = new Excel.Application();
oXL.Workbooks.Open("d:\\excel\\test.xls",
   Missing.Value, Missing.Value, Missing.Value, Missing.Value,
   Missing.Value, Missing.Value, Missing.Value, Missing.Value,
   Missing.Value, Missing.Value, Missing.Value, Missing.Value,
   Missing.Value, Missing.Value);

oSheet = (Excel._Worksheet)oXL.ActiveSheet;
oRng = (Excel.Range)oSheet.Cells[1, 1];

string strvalue = oRng.Text.ToString();
//↑セル上にあるデータは取得することはできました。

//エクセル上の画像を取得し、「jpeg」でファイルに保存する方法がわかりません。

//↓で画像を取得できると思っているのですが、ここが間違っているのでしょうか?
//後、この先画像への変換方法がわかりません。
object obj = oSheet.Pictures(1);

}
catch(Exception)
{
}
}
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-02 18:02
引用:

//↓で画像を取得できると思っているのですが、ここが間違っているのでしょうか?
//後、この先画像への変換方法がわかりません。
object obj = oSheet.Pictures(1);



「ビットマップとして貼り付け」されているとすれば、obj にはおそらく古典的な PictureDisp の参照が格納されているのではないかと思います。

PictureDisp は IPicture を実装しているはずですから、IPicture::get_HANDLE() で GDI ハンドルを取得して Bitmap::FromHBitmap() すれば、Bitmap.Save() で JPEG 形式で保存できるんじゃないでしょうか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
JAVA素人
常連さん
会議室デビュー日: 2004/06/15
投稿数: 22
投稿日時: 2005-02-02 19:58
さっそくの返答ありがとうございます。

質問があるのですがPictureDisp、 IPictureはどのようなクラスなのでしょうか?

参照設定に「OLE Automation」は追加しました。

C#の経験が短いためどのようにソースを実装すればよいのかよくわかりません。

お手数でなければ、もう少し具体的なソースを教えていただけないでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-02 21:27
引用:

質問があるのですがPictureDisp、 IPictureはどのようなクラスなのでしょうか?



OLE 由来のインターフェースです。

IPictureDisp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/ctin_p_4gfk.asp

IPicture
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/ctin_p_482t.asp

引用:

参照設定に「OLE Automation」は追加しました。



なら、その中にモロ IPictureDisp, IPicture の定義がありますよね?

引用:

お手数でなければ、もう少し具体的なソースを教えていただけないでしょうか?



stdole.IPicture picture = obj as stdole.IPicture;
IntPtr hbm = picture.Handle;
Bitmap bitmap = Image.FromHBitmap(hbm);

とか。

動作確認していませんし、エラー処理はおろか COM オブジェクトの参照カウントのこともまるで考えてないコードなので、要注意です。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
JAVA素人
常連さん
会議室デビュー日: 2004/06/15
投稿数: 22
投稿日時: 2005-02-03 11:05
ありがとうございます。

試してみたのですがIpictureへの型変換でエラーが起きてしまいます。

Excel.Pictureの型がどのような型であるかご存知であればご教授いただけないでしょうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-03 12:21
引用:

Excel.Pictureの型がどのような型であるかご存知であればご教授いただけないでしょうか。



文字通り object 型です。

Pictures [0] と Pictures [1] では、異なる型(=CoClass)のオブジェクトが格納されている可能性があるからです。

OLE オートメーションの世界では往々にして PictureDisp であることが多いはずですが、それ以外である可能性も否定できません。

人間の目から見て「絵」であっても、いろんな形式があるからです。

なので、IPicture にキャストできるのは、最初に書いたように「ビットマップとして」貼り付けられている場合です。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
JAVA素人
常連さん
会議室デビュー日: 2004/06/15
投稿数: 22
投稿日時: 2005-02-03 14:03
回答ありがとうございます。

いろいろと試してみたのですがうまくいきませんでした。

納期が迫っていることもあり、今回は画像は別途アップロードすることで対応することにしました。

いろいろと教えていただいて勉強になりました。また時間があるときにいろいろと調べてみようと思っています。
1

スキルアップ/キャリアアップ(JOB@IT)