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

わんくま同盟

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

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

ツリー一括表示

ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/03(Tue) 15:00) #93294
Re[1]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/03(Tue) 16:14) #93295
  └ Re[2]: ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/03(Tue) 16:53) #93296
    └ Re[3]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/03(Tue) 17:34) #93297
      └ Re[4]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/03(Tue) 17:37) #93298
        └ Re[5]: ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/04(Wed) 10:58) #93307
          └ Re[6]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/04(Wed) 12:16) #93310
            └ Re[7]: ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/04(Wed) 13:21) #93311
              └ Re[8]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/04(Wed) 13:46) #93312
                └ Re[9]: ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/04(Wed) 15:41) #93313
                  └ Re[10]: ハードコピーした画像ファイルをエクセルに貼り付けたい /魔界の仮面弁士 (19/12/04(Wed) 16:13) #93314
                    └ Re[11]: ハードコピーした画像ファイルをエクセルに貼り付けたい /じょこびっち (19/12/04(Wed) 16:40) #93315 解決済み


親記事 / ▼[ 93295 ]
■93294 / 親階層)  ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (34回)-(2019/12/03(Tue) 15:00:19)

分類:[C#] 

現在はオシロスコープでハードコピーした画像ファイルをファルダに保存しています。
それをフォルダに保存をせずにアクティブになっているエクセルに直接貼り付けることは可能でしょうか?
貼り付け後はエクセルは閉じたくないです。
どうすればいいでしょうか?初学者なので行き詰っています。よろしくお願いします。

        private void button1_Click(object sender, EventArgs e)
        {
            HardCopy();
        }

        private void HardCopy()
        {
            string target_path = @"ここにパス";
            string target_name = @"screen.png";

            // オシロスコープへコマンド送信
            inst.WriteString("SAVe:IMAGe:FILEFormat PNG");
            inst.WriteString("HARDCopy STARt");

            Block = inst.IO.Read(102400);
            File.WriteAllBytes(target_path + target_name, Block);  
        }

[ □ Tree ] 返信 編集キー/

▲[ 93294 ] / ▼[ 93296 ]
■93295 / 1階層)  Re[1]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2502回)-(2019/12/03(Tue) 16:14:51)
No93294 (じょこびっち さん) に返信
> 現在はオシロスコープでハードコピーした画像ファイルをファルダに保存しています。
> それをフォルダに保存をせずにアクティブになっているエクセルに直接貼り付けることは可能でしょうか?
> 初学者なので行き詰っています。

実装は可能ですが、どこまでの説明が必要でしょうか?

画像ファイルになっていれば、Excel に自動的に貼り付けるコードを書けるけれど、
ファイル化せずに貼り付ける方法が分からない…という状況なのか、
それとも、そもそもプログラムから Excel の基本操作を行うための知識も必要なのか。


今ちょっと初学者向けに細かく説明している余裕が無いので、概要だけ書きますが、
Excel に画像を貼り付ける方法としては、下記の 3 パターンが思い当たります。
今回の要件だと、案 1 は没ですね。


=== 案 1 ===
一時的な画像ファイルに保存し、Excel の Shapes コレクションの
AddPicture / AddPicture2 メソッドで貼り付ける


=== 案 2 ===
クリップボードに格納し、Excel の Range オブジェクトの PasteSpecial メソッドで貼り付ける


=== 案 3 ===
OleCreatePictureIndirect API で Picture オブジェクトに変換し、
ワークシート上に貼った Image コントロールの Picture プロパティにセットする
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93295 ] / ▼[ 93297 ]
■93296 / 2階層)  Re[2]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (35回)-(2019/12/03(Tue) 16:53:31)
No93295 (魔界の仮面弁士 さん) に返信

> 画像ファイルになっていれば、Excel に自動的に貼り付けるコードを書けるけれど、
> ファイル化せずに貼り付ける方法が分からない…という状況なのか、

まさにファイル化せずに貼り付ける方法が分からないです。

> === 案 2 ===
> クリップボードに格納し、Excel の Range オブジェクトの PasteSpecial メソッドで貼り付ける

Clipboard.GetImage();で格納すればいいのでしょうか?

[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93296 ] / ▼[ 93298 ]
■93297 / 3階層)  Re[3]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2503回)-(2019/12/03(Tue) 17:34:39)
No93296 (じょこびっち さん) に返信
> Clipboard.GetImage();で格納すればいいのでしょうか?

逆です。格納なので SetImage ですね。(あるいは SetData / SetDataObject )
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93297 ] / ▼[ 93307 ]
■93298 / 4階層)  Re[4]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2504回)-(2019/12/03(Tue) 17:37:22)
No93297 (魔界の仮面弁士) に追記
>>Clipboard.GetImage();で格納すればいいのでしょうか?
> 逆です。格納なので SetImage ですね。(あるいは SetData / SetDataObject )

追加の情報として:
http://bbs.wankuma.com/index.cgi?mode=al2&namber=73415&KLOG=123
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93298 ] / ▼[ 93310 ]
■93307 / 5階層)  Re[5]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (36回)-(2019/12/04(Wed) 10:58:54)
No93298 (魔界の仮面弁士 さん) に返信

>>逆です。格納なので SetImage ですね。(あるいは SetData / SetDataObject )

教えていただいたメソッドの使い方がわからなかったので一旦エクセルに貼り付ける段階を踏む前にpictureboxに表示させてみようと思ったのですが表示されませんでした。下記のコードではダメなのでしょうか?
また、実際のコードではbmpではなく、png形式がいいのですがDataFormatsクラスではpngは使えないようなのですがその場合どうすればいいでしょうか?

Byte[] Block = inst.Read(102400);//オシロから戻ってきたデータ
Clipboard.SetDataObject(Block);
IDataObject data = Clipboard.GetDataObject();
if(data != null)
{
        Image img = (Image)data.GetData(DataFormats.Bitmap);
        if(img != null)
        {
            pictureBox1.Image = img;
        }
}

[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93307 ] / ▼[ 93311 ]
■93310 / 6階層)  Re[6]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2505回)-(2019/12/04(Wed) 12:16:52)
No93307 (じょこびっち さん) に返信
> Byte[] Block = inst.Read(102400);//オシロから戻ってきたデータ
> Clipboard.SetDataObject(Block);

これでは画像をコピーしたのではなく、
画像データの byte 配列をコピーしただけになってしまいます。

DataFormats.Bitmap で渡したいのなら、画像データを Bitmap クラスに変換してから
SetImage メソッドに渡してみてください。

「クリップ見え窓」等のクリップボードビューワーで、
どのようにセットされたのか確認しておくことをお奨めします。
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93310 ] / ▼[ 93312 ]
■93311 / 7階層)  Re[7]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (37回)-(2019/12/04(Wed) 13:21:57)
2019/12/04(Wed) 13:23:08 編集(投稿者)

No93310 (魔界の仮面弁士 さん) に返信
> DataFormats.Bitmap で渡したいのなら、画像データを Bitmap クラスに変換してから
> SetImage メソッドに渡してみてください。

やりたいのは受け取ったPNGファイルの画像データをファイル化せずにエクセルに画像を貼り付ける方法です。
教えていただいたにも関わらず具体的にどうしていいか結局わからず迷走しております。
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93311 ] / ▼[ 93313 ]
■93312 / 8階層)  Re[8]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2506回)-(2019/12/04(Wed) 13:46:48)
2019/12/04(Wed) 13:49:17 編集(投稿者)

No93311 (じょこびっち さん) に返信
> やりたいのは受け取ったPNGファイルの画像データをファイル化せずにエクセルに画像を貼り付ける方法です。

オシロから受信したバイナリデータを File.WriteAllBytes すると、
正しく PNG 画像ファイルとして保存されるのですよね?

もし、オシロの受信データに画像ファイルのヘッダー部が含まれていないような場合、
自分でそれを補う必要がありますが、ファイルデータそのものが得られるのであれば、
受信した byte[] データを new System.IO.BinaryStream( バイナリ ) し、
それを Image.FromStream メソッドに渡せば Image オブジェクトに変換できます。


Byte[] block = 受信データ;
Image img = Image.FromStream(new BinaryStream(block));

[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93312 ] / ▼[ 93314 ]
■93313 / 9階層)  Re[9]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (38回)-(2019/12/04(Wed) 15:41:50)
No93312 (魔界の仮面弁士 さん) に返信
> もし、オシロの受信データに画像ファイルのヘッダー部が含まれていないような場合、
> 自分でそれを補う必要がありますが、ファイルデータそのものが得られるのであれば、
> 受信した byte[] データを new System.IO.BinaryStream( バイナリ ) し、
> それを Image.FromStream メソッドに渡せば Image オブジェクトに変換できます。
>
>
> Byte[] block = 受信データ;
> Image img = Image.FromStream(new BinaryStream(block));

BinaryStreamクラスが見つからなかったので代わりにMemoryStreamクラスをつかってみたところ
pictureboxでの表示までは出来ました。
MemoryStreamクラスよりBinaryStreamクラスを使用した方がいいのでしょうか?
その場合、BinaryStreamが見つからないのですがどうすればいいでしょうか?
よろしくお願いします。
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93313 ] / ▼[ 93315 ]
■93314 / 10階層)  Re[10]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ 魔界の仮面弁士 (2507回)-(2019/12/04(Wed) 16:13:03)
No93313 (じょこびっち さん) に返信
> BinaryStreamクラスが見つからなかったので代わりにMemoryStreamクラスをつかってみたところ

Oops!
ごめんなさい。MemoryStream の書き間違いです…。
[ 親 93294 / □ Tree ] 返信 編集キー/

▲[ 93314 ] / 返信無し
■93315 / 11階層)  Re[11]: ハードコピーした画像ファイルをエクセルに貼り付けたい
□投稿者/ じょこびっち (39回)-(2019/12/04(Wed) 16:40:06)
2019/12/05(Thu) 08:44:53 編集(投稿者)

No93314 (魔界の仮面弁士 さん) に返信
> ■No93313 (じょこびっち さん) に返信
>>BinaryStreamクラスが見つからなかったので代わりにMemoryStreamクラスをつかってみたところ
>
> Oops!
> ごめんなさい。MemoryStream の書き間違いです…。

教えて頂いたPasteSpecialでエクセルにはあっさり貼り付けられました。

いつもお世話になっている弁さんでも間違える事があるんですね。なんだかホッとしましたw
毎回助けて頂き本当に感謝しています。

解決済み
[ 親 93294 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -