したいこと
- VSTOでワード(Word)のセルの内に画像を挿入したい。
- VSTOでワード(Word)のセルの内に画像を貼り付けたい。
- C#でワード(Word)のセルの内に画像を挿入・貼り付けたい。
結論
cell.Range.InlineShapes.AddPicture() のように、Tableのセルを指定して、そこに貼り付けるとOKでした。
ほんとに資料がなくて、英語でもなくて、3時間ぐらいはここら辺をウロチョロしてました。かなり価値はあると思います。
経緯
前やったみたいに、VSTO Excelならそこそこ簡単にできたので、ワード(Word)でも簡単に実現できかと思ってました。
現在の位置に画像を貼り付ける(成功)
Word VSTOの公式サンプルコードを参考に例のごとく、ボタンから挿入するようにしました。ボタンから挿入しないとWordの文書が開いていないと、Visual Studioに怒られます。以下がそのコードです。
// 長くなるのでappとしました。 Application app = Globals.ThisAddIn.Application; // 画像の貼り付け app.Selection.InlineShapes.AddPicture(@"C:\tmp\img.png");
これは簡単にできます。そして、文字列の折り返しの設定をInline(行内)から変換する場合は、オブジェクトを変換する必要があります。以下そのコード
// Shapeを変換 Shape conShape = shape.ConvertToShape(); // Shapeを図の設定を「前面」に設定。 conShape.WrapFormat.Type = WdWrapType.wdWrapFront; conShape.Top = 200; conShape.Left = 150;
Word文書に表を作成する(成功)
Word VSTOの公式サンプルコードを参考に上記と同じように、Wordに表を挿入します。using Microsoft.Office.Interop.Word;が先頭で定義されています。
// 長くなるのでappとしました。 Application app = Globals.ThisAddIn.Application; // 表の場所を選択 Range tableLocation = app.ActiveDocument.Range(0, 0); // 表の作成 Table newTable = app.ActiveDocument.Tables.Add(tableLocation, 3, 4); newTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle; newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle; // 行方向の高さを設定 newTable.Rows.Height = 50;
表の中に画像をそのまま貼り付けてみた(失敗)
以下失敗例をリストアップ。だめなものは繰り返さないでくださいね。
- そのまま、上記コードを順番を変えて連続してやってみましたがうまくいきません。
- Cellで選択後[cell.Select()を実行後]、現在の位置に画像を貼り付けるを行ってもだめ。。
他にも色々失敗がありましたが、混乱するのでここらへんでやめておきます。
表への画像の貼り付け[成功コード]
せっかくなので、表に文字を貼り付ける公式サンプルと併せて、画像の貼り付けをやってみます。Talbes[1]と指定してますが、上記のnewTableを使用しても可です。
// セル1へテキストを左詰めで挿入 Cell cell1 = app.ActiveDocument.Tables[1].Cell(1, 1); cell1.Range.Text = "Name1-1"; cell1.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft; // セル1へ画像を貼り付けます (ここがミソ) cell1.Range.InlineShapes.AddPicture(@"C:\tmp\img.png"); // セル2へテキストを左詰めで挿入 Cell cell2 = app.ActiveDocument.Tables[1].Cell(2, 2); cell2.Range.Text = "Name2-2"; cell2.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft; // セル2へ画像を貼り付けます (ここがミソ) cell2.Range.InlineShapes.AddPicture(@"C:\tmp\img.png");
実行結果が以下です。
まとめ
英語も含めて検索してもまともな感じのコードが出てこなかったので、色々とテストしてみて、ようやく正しい動きになりました。是非ご活用ください。