C#でExcelを操作する際に便利なライブラリ「ClosedXML」の使い方をまとめます。
ClosedXMLを使うことで、Excelをインストールしていなくても.xlsxファイルを作成することが可能です。また、直感的に使用できるのでコーディングが簡単です。
【検証環境】.NET Framework 4.7.2 / ClosedXML ver 0.95.4.0
利用準備
パッケージのインストール
nugetパッケージマネージャからClosedXMLをインストール
PM> Install-Package ClosedXML
クラスの定義
まず最低限の操作を記述したExcel.csを作成
class Excel
{
public XLWorkbook Workbook { get; private set; }
public IXLWorksheet Worksheet { get; private set; }
public Excel(string openExcelFileName, string openSheetName)
{
string appPath = System.AppDomain.CurrentDomain.BaseDirectory;
string excelPath = $@"{appPath}Excel{openExcelFileName}";
//Excelファイルの存在確認
if (File.Exists(excelPath) == false)
throw new FileNotFoundException();
Workbook = new XLWorkbook(excelPath);
if (Workbook.TryGetWorksheet(openSheetName, out IXLWorksheet openSheet))
{
Worksheet = openSheet;
}
else
{
throw new Exception("指定したシート名は存在しません");
}
}
public Excel()
{
Workbook = new XLWorkbook();
Worksheet = Workbook.Worksheets.Add("Sample Sheet");
}
public void ExcelSheetOpen(string openSheetName)
{
try
{
if (Workbook.TryGetWorksheet(openSheetName, out IXLWorksheet openSheet))
{
Worksheet = openSheet;
}
else
{
throw new Exception("指定したExcelのSheetが存在しません");
}
}
catch
{
throw;
}
}
public void CellWrite(int row, int column, object value, bool border = false)
{
//セルの取得
var cell = Worksheet.Cell(row, column);
//値の書き込み
cell.Value = value;
//罫線を引く
if (border)
{
cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
}
}
public void ExcelSaveAs(Stream stream)
{
Workbook.SaveAs(stream);
}
public void ExcelSaveAs(string saveFilePath)
{
Workbook.SaveAs(saveFilePath);
}
public void Dispose()
{
Workbook.Dispose();
}
}
ひな形ファイルの作成
1.アプリケーションと同じディレクトリに「Excel」フォルダを作成
2.その中にひな形ファイル(org.xlsx)を保存(とりあえず空白の状態で)
3.プロパティから【ビルドアクション】を「コンテンツ」、【出力ディレクトリにコピー】を「新しい場合はコピーする」に変更する
サンプルコード
Excelクラスの使用後はDisposeを忘れずに行うこと!
ひな形ファイルをコピーして出力
(例)C3セルに文字列”hoge“を書き込んで、D:直下にファイル名”hogefile.xlsx“で保存する場合
class Program
{
static void Main(string[] args)
{
var excel = new Excel("org.xlsx", "Sheet1");
excel.CellWrite(3, 3, "hoge");
excel.ExcelSaveAs(@"D:hogefile.xlsx");
excel.Dispose();
}
}
ひな形ファイルを使用しないで出力
(例)D5セルに文字列”hoge2“を罫線付きで書き込んで、D:直下にファイル名”hoge2file.xlsx“で保存する場合
class Program
{
static void Main(string[] args)
{
var excel = new Excel();
excel.CellWrite(5, 4, "hoge2", true);
excel.ExcelSaveAs(@"D:hoge2file.xlsx");
excel.Dispose();
}
}
ASP.NET MVCの場合
ASP.NET MVCの場合は、File()で返却すればブラウザでダウンロードする形で出力可能
[HttpPost]
public FileResult DownloadExcel()
{
using (var stream = new System.IO.MemoryStream())
{
var excel = new Excel();
//
// Excel編集処理を記述
//
excel.ExcelSaveAs(stream);
excel.Dispose();
return File(stream.ToArray(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
"fileName.xlsx");
}
}
Excel操作のチートシート
セルの指定
//A1セルの指定
var cell_A1 = Worksheet.Cell(1, 1); //indexは0からではなく1から
//B2セルの指定
var cell_B2 = Worksheet.Cell("B2"); //文字列でも指定可
//A1からC3までの範囲指定
var cellRange_int = excel.Worksheet.Range(1, 1, 3, 3);
var cellRange_str = excel.Worksheet.Range("A1", "C3");
//セルを1つ上に移動
cell_A1 = cell_A1.CellAbove();
//セルを1つ下に移動
cell_A1 = cell_A1.CellBelow();
//セルを1つ左に移動
cell_A1 = cell_A1.CellLeft();
//セルを1つ右に移動
cell_A1 = cell_A1.CellRight();
セルのスタイル設定
var cell = excel.Worksheet.Cell("A1");
//水平方向のレイアウト
cell.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center); //中央寄せ
cell.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Left); //左寄せ
cell.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Right); //右寄せ
//垂直方向のレイアウト
cell.Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center); //中央寄せ
cell.Style.Alignment.SetVertical(XLAlignmentVerticalValues.Top); //上寄せ
cell.Style.Alignment.SetVertical(XLAlignmentVerticalValues.Bottom); //下寄せ
//折り返して全体を表示する
cell.Style.Alignment.SetWrapText(true);
//罫線
cell.Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin); //細線
cell.Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick); //太線
cell.Style.Border.SetOutsideBorder(XLBorderStyleValues.Dotted); //点線
//部分罫線
cell.Style.Border.SetTopBorder(XLBorderStyleValues.Thin); //上だけ
cell.Style.Border.SetBottomBorder(XLBorderStyleValues.Thin); //下だけ
cell.Style.Border.SetLeftBorder(XLBorderStyleValues.Thin); //左だけ
cell.Style.Border.SetRightBorder(XLBorderStyleValues.Thin); //右だけ
//表示形式
cell.Style.NumberFormat.SetFormat("@"); //文字列
cell.Style.NumberFormat.SetFormat("#,##0"); //桁区切り
cell.Style.NumberFormat.SetFormat("yyyy/mm/dd"); //年月日
cell.Style.NumberFormat.SetFormat("HH:mm:ss"); //時刻
//塗りつぶし
cell.Style.Fill.SetBackgroundColor(XLColor.Red);
//フォント
cell.Style.Font.SetBold(true); //太字
cell.Style.Font.SetFontColor(XLColor.Red); //文字色
cell.Style.Font.SetFontName("メイリオ"); //フォント名
cell.Style.Font.SetFontSize(20); //フォントサイズ
cell.Style.Font.SetUnderline(); //下線
セルの結合
//セルの結合 ※同じ範囲に2回Merge()を行うと結合が解除される
var cellRange_B1D1 = excel.Worksheet.Range("B1", "D1").Merge();
//セルの結合解除
cellRange_B1D1 = excel.Worksheet.Range("B1", "D1").Unmerge();
セル幅・高さ設定
//全列選択して、幅を自動調整
excel.Worksheet.Columns().AdjustToContents();
//1~3列目までを選択して、幅を自動調整
excel.Worksheet.Columns(1, 3).AdjustToContents();
//全行選択して、高さを自動調整
excel.Worksheet.Rows().AdjustToContents();
//1~3行目までを選択して、高さを自動調整
excel.Worksheet.Rows(1, 3).AdjustToContents();
関数の設定
var cell = excel.Worksheet.Cell("A1");
//関数設定
cell.SetFormulaA1("SUM(B1:D1)"); //範囲埋め込み
var cellRange_B2D2 = excel.Worksheet.Range("B2", "D2");
cell.SetFormulaA1($"SUM({cellRange_B2D2})"); //範囲は変数でも可
セルのコピー
//コピー元範囲
var copyRange = excel.Worksheet.Range("A1:A10");
//コピー先基準セル
var cellTarget = excel.Worksheet.Cell("B1");
//コピー
copyRange.CopyTo(cellTarget);
シート操作
//シート追加
excel.Workbook.AddWorksheet("Sample Sheet 2");
//追加したシートに切り替える
excel.ExcelSheetOpen("Sample Sheet 2");
//シート削除
var wkSheet = excel.Workbook.Worksheet("Sample Sheet"); //シート名指定
wkSheet.Delete();
その他
//メソッドチェーンでセル操作を連結可
excel.Worksheet.Range("B3","D4").Merge().Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin)
.Font.SetFontColor(XLColor.Red)
.NumberFormat.SetFormat("@");
//valueにコレクションで渡すと、自動的にセルを改行して書き込んでくれる
var cell = excel.Worksheet.Cell("A1");
var array = Enumerable.Range(1, 10).ToArray();
cell.Value = array;