ドリリウム

趣味をとことん突き詰めるブログ。高知 / 釣り / DIY / バイク / 車 / 家具制作 / アクアリウム / BMW / 地方移住 / ルノー・ルーテシア

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

ドリリウムは移転しました。

約5秒後に自動的にリダイレクトします。

f:id:katamichinijikan:20190414152645p:plain

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

ブログを書いている人

カタミチ

ご意見・お問い合わせ等:syufukc@gmail.com

プライバシーポリシーおよび広告掲載等に関する表示事項