在實(shí)際應(yīng)用中,經(jīng)常需要用到數(shù)據(jù)的導(dǎo)入與導(dǎo)出,而在這些導(dǎo)入導(dǎo)出功能中,最常用的就是Excel格式,它能非常方便的實(shí)現(xiàn)格式化數(shù)據(jù)呈現(xiàn)。目前主流框架大多需要將數(shù)據(jù)全載入到內(nèi)存方便操作,但如果數(shù)據(jù)量過大,這可能會導(dǎo)致內(nèi)存消耗問題,今天介紹的MiniExcel 嘗試以 Stream 角度寫底層算法邏輯,能讓原本1000多MB占用降低到幾MB,避免內(nèi)存不夠情況。本文以一些簡單的小例子,簡述MiniExcel的常見用法,僅供學(xué)習(xí)分享之用,如有不足之處,還請指正。 什么是MiniExcel?MiniExcel是.Net基金會旗下的項(xiàng)目,是一款簡單、高效避免OOM(Out of Memory)的.NET處理Excel查、寫、填充數(shù)據(jù)工具。 
MiniExcel特點(diǎn)- 與其他Excel處理框架相比,MiniExcel具有如下特點(diǎn):
- 低內(nèi)存耗用,避免OOM、頻繁 Full GC 情況
- 兼具搭配 LINQ 延遲查詢特性,能辦到低消耗、快速分頁等復(fù)雜查詢
- 輕量,不需要安裝 Microsoft Office、COM+,DLL小于150KB
Excel操作性能比較以下是MiniExcel官方列出的與其他Excel框架的的性能比較。主要分為讀取和寫入,如下所示: 邏輯 : 以 Test1,000,000x10.xlsx 做基準(zhǔn)與主流框架做性能測試,總共 1,000,000 行 * 10 列筆 "HelloWorld",文件大小 23 MB  2. 導(dǎo)出和創(chuàng)建Excel邏輯 : 創(chuàng)建1千萬筆 "HelloWorld" 
通過上述對比,可以發(fā)現(xiàn),MiniExcel無論在讀取,還是寫入,性能都挺不錯(cuò),值得學(xué)習(xí)。 MinExcel安裝在Visual Studio 2022中,可以通過Nuget包管理器進(jìn)行安裝,當(dāng)前最新版本為v1.41.1,如下所示:MinExcel讀取MiniExcel最強(qiáng)大之處,將Excel中的列和模型中的屬性名,進(jìn)行自動(dòng)匹配,進(jìn)而實(shí)現(xiàn)ORM,減少手動(dòng)匹配的繁瑣操作。如下所示:當(dāng)前有一個(gè)Persons.xlsx的Excel,如下所示:我們創(chuàng)建一個(gè)Person的模型類,如下所示:namespace DemoMiniExcel { public class Person { public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; } } } 然后通過MiniExcel的Query方法進(jìn)行查詢,Query方法返回值支持泛型操作,傳入指定的模型類對象,如下所示:namespace DemoMiniExcel { internal class Program { static void Main(string[] args) { string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx"); var rows = MiniExcel.Query<Person>(excel).ToList(); if (rows.Count > 0) { foreach (var item in rows) { Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}"); } } Console.WriteLine("Hello, World!"); } } } 在上述示例中采用MiniExcel的Query方法只是其中一種方式,還可以通過MiniExcel對Stream的擴(kuò)展方法Query進(jìn)行操作,如下所示:namespace DemoMiniExcel { internal class Program { static void Main(string[] args) { string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx"); using (var stream = File.OpenRead(excel)) { var rows = stream.Query<Person>().ToList(); if (rows.Count > 0) { foreach (var item in rows) { Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}"); } } } Console.WriteLine("Hello, World!"); } } } 實(shí)例運(yùn)行效果和上面一樣,不再贅述。MinExcel寫入MiniExcel支持將對象數(shù)據(jù)寫入到Excel,可以通過MiniExcel提供的SaveAs方法,將對象數(shù)據(jù)寫入Excel,如下所示: string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person2.xlsx"); var persons = new List<Person>(); for (int i = 0; i < 10; i++) { persons.Add(new Person() { ID = i, Name = "A" + i.ToString(), Age = 20 + i, }); } MiniExcel.SaveAs(excel, persons);
MiniExcel寫入的Excel,默認(rèn)還自帶格式,如下所示: 
同時(shí)MiniExcel,還支持Stream的讀寫方式創(chuàng)建Excel,如下所示: string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person3.xlsx"); var persons = new List<Person>(); for (int i = 0; i < 10; i++) { persons.Add(new Person() { ID = i, Name = "A" + i.ToString(), Age = 20 + i, }); } using (var stream = File.Create(excel)) { stream.SaveAs(persons); }
實(shí)例運(yùn)行后,導(dǎo)出的Excel效果和上面一樣,不再贅述。 參考文檔本文主要介紹MiniExcel的簡單用途,關(guān)于更多內(nèi)容,請參考官方文檔:https:///dotnetchina/MiniExcel 以上就是《推薦一款Excel讀寫神器之MiniExcel入門詳解》的全部內(nèi)容,關(guān)于更多詳細(xì)內(nèi)容,可參考官方文檔。希望能夠一起學(xué)習(xí),共同進(jìn)步。學(xué)習(xí)編程,從關(guān)注【老碼識途】開始,為大家分享更多文章?。?! 
|