モルモルしている

最近はテスト業務ばっかりで書くことがない

EPPlusで列幅を自動で設定する

いや、まぁEPPlusのサンプルに書いてあるんですけど備忘録的に書いとく。

端的に言うと
「ExcelWorksheet.Cells.AutoFitColumns」
を使います。

テストコード(ボタンを押すとテストテーブルに入ってるデータをただExcelに出力するサンプル)

private void button1_Click(object sender, EventArgs e)
{
    // 出力ファイルのパス
    string output = @"C:\temp\hoge.xlsx";

    // ファイルの作成
    FileInfo newFile = new FileInfo(output);

    if (newFile.Exists)
    {
        newFile.Delete();
        newFile = new FileInfo(output);
    }

    using (var cn = new SqlConnection())
    {
        cn.ConnectionString = "Server=TestSrv;Database=TestDb;UID=sa;PWD=TestPass;";
        cn.Open();

        using (var package = new ExcelPackage(newFile))
        {
            // Sheetの追加
            ExcelWorksheet ws = package.Workbook.Worksheets.Add("Sheet1");

            // テーブルデータの取得
            var a = cn.ExecuteReader("SELECT * FROM testTable");

            // テーブルデータをセル「A1」から書き出し
            using (ExcelRange row = ws.Cells["A1"])
            {
                var cnt = a.FieldCount;
                var r = row.Start.Row;
                var c = row.Start.Column;

                while (a.Read())
                {
                    for (int i = 0; i < cnt; i++)
                    {
                        ws.Cells[r, c + i].Value = a[i];
                    }
                    r += 1;
                }
            }

            // セル幅を自動調節に設定する
            ws.Cells.AutoFitColumns(8);

             // 作ったデータをバイト配列にセット(日本語があってるか不明)
            Byte[] bin = package.GetAsByteArray();
            // ファイルを出力
            File.WriteAllBytes(output, bin);
    }

    MessageBox.Show("完了しました。");
    }
}

こんな感じ。


EPPlusのSample1だとAutoFitColumnsの引数は0ですが、0にしてるとデータがなかった場合
f:id:MoruMe:20151016222921p:plain

こんな感じにデータがない列がつぶれます。
データ出力しなかったセルは列幅の影響受けてません。

AutoFitColumnsの引数を8にすると
f:id:MoruMe:20151016222950p:plain

こんな感じ。8よりちょっと小さくなりました。
データに合わせて頃合いな数字を調整すればいい感じ。