C#

【C#】ClosedXMLでExcelファイルを出力する

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;
エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい