2016-10-05 187 views
0

更新:問題の一部は、エクセルの欠陥です。異なるビュー設定(通常のレイアウトとページレイアウト)の間でイメージサイズを変更します。私は私が(後でExcelで開き、100%のスケーリングが設定されている任意のサイズ変更せずにEPPlusを経由してExcelシートに画像を追加することができますどのように...残りの違いも問題かどうか、再評価するEPPlus AddPicture 100%size


を有することができますイメージプロパティで)?

私のテストケースの画像(Testfile.jpg)は、幅508px、高さ177px、解像度300 DPIのjpgです。

私のテストコード:EPPlus 4.0.5用

​​

たXLSXファイル内の画像サイズを見たとき、私は次のような結果を得る:

  • フォーマットされていない空の入力XLSXでファイルの場合は、画像幅が4.30cmではなく、4.31cmになります。
  • より複雑な書式設定(異なる行サイズ、異なる列サイズ、接続されたセル)を持つ異なる入力xlsxファイルは、4.30cmイメージ幅の代わりに4.47cmという結果をさらに悪化させます。 EPPlus 4.1.0用

、私は完全に異なる結果を取得:未フォーマットの空の入力のxlsxファイルで

  • を、私の代わりに4.30cm画像幅の13,44cmを取得します。
  • 事前フォーマットされたxlsxファイルでは、画像幅が4.30cmではなく、13,81cmになります。

heigthプロパティは同じように動作しますが、残念ながらwidth:heightの比率は一貫していません。

私は既にimg.SetSize(widthPx, heigthPx)のようないくつかのものを試していますが、成功していない画像フォーマットもあります。

だから、今のところ、私は別のエクセル入力ファイル間EPPlusバージョン

  • 間で一貫性のない結果

    で失われていると私は、少なくとも保証の幅が必要です。高さの比率を、最高のだろうイメージサイズが保証されています。

    注:ここでは96 DPIでイメージを作成して使用することはできません。その結果、ピクセル化された印刷が行われるためです。

    編集:

    以下の画像は、私がちょうどショーケースとして作成されたビットの不規則なレイアウトを持つファイルの結果を示しています。緑色のボックスは挿入された画像であり、ダイアログウィンドウ内に表示されている割合が強調表示されています(ドイツ語ですが、関連するものは数字です)。

    Image for another formatted testfile

  • 答えて

    0

    場合誰かがここでは、同様の問題に遭遇し、私は私の特定の問題を修正するために何をすべきかです。

    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")); 
        } 
    } 
    

    結果は当然、いくつかのマイナーな丸め誤差を持っています。

    +0

    実際にはもっと進んでいます... Excel **通常ビュー** - > **ページビュー**は幅を広げ、高さは変わりません。 **印刷プレビュー**または実際の印刷では幅が拡大され、高さが縮小されます。注:印刷幅は、**ページビュー**に対しても拡大されています。そのため、マイクロソフトのトローリングは最高です。 – grek40