質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

6750閲覧

C# ClosedXMLを使用した「画像貼り付けエクセルファイル生成」プログラムで例外発生

Igata

総合スコア9

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/12/20 16:45

前提・実現したいこと

VisualStudio2022(2019)でClosedXMLを使用し「画像を貼り付けたエクセルファイル」を生成する際、例外が発生します。
理由・回避方法についてご存じの方、教えてください。
よろしくお願いします。

発生している問題・エラーメッセージ

生成したビットマップ ( new Bitmap( width, height ) )で生成した画像を AddPicture()に指定すると
System.ArgumentNullException: '値を Null にすることはできません。
パラメーター名:encoder'
が発生します。

該当のソースコード

C#

1/// <summary> 2/// ボタン1をクリックしたときの処理です</summary> 3/// <param name="sender">送信元情報</param> 4/// <param name="e">イベント情報</param> 5private void button1_Click(object sender, EventArgs e) 6{ 7 // 画像ファイルから生成した imgは AddPicureできるが、new Bitmap(幅,高さ)で生成した画像は例外が発生する 8 var imagePath = @"....\メジロ@神出神社 - 20210220B_2138_cr.jpg"; // 実行ファイルの2段上位フォルダ内 9 using (var www = new Bitmap(imagePath) ) 10 using (var img = new Bitmap(www.Width / 5, www.Height / 5, PixelFormat.Format24bppRgb)) 11 using (var gra = Graphics.FromImage(img)) 12 using (XLWorkbook wb = new XLWorkbook()) 13 { 14 // 縮小画像の描画 15 gra.DrawImage(www, 0, 0, img.Width, img.Height); 16 17 //ワークシートの設定 18 var ws = wb.AddWorksheet("Sheet1"); 19 20 // AddPictureメソッドで画像を挿入 【OK 1】 21 //var image = ws.AddPicture(imagePath); 22 23 // AddPictureメソッドで画像を挿入 【OK 2】 24 //var image = ws.AddPicture(www); 25 26 // AddPictureメソッドで画像を挿入 【Error System.ArgumentNullException発生】 27 var image = ws.AddPicture(img); 28 29 30 // (2,2)に移動 31 image.MoveTo(ws.Cell(2, 2)); 32 33 // ワークブックを保存(実行ファイルと同じフォルダ) 34 wb.SaveAs("file.xlsx"); 35 } 36} 37

試したこと

ファイルから生成した場合(上記ソースコメント【OK 1】【OK 2】では、問題ないが(例外発生しない)
new Bitmap( 幅、高さ)の形で生成した画像だと例外が発生する?

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022 (2019でも同様)
.NetFramework 4.8
ClosedXML (nugetで取得) 0.95.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2021/12/20 18:05

using (var gra = Graphics.FromImage(img)) この部分で img を gra が使っているからでは?
Igata

2021/12/21 00:35

KOZ6.0さん、早速の対応ありがとうございます。 ご指摘の箇所(および描画部分)をコメントアウトしても、同様の結果でした。
guest

回答1

0

ベストアンサー

なんだかバグっぽいですね。
MemoryStream に保存すると回避できるようです。

C#

1using ClosedXML.Excel; 2using System.Drawing; 3using System.Drawing.Imaging; 4using System.IO; 5 6class Program 7{ 8 static void Main(string[] args) { 9 using (XLWorkbook wb = new XLWorkbook()) { 10 var ws = wb.AddWorksheet("Sheet1"); 11 using (var img = new Bitmap(10, 10)) { 12 using (var g = Graphics.FromImage(img)) { 13 g.Clear(Color.Red); 14 } 15 using (var stream = new MemoryStream()) { 16 img.Save(stream, ImageFormat.Bmp); 17 stream.Position = 0; 18 var image = ws.AddPicture(stream); 19 image.MoveTo(ws.Cell(2, 2)); 20 } 21 } 22 wb.SaveAs("file.xlsx"); 23 } 24 } 25}

投稿2021/12/21 01:28

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Igata

2021/12/21 02:49

ありがとうございます! MemoryStreamへの変換で回避することができました。 (例外の内容からMemoryStream変換時の ImageFormat.Bmp指定が効いているのでしょうか) 元の発生原因はKOZ6.0さんの仰るとおり「バグ」とみなしこれ以上の追求はしないこととしました。 KOZ6.0さんのおかげであっという間に解決しました。 ベストアンサーとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問