ドリリウム

趣味をとことん突き詰めるブログ。ペット / フィンチ / 鳥 / 文鳥 / ジュウシマツ / 写真 / カメラ / 高知 / 釣り / DIY / バイク / 車 / 家具制作 / アクアリウム / コーヒー / 地方移住 / ルノー・ルーテシア / SUZUKI ST250 E type / EOS Kiss M

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

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;

当サイトは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。