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

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

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

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

Q&A

解決済

2回答

4273閲覧

C#のExcel操作(EPPlus)で、画像の縦横が100%で表示されない

tsutsumin

総合スコア7

C#

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

0グッド

0クリップ

投稿2019/07/30 05:32

編集2019/07/30 11:44

前提・実現したいこと

C#のExcel操作をEPPlusを使っています。
エクセルファイルを読み込んだ場合の、画像の追加を正常に行いたいです。

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

テンプレートを読み込み、AddPictureで画像を追加すると、 画像の表示はされるのですが、縦横が100%で表示されません。 エクセルの図の書式設定を見ると、基本的に高さが小さく、幅が大きくなっています。 「縦横比を固定する」、「元のサイズを基準にする」のチェックボックスはONになっています。

該当のソースコード

C#

1var excel = new ExcelPackage(new FileInfo("テンプレートのファイルパス")); 2 3var ws = excel.Workbook.Worksheets[1]; 4 5var picture = ws.Drawings.AddPicture("pic", Image.FromFile("画像ファイルパス")); 6 7excel.SaveAs(new FileInfo("保存ファイル名"));

試したこと

「EPPlus 画像」で検索し、エクセルを読み込み画像を張り付け、エクセルの出力はできております。

画像をよく見ると縦と横の比率が元の画像と違っていたので、いろいろ試しています。
縦横ともセルのサイズより大きい画像を出力しており、縦が114%前後、幅が88%前後で画像が表示されています。
SetPositionで移動すると、また倍率がずれます。
試しにA1セルのサイズを画像サイズより大きくして出力すると縦横100%で表示されますが、画像以外も表示したいので、この幅は使えません。
A1を大きくし、出力した後にセルサイズを変更しても変更したサイズで画像の縦横が変わってしまいます。
取り急ぎの対応策として、縦と横をそれぞれ適当な値を乗算し、100%に近い状態で出力しています。

「epplus 画像 縦横比」で検索し、以下3つのURLの方法を試したのですが、どれもうまく動きませんでした。
https://ja.stackoverflow.com/questions/38046/c-epplus%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%AB%E6%8C%BF%E5%85%A5%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%AF%94%E7%8E%87%E3%81%8C%E5%B4%A9%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7-%E7%9B%B4%E3%81%97%E3%81%9F%E3%81%84
http://moc67.blog.fc2.com/blog-entry-12.html
https://stackoverrun.com/ja/q/10983603

GitHudからEPPlus自体をダウンロードし、
https://github.com/JanKallman/EPPlus/releases
EPPlus Sample Projects for version 4.5.3
EPPlus.sample.projects.for.NET.zip
のSampleApp.CoreのSample6が画像の出力をしており、出力されたエクセルを確認すると、縦横100%で出力されていました。
SanpleではEPPlusでブックを作成し画像を張り付けています。

試しにテンプレートを読み込まず、EPPlusでブックを作成し、そこに画像を追加した場合は、縦横比が正しく表示されました。

デフォルトの幅がテンプレート(エクセルで作成も同じ)は8.38(72ピクセル)、EPPlusのエクセルは8.43(64ピクセル)
と違っていたので、一旦EPPlusで空のブックを作成し、それをテンプレート2として読み込み、最初のテンプレートにシートをコピーしようとしたのですが、以下のエクセプションが発生してしまいました。
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

C#

1var excel = new ExcelPackage(new FileInfo("テンプレート1のファイルパス")); 2 3var excel2 = new ExcelPackage(new FileInfo("テンプレート2のファイルパス")); 4 5var ws = excel2.Workbook.Worksheets[1]; 6var picture = ws.Drawings.AddPicture("pic", Image.FromFile("画像ファイルパス"));// この行をコメントアウトするとエラーは起きません 7 8excel.Workbook.Worksheets.Add("コピー先", ws);// ここでエラー 9 10excel.SaveAs(new FileInfo("出力ファイル名"));

画像があるブック(自分自身)にコピーや、画像がない場合の別のブックにコピーでは問題なく動きました。

対応していただきたい内容

※前提条件
プログラムでは画像の出力だけをしたいのではないので、エクセルで作ったものを読み込んでの画像貼り付け。
画像の拡縮率は100%で変更しないが、画像のサイズは固定ではありません。

  1. エクセルで作成したファイルに画像を読み込み、縦横が100%で表示できる方法

 
2. 1.が無理な場合の対応内容
別のブックへの画像があるシートのコピー
その他の方法
別のライブラリを使用

以上、宜しくお願い致します。

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

EPPlus 4.5.3.1
.Net Framework 4
WindowsFormアプリケーションで作成しています

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

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

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

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

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

imihito

2019/07/30 10:41

参考情報です。 Excelのシートにセルより大きな画像を挿入した場合、表示倍率を変更するだけで画像の縦横比が変化します。 そのため、Excelそのものの仕様として「特定の表示倍率のときに縦横が100%」しか実現できないと思われます。
tsutsumin

2019/07/30 11:08

該当のソースコードに記載していますが、SetSizeやSetScaleを使用しておらず、そのままのサイズの画像を張り付けているのですが、画像の高さと幅が変わっている状態です。 テンプレートとしてエクセルファイルを読み込んでいるので、セルの高さや幅はバラバラです。 デフォルトはA1ファイルに画像が表示されますが、別のセルに移動すると、セルの高さと幅が変わるためか、画像の高さと幅の比率がまた変わります。
guest

回答2

0

解決方法ではなく情報提供です。
(経験上どうしようもなかったので…)

使用されているExcelのバージョンは2013以降でしょうか?
たぶんですが、excel2010で開くとつぶれてない可能性があります。

Excel2010以下のバージョンと2013以降のバージョンでxlsx形式の内部構造が変更になっているようで、本家Microsoft Excelでも貼り付けた画像の縦横比がおかしくなります。

Excel2016で新規作成したxlsxにExcel2010で画像を貼り付け保存。これをExcel2016で開くと縦がつぶれた表示になったりします。
Shapeオブジェクトの位置などもおかしくなるので注意が必要です。(まぁ、注意したところでどうしようもないのですが…)

NPOIやEEPlusは2010までの形式でxlsxが作成されているのではないかと思います。

投稿2019/08/02 09:21

Y.H.

総合スコア7914

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

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

0

ベストアンサー

とりあえず、下記を参照してみればどうでしょうか?

EPPlusで画像を置いてみる

投稿2019/07/30 08:32

PineMatsu

総合スコア3579

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

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

tsutsumin

2019/07/30 08:44 編集

上記URLのHPはそのページ以外の記事にも目を通していました。 そのサイトはブックの作成をEPPlusで行っているので、縦横が100%で表示されているのではないでしょうか? エクセルで作成したブックを読み込んで、縦横がおかしくならない方法がないか探しています。
tsutsumin

2019/07/30 08:51

見ました。 セル内に納まる画像であれば縦横100%で表示されますが、 (テストでA1セルを広くして確認しました) 画像以外の場所でいろんな項目を表示しているので、 高さはともかく、幅を広くすることができないのでいろいろ試しているところです。
tsutsumin

2019/07/30 09:03

>ShapesのAddPictureについて 内容がCOM参照のようなのであまり使いたくないですが、時間あるときに確認してみます。
PineMatsu

2019/07/30 09:15 編集

どうも下記のURLにはEPPlusにバグが有るようなことが書かれていますね。(Stackoverflowからの転用なので本当かどうかわかりません。英語なのとこの方はAsp.NET でC#のコードを使っているみたいなのでよくわからない) 他の英語サイトまたはその翻訳を探してみましたが、EPPlusのコードをいじって解決しているようです。(C#だったら拡張メソッドを使えばいいのにともうが・・・) https://stackoverflow.com/questions/15634709/epplus-setposition-picture-issue
PineMatsu

2019/07/30 09:34

NPOI(Apach POI)でも調べてみましたが、Excelシートへの画像挿入は基本的にセル範囲への挿入になるため、セルへフィットするような置かれ方をするのでアスペクト比を完全に再現するのは難しいようです。細かい指定による調整は無理っぽいですね。まあ、普通にExcelで画像挿入してもセルの幅や高さを変えたら画像のサイズも変わりますからね。 セルのサイズを画像に合わせるように調整した上で挿入してやればいいのかもしれませんが、セルのサイズをいじったら変わっちゃいますからね。 https://vintage.ne.jp/blog/2014/04/284
tsutsumin

2019/07/30 11:09

EPPlusというかエクセル出力系の仕様になってしまうのですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問