場合誰かがここでは、同様の問題に遭遇し、私は私の特定の問題を修正するために何をすべきかです。
Excelは、ノーマルビューと比較して、ページビューでイメージを伸ばしています。通常のビューではイメージの比率は気にしないので、イメージのサイズを調整できます。私は私の場合の伸びを分析し、96 DPI調整画像幅(私の場合は高さが変更されていない)の次の範囲を見つけました。異なるDPI用の画像サイズ変換
0px - 54px: 0px to much width
55px - 109px: 4px to much width
110px - 165px: 8px to much width
166px - 317px: 12px to much width
318px - 442px: 23px to much width
443px - ???: 32px to much width // I didn't bother to investigate larger values
では、これは最も幅が挙げオフセットを減算することによって調整することができることを意味します。異なるオフセット間の境界の場合、小さな誤差が残る。バージョンがSetSize(widthPx, heightPx)
関数を使用することによって回避された間EPPlus SetSize(percentage)
の異なる挙動 - 以下の幅の変換関数(AdjustExcelPageViewImageWidth
)について説明エラー
/// <summary>
/// Excel is changing the image size in page view, this is an attempt to correct the change for a range of widths.
/// Input width is required as pixel equivalent of the desired width for 96 DPI.
/// </summary>
int AdjustExcelPageViewImageWidth(int desiredWidth96DPI)
{
return
LimitedRangeTransform(desiredWidth96DPI, 0, 54, 0, 4) ??
LimitedRangeTransform(desiredWidth96DPI, 55, 109, 4, 8) ??
LimitedRangeTransform(desiredWidth96DPI, 110, 165, 8, 12) ??
LimitedRangeTransform(desiredWidth96DPI, 166, 317, 12, 23) ??
LimitedRangeTransform(desiredWidth96DPI, 318, 442, 23, 32) ??
// no data gathered for larger images
desiredWidth96DPI - 32;
}
/// <summary>
/// Interpolation function between ranges with different limit and offset. Returns the transformed width or null.
/// </summary>
/// <param name="width">the desired width</param>
/// <param name="lower">the lower bound of the range, where the offset applies</param>
/// <param name="upper">the upper bound of the range, where the offset applies</param>
/// <param name="offset">the offset value will be subtracted for width within the range</param>
/// <param name="nextOffset">the offset value for the next range following the upper bound</param>
/// <returns></returns>
int? LimitedRangeTransform(int width, int lower, int upper, int offset, int nextOffset)
{
// not handling those cases
if (upper < lower || width < lower + offset)
{
return null;
}
if (width <= upper + offset)
{
return width - offset;
}
if (width <= upper + offset + (nextOffset - offset)/2)
{
// border cases, can't be accurate
return upper;
}
if (width <= upper + nextOffset)
{
// border cases, can't be accurate
return upper + 1;
}
return null;
}
他の問題の補正を実現します。
だから、私の最終的な実装は次のようになる:
- そしてExcelのページビューの幅を調整
- 画像解像度(300 DPI)から画面の解像度(96 DPI)に幅と高さを調整します
。 EPPlusは整数としてサイズがかかりますが、画像の比率が目に見えてもう歪めていないので
static void Main(string[] args)
{
using (var package = new OfficeOpenXml.ExcelPackage(new FileInfo(@"C:\UserTemp\Test\TestFormat.xlsx")))
{
OfficeOpenXml.ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
var img = worksheet.Drawings.AddPicture("Test", new FileInfo(@"C:\UserTemp\Test\Testfile.jpg"));
img.SetPosition(4, 0, 5, 0);
var width = (int)Math.Round(img.Image.Width * 96.0/img.Image.HorizontalResolution);
var height = (int)Math.Round(img.Image.Height * 96.0/img.Image.VerticalResolution);
var adjustedWidth = AdjustExcelPageViewImageWidth(width);
img.SetSize(adjustedWidth, height);
package.SaveAs(new FileInfo(@"C:\UserTemp\Test\TestFormat2.xlsx"));
}
}
結果は当然、いくつかのマイナーな丸め誤差を持っています。
実際にはもっと進んでいます... Excel **通常ビュー** - > **ページビュー**は幅を広げ、高さは変わりません。 **印刷プレビュー**または実際の印刷では幅が拡大され、高さが縮小されます。注:印刷幅は、**ページビュー**に対しても拡大されています。そのため、マイクロソフトのトローリングは最高です。 – grek40