QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Excelに画像ファイルを貼り付ける方法

こんばんは。

Excelにtifファイルを貼り付ける処理を記述していてエラーになって
困っているのでどなたか教えてください。
過去ログなどでみなさんコメントを参考にしているのですが、VBコードをC#で
記述しようとすると、なかなか上手くいきません。

今回は以下の箇所でエラーとなってしまします。

====================================================================
Excel.Picture picture;
Excel.Pictures pictures;

ここ→ pictures = (Excel.Pictures)workSheet.Pictures(0);
picture = pictures.Insert(TiffFilePath, Missing.Value);

      picture.Left = 0;
      picture.Top = 500;

      excelWorkBook.Save();
      excelWorkBook.Close(Missing.Value, Missing.Value, Missing.Value);
      excelApplication.Quit();

====================================================================

MSDNを読んでもいまいちよくわかりませんでした。
pictures = (Excel.Pictures)workSheet.Pictures(0);
「HRESULT からの例外: 0x800A03EC」というエラーです。
〜.Pictures(); の引数は何を意味しているのでしょうか。
宜しくお願いします。

質問者:Liquid_Force

回答

こんにちわ。
じゃんぬねっとさん、回答ありがとうございます。

いまだによく理解できてないのですが、パラメータを0→1へ変更しても
エラーとなってしまいます。

「System.InvalidCastException
 型 'System.__ComObject' の COM オブジェクトを
 インターフェイス型 'Microsoft.Office.Interop.Excel.Pictures' に
 キャストできません。
 IID '{000208A7-0000-0000-C000-000000000046}' が指定された
 インターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに
 次のエラーが発生したため、この操作に失敗しました:
 インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002(E_NOINTERFACE))」

ExcelのDLLは参照設定で追加しているのですが、それ以外に何か必要な設定が
あるのでしょうか?
宜しくお願いします。

投稿者:Liquid_Force

編集 履歴 (0)

Liquid_Forceさんの書き込み (2008-06-24 14:10) より:

【VB.NET】参考PG

xlPictures = DirectCast(xlWorksheet.Pictures, Excel.Pictures)

【C#.NET】小職PG

pictures = (Excel.pictures)workSheet.pictures(1);

pictures = (Excel.pictures)workSheet.pictures();
でもダメ?

投稿者:test

編集 履歴 (0)

みなさんコメントありがとう御座います。

にもかかわらず理解できず、へこみ中ですorz
◆まるくさん
C#で記述すると引数を求められ、ビルドエラーとなってしまう為です。

◆ひろれいさん
めちゃめちゃ当サイトにはお世話になっているので参考PGというのは
まさにリンク張って頂いたじゃんぬねっとさんの記述です。

今じゃんぬさんのサイトで「COMオブジェクトの参照カウントを開放する」とかを
読んでました。。。うぅ

投稿者:Liquid_Force

編集 履歴 (0)

Liquid_Forceさんの書き込み (2008-06-24 16:57) より:

なんと!?変換ページなんかあるんですか!!!(コード変換)

知りませんでした(汗

ご参考までに。

  C#のコードをVB.NETへ、VB.NETのコードをC#へ変換する

投稿者:ひろれい

編集 履歴 (0)

じゃんぬねっとさん、ひろれいさん、コメントありがとう御座います。
※コードまで書いて頂いて m(_ _)m
私もできました!!!(Missing.Valueで)

ホント忙しい中ありがとう御座います、助かります。
なんと!?変換ページなんかあるんですか!!!(コード変換)
知りませんでした(汗

C#からVBScriptを利用する方法は次回の案件で導入するようがんばります。

あとは画像のサイズ変更とかが必要なのでがんばります!
また助けを求めてしまうと思いますが・・・

他にもコメントくださった方々ありがとう御座います。
私もコメントできるよう学びます。

投稿者:Liquid_Force

編集 履歴 (0)

おっ!
Missing.Value でいけるじゃん!

って思ったら、既にじゃんぬさんが完璧なサンプルを提示してた・・・orz

まあ、初めて C# をさわって勉強になったので良いですが(負け惜しみw

スレ主さんはご存知かもしれませんが、Web 上で VB.NET → C# にコード変換してくれるページ(逆ももちろんあり)がありますので、そういった機能を使うと省力化できると思います。
もちろん、完璧には変換してくれないので、手直しの部分も多いのですが。

投稿者:ひろれい

編集 履歴 (0)

久しぶりにいつもの鬼インデントのコードを書いてみました。




    private static void MosaMosaAA() {
        Excel.Application xlApplication = null;

        try {
            xlApplication = new Excel.Application();
            xlApplication.Visible = true;
            xlApplication.DisplayAlerts = false;
            Excel.Workbooks xlWorkbooks = null;

            try {
                xlWorkbooks = xlApplication.Workbooks;
                Excel.Workbook xlWorkbook = null;

                try {
                    xlWorkbook = xlWorkbooks.Add(System.Reflection.Missing.Value);
                    Excel.Sheets xlSheets = null;

                    try {
                        xlSheets = xlWorkbook.Worksheets;
                        Excel._Worksheet xlWorksheet = null;

                        try {
                            xlWorksheet = (Excel._Worksheet)xlSheets[1];
                            Excel.Pictures xlPictures = null;

                            try {
                                xlPictures = (Excel.Pictures)xlWorksheet.Pictures(System.Reflection.Missing.Value);
                                Excel.Picture xlPicture = null;

                                try {
                                    xlPicture = xlPictures.Insert(@"C:\駅のホームですっぽんぽん!.jpg", System.Reflection.Missing.Value);
                                    xlWorkbook.SaveAs(
                                        @"C:\MakiMakiLove.xls",
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        Excel.XlSaveAsAccessMode.xlNoChange,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value,
                                        System.Reflection.Missing.Value
                                    );

                                    System.Windows.Forms.MessageBox.Show("んっ!! ちゃんと表示されたから閉じるゾ!");
                                } finally {
                                    if (xlPicture != null) {
                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlPicture);
                                    }
                                }
                            } finally {
                                if (xlPictures != null) {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlPictures);
                                }
                            }
                        } finally {
                            if (xlWorksheet != null) {
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorksheet);
                            }
                        }
                    } finally {
                        if (xlSheets != null) {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
                        }
                    }
                } finally {
                    if (xlWorkbook != null) {
                        try {
                            xlWorkbook.Close(
                                System.Reflection.Missing.Value,
                                System.Reflection.Missing.Value,
                                System.Reflection.Missing.Value
                            );
                        } finally {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
                        }
                    }
                }
            } finally {
                if (xlWorkbooks != null) {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbooks);
                }
            }
        } finally {
            if (xlApplication != null) {
                try {
                    xlApplication.Quit();
                } finally {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication);
                }
            }
        }        
    }

たぶんこれで画像が Worksheet の左上のところに挿入されるハズです。

こんなコードを書くより COM に適した言語 (VB | VBScript) などを利用した方が賢明ですね。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

ひろれいさんの書き込み (2008-06-24 14:24) より:

役に立つ時がきたようですねwww

スレ主さんは、C# への変換で困っているようですが・・・

本人が忘れていたらしいです。

testさんの書き込み (2008-06-24 14:43) より:

pictures = (Excel.pictures)workSheet.pictures();

でもダメ?

引数が省略できるわけではないので、コンパイル エラーになって実行ができなくなると思います。

C# からだと Excel._Worksheet インターフェイスからでないと Pictures を MissingValue 指定できないハズです。 VB はちょっと特殊で複数のインターフェイスをあたかもひとつのものかのように参照できるので先のコードで問題ありません。 ちょっと記憶が曖昧です。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

スレ主さんは、下記を見ているのかな。

  Excelへの画像の挿入について

役に立つ時がきたようですねwww
スレ主さんは、C# への変換で困っているようですが・・・

Liquid_Forceさんの書き込み (2008-06-24 14:10) より:

すみません、何度も。

1つしかないものを複数系にキャストしてるというのは

Worksheetオブジェクトが1つで、Excel.picturesが複数ということでしょうか。

Insertメソッドはpictures(複数系?)にしかないみたいなのですが、

どうやって使用したらよいかわかないのでご指導お願いします。

【VB.NET】参考PG

xlPictures = DirectCast(xlWorksheet.Pictures, Excel.Pictures)

【C#.NET】小職PG

pictures = (Excel.pictures)workSheet.pictures(1);

投稿者:ひろれい

編集 履歴 (0)

参考にしている元PGには、Pictures*(1)と書いていないのに、貴方のPGにはなぜ(1)*がついているのですか?

【VB.NET】参考PG

xlPictures = DirectCast(xlWorksheet.Pictures, Excel.Pictures)

【C#.NET】小職PG

pictures = (Excel.pictures)workSheet.pictures(1);

投稿者:まるく

編集 履歴 (0)

すみません、何度も。
1つしかないものを複数系にキャストしてるというのは
Worksheetオブジェクトが1つで、Excel.picturesが複数ということでしょうか。

Insertメソッドはpictures(複数系?)にしかないみたいなのですが、
どうやって使用したらよいかわかないのでご指導お願いします。

【VB.NET】参考PG
xlPictures = DirectCast(xlWorksheet.Pictures, Excel.Pictures)
【C#.NET】小職PG
pictures = (Excel.pictures)workSheet.pictures(1);

投稿者:Liquid_Force

編集 履歴 (0)

Liquid_Forceさんの書き込み (2008-06-24 11:52) より:

いまだによく理解できてないのですが、パラメータを0→1へ変更しても

エラーとなってしまいます。

それだけが原因ではありません。

もう一度書かせて頂きますが、1 つでしかないモノを無理矢理 「複数系」 のものにキャストしているので例外が発生します。 例外情報にもキャストできないと書いてありますよね。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

Liquid_Forceさんの書き込み (2008-06-23 21:16) より:

ここ→ pictures = (Excel.Pictures)workSheet.Pictures(0);

1 つでしかないモノを無理矢理 「複数系」 のものにキャストしているので例外が発生します... と思ったのですが、引数が 0 なのがそもそも問題のような... 1 の間違いではないかと思います。

Pictures メソッドの引数は '複数の Picture のうちのどの Index に当てはまる Picture を返すか' を示すものです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。