C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Excelにバイナリファイルの画像を挿入

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■96643 / inTopicNo.1)  Excelにバイナリファイルの画像を挿入
  
□投稿者/ くま (6回)-(2021/01/05(Tue) 12:05:59)

分類:[VB.NET/VB2005 以降] 

環境
Win10 64bit
VisualStudio2019


以前こちらの掲示板を利用させて頂いたくまと申します。


今回困っているのは、VB.netよりExcelに画像を挿入する処理です。

元々は以下コードのようにパスを指定して画像ファイルを挿入していました。

Exl.oShapes = Exl.xlSheetTem.Shapes
Exl.xlRange = Exl.xlSheetTem.Range("B33")
Exl.oShapes.AddPicture(ImgPath, False, True, CType(Exl.xlRange.Left, Single), CType(Exl.xlRange.Top, Single), Width, Height)

※補足
ImgPath:ファイルフルパス
Width:図の幅
Height:図の高さ


今回からOracleのデータベース上にバイナリファイルとして登録する運用となり、そこからファイルを取得してExcelファイルに挿入する修正が必要となりました。
ネットで検索してもピンポイントで良いコードを見つけることができず。。。
恐れ入りますがバイナリファイルをExcelへ挿入する方法をご教示頂けないでしょうか。


引用返信 編集キー/
■96644 / inTopicNo.2)  Re[1]: Excelにバイナリファイルの画像を挿入
□投稿者/ Hongliang (1136回)-(2021/01/05(Tue) 13:19:10)
とりあえず2つ思いつきます。

1つは、バイナリをいったんテンポラリファイルとしてファイルに書き出してしまうこと。
これはまあそのままですね。
分かりやすいですし、テンポラリファイル禁止という制約でもない限りはこれでいいんじゃないでしょうか。

もう1つは、クリップボードを経由して貼り付けること。
DBから取得したのがByte配列として、
New MemoryStream(Byte()) でStreamオブジェクトを作り、
Image.FromFile(Stream) でImageオブジェクトを作り、
Clipboard.SetImage(Image) でクリップボードに画像をセットできます。
その後ワークシートにPasteすればShapesの最後尾に新しいShapeが追加されるので、
それのLeft/Top/Width/Heightを設定します。

クリップボードは全てのアプリケーションが変更できるものなので、SetImageからPasteの間にほかのアプリケーションがクリップボードを変更したりする可能性がないとは言えないのが微妙なところですが…。
引用返信 編集キー/
■96646 / inTopicNo.3)  Re[2]: Excelにバイナリファイルの画像を挿入
□投稿者/ くま (8回)-(2021/01/05(Tue) 14:19:01)
Hongliang様 ご返信ありがとうございます。

ご教示頂いたクリップボード経由で対応してみることにしました。

記載頂いた以下内容までは正常に実装できました。(Excelに張り付けるところまではできました。)
> DBから取得したのがByte配列として、
> New MemoryStream(Byte()) でStreamオブジェクトを作り、
> Image.FromFile(Stream) でImageオブジェクトを作り、
> Clipboard.SetImage(Image) でクリップボードに画像をセットできます。


ただ、あまりExcelを使用した処理に慣れておらず以下の部分がうまくコードに落とし込むことができません。。。というよりは正直なところ理解できていないというほうが正しいです。
> その後ワークシートにPasteすればShapesの最後尾に新しいShapeが追加されるので、
> それのLeft/Top/Width/Heightを設定します。


現状のコードは以下となります。
-------------------------------------------------------------
'バイナリファイルを取得し変換
Dim hStream As New System.IO.MemoryStream(bImageArray)
Dim iImage As Image

'イメージファイルのセット
iImage = Image.FromStream(hStream)

'クリップボードに画像をセット
Clipboard.SetImage(iImage)

'画像の貼り付け
Exl(1).xlSheetTem.Paste()
-------------------------------------------------------------

この後に画像の位置やサイズを設定したいのですが、テスト的に以下コードを実装したところエラーが発生してしまいます。
Exl(1).xlSheetTem.Shapes.left = 100


何から何まで申し訳ございませんが、画像の位置・サイズ設定方法をご教示頂けないでしょうか。
あとやはりセルの位置("B33"など)を指定してペーストすることはできないでしょうか。
引用返信 編集キー/
■96649 / inTopicNo.4)  Re[3]: Excelにバイナリファイルの画像を挿入
□投稿者/ Hongliang (1139回)-(2021/01/05(Tue) 15:05:28)
> 何から何まで申し訳ございませんが、画像の位置・サイズ設定方法をご教示頂けないでしょうか。

一般的なExcelオートメーションだと、

' 事前にクリップボードにSetImageしているものとする
Dim sheet As Worksheet
sheet = ... ' Worksheetsオブジェクトから目的のWorksheetを取得して設定する
sheet.Paste()
Dim shapes AS Shapes = sheet.Shapes
Dim pastedShape As Shape = shapes(shapes.Count) ' 最後尾のShapeを取得する
pastedShape.Left = ... ' 以下、他のプロパティも同様に

> あとやはりセルの位置("B33"など)を指定してペーストすることはできないでしょうか。

Pasteの前に目的のセルをアクティブにすれば可能です。

Dim range As Range = sheet.Range("B33")
range.Activate()
sheet.Paste()


なお、お書きになってる中にExlやxlSheetTemなど私の知らないものが出てきているので、
私の書いた「一般的なExcelオートメーション」をそのまま適用できるかは存じません。
引用返信 編集キー/
■96654 / inTopicNo.5)  Re[4]: Excelにバイナリファイルの画像を挿入
□投稿者/ くま (9回)-(2021/01/05(Tue) 16:33:41)
Hongliang様 あらためてご返信ありがとうございます。

ご記載頂いた内容で解決することができました。

> なお、お書きになってる中にExlやxlSheetTemなど私の知らないものが出てきているので、
> 私の書いた「一般的なExcelオートメーション」をそのまま適用できるかは存じません。
混乱させてしまい大変申し訳ございません。

私の説明不足にもかかわらず、丁寧にご教示頂き誠にありがとうございます。本当に助かりました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ