.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ファイルを読み込めるので、テンプレート的な使い方も可能。
チョット使い込んでみようかな。