DUICUO

MiniExcel は、Excel ファイルを操作するためのシンプルで効率的、かつメモリ消費量の少ない .NET オープンソース フレームワークです。

序文

データを頻繁に扱う方であれば、Excelでインポートやエクスポートといったデータ操作に遭遇することは避けられません。しかし、大量のデータを扱う際には、メモリオーバーフローというよくある問題が発生します。そこで本日は、Excelを操作するためのシンプルで効率的、かつメモリ使用量が少なく、OOM(Out of Memory)を回避できる.NETオープンソースフレームワーク、MiniExcelをご紹介します。

公式紹介

MiniExcelは、Excelデータの取得、書き込み、そしてOutOfMemoryError(OOM)を回避しながら、シンプルかつ効率的な.NETツールです。多くの主流フレームワークは、操作を容易にするためにすべてのデータをメモリにロードする必要があり、これがメモリ消費の問題につながります。MiniExcelは、基盤となるアルゴリズムロジックをストリームの観点から記述することで、元々1000MB以上あったメモリをわずか数MBにまで削減し、メモリ不足を回避します。

写真

プロジェクトの特徴

  • メモリ消費量が少なく、OOM や Full GC の頻繁な状況を回避します。
  • 各データ行のリアルタイム操作をサポートします。
  • また、LINQ 遅延クエリ機能も備えており、低いオーバーヘッドと高速なページネーションで複雑なクエリを可能にします。
  • 軽量で、Microsoft Office や COM+ のインストールは必要なく、DLL サイズは 150 KB 未満です。
  • ユーザーフレンドリーな API スタイル。

主流のExcelフレームワークのパフォーマンス比較

Excel比較のインポートとクエリ

写真

Excel比較のエクスポートと作成

写真

クイックスタート

注: 以下に示しているのはコード例の一部です。フレームワークの詳細な機能については、ソースコードをご覧ください: https://gitee.com/dotnetchina/MiniExcel

クエリは、Excel ファイルから厳密に型指定された IEnumerable データを返します。

 public class UserAccount { public Guid ID { get; set; } public string Name { get; set; } public DateTime BoD { get; set; } public int Age { get; set; } public bool VIP { get; set; } public decimal Points { get; set; } } var rows = MiniExcel.Query<UserAccount>(path); // or using (var stream = File.OpenRead(path)) var rows = stream.Query<UserAccount>();

写真

クエリ関数は、Excel ファイルから Dynamic IEnumerable データを取得します。

 var rows = MiniExcel.Query(path).ToList(); // or using (var stream = File.OpenRead(path)) { var rows = stream.Query().ToList(); Assert.Equal("MiniExcel", rows[0].A); Assert.Equal(1, rows[0].B); Assert.Equal("Github", rows[1].A); Assert.Equal(2, rows[1].B); }

<匿名カテゴリ> または <強力なタイプ> のコレクションをサポートします。

 var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); MiniExcel.SaveAs(path, new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} });

IEnumerable<IDictionary<文字列、オブジェクト>>

 var values = new List<Dictionary<string, object>>() { new Dictionary<string,object>{{ "Column1", "MiniExcel" }, { "Column2", 1 } }, new Dictionary<string,object>{{ "Column1", "Github" }, { "Column2", 2 } } }; MiniExcel.SaveAs(path, values);

写真

IDataReader

すべてのデータをメモリにロードすることを回避するため、使用することをお勧めします。

 MiniExcel.SaveAs(path, reader);

写真

複数テーブルのエクスポートには DataReader を使用することをお勧めします (Dapper ExecuteReader が推奨されます)。

 using (var cnn = Connection) { cnn.Open(); var sheets = new Dictionary<string,object>(); sheets.Add("sheet1", cnn.ExecuteReader("select 1 id")); sheets.Add("sheet2", cnn.ExecuteReader("select 2 id")); MiniExcel.SaveAs("Demo.xlsx", sheets); }

プロジェクトのソースコードアドレス

プロジェクトのより便利な機能や機能については、プロジェクトのオープンソース アドレス 👀 にアクセスしてください。また、プロジェクトにスターを付けてサポートを示すこともお忘れなく 💖 ください。

https://gitee.com/dotnetchina/ミニエクセル

厳選された優れたプロジェクトとフレームワーク

このプロジェクトは、「厳選された優れたC#/.NET/.NET Coreプロジェクトとフレームワーク」セクションに選出されました。この選出をフォローすることで、C#、.NET、.NET Coreの最新の開発状況やベストプラクティスを把握し、開発の効率と品質を向上させることができます。プロジェクトは準備完了です。皆様からのPR投稿や自己推薦をお待ちしております( 让优秀的项目和框架不被埋没🤞 )。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md