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にしてるとデータがなかった場合
こんな感じにデータがない列がつぶれます。
データ出力しなかったセルは列幅の影響受けてません。
AutoFitColumnsの引数を8にすると
こんな感じ。8よりちょっと小さくなりました。
データに合わせて頃合いな数字を調整すればいい感じ。