【C# + EPPlus】行の高さを自動調整する方法

手軽にExcelを操作できるEPPlusですが、行の高さを自動調整するメソッドやプロパティはありません。

セルに複数行のテキストを入力した場合や、長文を入力して「折り返して全体を表示する」を選択している場合、行の高さを調整する方法を紹介します。

必要な行の高さを計算する

行の高さを調整したい場合には、セルに入力した文字数とそのフォント、セルの幅から必要なセルの高さを計算する必要があります。

海外サイトでこの処理をメソッド化したコードを発見しました。

        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*1.2, 409);
}

出典:https://stackoverflow.com/questions/41639278/autofit-row-height-of-merged-cell-in-epplus?rq=1

引数はそれぞれ以下の通りです。

第一引数:セルに入力する文字列

第二引数:セルに設定されたフォント

第三引数:セルの横幅

使い方

使い方はシンプルです。

例えばAAA.xlsxファイルを開いて、Sheet1シートのA1セルにAを100文字入力するとします。

    using(var xls = new ExcelPackage(new FileInfo("AAA.xlsx")))
{
var sheet = xls.Workbook.Worksheets["Sheet1"];
var text = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
var height = MeasureTextHeight(text, sheet.Cells[1, 1].Style.Font, (int)sheet.Column(1).Width);
sheet.Row(1).Height = height;
}

先ほど紹介したMeasureTextHeightを使用して、以下のようにちょうどすべての文字が収まる高さを取得します。

MeasureTextHeight(text, sheet.Cells[1, 1].Style.Font, (int)sheet.Column(1).Width);

もし対象のセルが複数セルを結合したものだった場合、第三引数は結合したセルの幅の合計を渡す必要があります。

A1セルとB1セルが結合されていた場合には、第三引数は以下のようになります。

(int)sheet.Column(1).Width + (int)sheet.Column(2).Width

最後に該当行の高さを設定すれば完了です。

sheet.Row(1).Height = height;

タイトルとURLをコピーしました