ClosedXML

.NET上からExcelファイルを操作するのに、私は今まで、epplusを使用してきたが、ご存じの通り、epplus(5.x以降)が有償化されてしまってからかなり時間が経つ。

仕方なくepplusの古いバージョン(4.x)を使っていたけれど、何か他に代わりになる物がないのか探してみた。

poiの.NETポーティングである、npoiが有ることも知っていたが、こちらは少々使い勝手が悪いので不採用。

epplusのような使い勝手のものを探していたら、ClosedXMLというオープンソースのライブラリパッケージを見つけた。(私が知らないだけで、結構有名らしい。)

ClosedXMLはnugetからパッケージ取得が可能。

こちらのライブラリは、npoiよりもepplus寄りの使い勝手で、中々良さそうだ。ただ、バージョンが、最新でも、0.96.0で、1.0以下なので、その辺はどうなのだろうか・・・

チョット使ってみた感じでは特に動作に問題は無さそうだ。ただ、きちんと測っていないが、パフォーマンスがepplusより悪い感じがする。

まぁ、簡単なExcelファイルを作るくらいなら問題は無さそうだが・・・

下記が、簡単なサンプル。npoiより使い勝手いいでしょ?

using(var wb = new XLWorkbook()) {
    var ws = wb.Worksheets.Add("MySheet");
    // セル結合
    ws.Range(1,1,1,10).Merge();
    ws.Cell(1,1).Value = "ClosedXML Test";
    // 文字配置
    ws.Cell(1,1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);

    for(int i=1; i <= 10; i++) {
        for(int j=1; j <= 10; j++) {
            ws.Cell(i+2,j).Value = i*j;
        }
        var xrng = ws.Range(i+2,1,i+2,10);
        if ((i%2) == 0) {
            // セル背景色
            xrng.Style.Fill.SetPatternType(XLFillPatternValues.Solid);
            xrng.Style.Fill.SetBackgroundColor(XLColor.AirForceBlue);
        }
    }

    for(int i=0; i < 10; i++) {
        // Excel関数
        char c = (char)('A'+i);
        ws.Cell(13,i+1).SetFormulaA1($"=SUM({c}3:{c}12)");
    }

    // 罫線
    var rng = ws.Range(3,1,13,10);
    rng.Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin);
    rng.Style.Border.SetInsideBorder(XLBorderStyleValues.Thin);

    // 幅自動調整
    ws.Columns(1,10).AdjustToContents();

	// 保存
    wb.SaveAs(filename);
}
結果

SaveAsメソッドはStreamに書き出すことも可能なので、WebAppでは、MemoryStreamに書き出して、FileResultを返すことによって作成したファイルのダウンロードも可能。

public async Task<IActionResult> OnPostAsync() {
	・・・
	// ダウンロード
	using(MemoryStream stm = new MemoryStream()) {
	    wb.SaveAs(stm);
	    await stm.FlushAsync();
	    byte[] buf = stm.ToArray();
	    return File(buf,"application/octet-stream",FileName);
	}
}

Workbook(XLWorkbook)のコンストラクタに、ファイル名やStreamを指定することで、Excelファイルを読み込めるので、テンプレート的な使い方も可能。

チョット使い込んでみようかな。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください