C#でサーバ側でテンプレート（.xlsx）を用意して、クライアント(html)から  
postでリクエストされた値を入れ、ダウンロードダイアログを表示させるプログラムを作成しています。

ライブラリに「epplus 4.1.0」を使用しているのですが、  
以下のコードのように実装すると、エクセルに挿入したpng画像の縦横の表示サイズと比率が崩れてしまいます。挿入する画像は縦横100pxです。  
[コード]

```

     byte[] source;
     MemoryStream　stream = new MemoryStream();
     using(var template = System.IO.File.OpenRead(@/template.xlsx))
     using(var excel = new ExcelPakage(stream, template))
     {
     ExcelWorkSheet workSheet = excel.Workbook.Worksheets.Where(s => s.Name 
     =="Sheet1").FirstOrDefault(); 
     System.Drawing.Image img = System.Drawing.Image.FromFile(@/logo.png);
    
     using(var picture = worksheet.Drawings.AddPicture("画像",img)){
     int imageHeight = picture.Image.Height; //ここは100が取得されていることを確認
     int imageWidth　= picture.Image.Width; //ここは100が取得されていることを確認
     picture.setSize(100)
     }
    
     package.Save();
     }    
     source = stream.ToArray();
     return source;
    
```

[実行結果]  
ダウンロードしたExcelファイルの画像をExcel2016＞図形の書式設定＞サイズで確認すると、  
高さ：3.18cm  
幅：2.82cm  
高さの倍率：150%  
横の倍率:133%  
縦横比を固定する：チェックあり  
元のサイズを基準にする：チェックあり となります。  
関係あるのかわかりませんが画面解像度は120DPIでした。  
リセットボタンを押すと、もともとの正しい画像サイズに戻ります。

[質問内容]  
①上記について何か原因、解決方法をご存知の方がいらっしゃいましたら教えていただけないでしょうか。

②epplusにこだわっているわけではないので、他の方法で  
サーバ上でエクセルを編集後（上記の問題を回避）、ダウンロードダイアログをクライアントに表示させる機能を実現する方法はありますでしょうか？epplus
はbyte[]が作成できるため使用しています。（COMを使用してみましたが、エクセルのオブジェクトをダウンロードさせるためにレスポンスで返す方法がわかりませんでした。）

(20170920追記)  
pgrhoさん

１．DPI設定については記載頂いた通りの方法で96dpiに設定することが出来ました。  
画像比率は崩れたままでした。

２．アドバイス頂いたとおり画像を挿入するセルに対して  
事前に画像が収まるように縦横を設定したところ、  
表示比率が原寸大で表示させることができました。

[コード例]  
sheet.Column(1).Width = 100  
sheet.Row(1).Height = 100

COMはサーバでの使用は認められてないのですね・・・勉強不足でした。  
eoplusを使用してテンプレートのセルサイズを調整する方法で協議したいと思います。  
ご回答ありがとうございました。
CC BY-SA 3.0
2017-09-19T15:36:31.403
38046
2017-09-20T14:52:24.470
2017-09-20T14:52:24.470
25477
25477
question
c# excel
C# epplusライブラリでエクセルに挿入した画像の表示比率が崩れるので、直したい
## 1\. DPIが変わる理由

Windowsの標準DPIは96ですので、実行環境のディスプレイに125%の拡大が設定されている場合は120dpiとなります。おそらく`img.VerticalResolution`や`HorizontalResolution`の時点で想定の値と異なっているので、これを`Bitmap.SetResolution`メソッドで変更すればよいです。

```

    var img = (Bitmap)Image.FromFile(@"logo.png");
    img.SetResolution(96, 96);
    
```

ただし上記は元画像のDPIが高い(サイズが小さい)分だけ拡大率を設定していたのを96dpi・100%に変更するだけですので、表示は変化しないと思います。

## 2\. 縦横比が正しくない理由

ExcelのY座標系は特殊で、絶対座標ではなく「行」と「行内の位置」の組み合わせで表されています。この変換時に誤差や計算ミスが発生しているのでしょう。貼り付け先の行のサイズを変えると改善する場合があります。

* * *

なおASP.NETなどのWebアプリケーションでExcelのCOMオブジェクトを使用するのはライセンス違反とされているので避けるべきでしょう。またSystem.Drawing.dllもサポート対象外になることに留意してください。
CC BY-SA 3.0
2017-09-20T00:58:12.850
38047
2017-09-20T01:05:01.177
2017-09-20T01:05:01.177
5750
5750
38046
answer