手軽に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;