web-dev-qa-db-ja.com

EPPlusでマージされたセルの行の高さを自動調整

私はEPPlusとC#を使用しており、行の高さを自動サイズ調整/自動調整して、テキストの折り返しで結合されたセルのすべてのコンテンツを表示するために必要な高さに対応しようとしています。ただし、何を試してもテキストは常に切り捨てられます。さまざまなワークシートでさまざまなテキストサイズを使用してこのプロセスを繰り返しているため、行の高さをハードコーディングしたくありません(行の最小の高さを強制する場合を除く)。可能であれば、EPPlus/C#内でこれを実行します。

セルA2:E2がマージされ、WrapText = trueの場合:

テキストが切り捨てられたセル

enter image description here

これは、希望のセルの高さでどのように見えるかです

enter image description here

これが私の関連する短いC#コードです

Int32 intToCol;
intToCol = 5;
eppWorksheet.Cells[2, 1, 2, intToCol].Merge = true;
eppWorksheet.Cells[2, 1].Style.WrapText = true; 
//Check if at the minimum height. If not, resize the row
if (eppWorksheet.Row(2).Height < 35.25)
{
    eppWorksheet.Row(2).Height = 35.25;
}

私は EPPlusの行の自動調整 を確認しましたが、間違って読んでいない限り、質問に直接答えることはできませんでした。

10
cmbarnett87

これは、再利用可能なメソッドでの解決策です。テキスト値、セルに使用されるフォント、結合された列の合計幅を渡し、行の高さを受け取ります。結果で行の高さを設定します。

メソッドの使用

eppWorksheet.Row(2).Height = MeasureTextHeight(cell.Value, cell.Style.Font, [enter the SUM of column widths A-E]);

再利用可能な方法

    public double MeasureTextHeight(string text, ExcelFont font, int width)
    {
        if (string.IsNullOrEmpty(text)) return 0.0;
        var bitmap = new Bitmap(1, 1);
        var graphics = Graphics.FromImage(bitmap);

        var pixelWidth = Convert.ToInt32(width * 7.5);  //7.5 pixels per Excel column width
        var drawingFont = new Font(font.Name, font.Size);
        var size = graphics.MeasureString(text, drawingFont, pixelWidth);

        //72 DPI and 96 points per inch.  Excel height in points with max of 409 per Excel requirements.
        return Math.Min(Convert.ToDouble(size.Height) * 72 / 96, 409);
    }
24
Ben Gripka

私はこれに回避策を使用し、印刷領域A:Qを使用しました。

  1. 結合したセルの値を列zにコピーしました。
  2. 列zの幅を設定してセルの幅をマージします。
  3. 次に、フォーマットで自動行の高さをtrueに設定します。
  4. Z列を非表示にします。
  5. 印刷領域A:Qを設定する

短所:データが重複しています。しかし、レポートは印刷されており、Zカラムは印刷されていないため、問題ありません。

長所:行の高さは計算方法とは異なり正しく機能します。

0
cdev

戻り行で乗算係数を削除して、コードを少し調整する必要がありました。列の幅を取得するためにこのコードを使用しているためと考えられます。

ws1.Column(colIndx).Width * 7

乗算係数は、マージされる列の数です。

0
Arunvishy