前言
日常工作中經(jīng)常與數(shù)據(jù)打交道的同學(xué)肯定會難以避免對Excel的一些數(shù)據(jù)操作如導(dǎo)入、導(dǎo)出等,但是當(dāng)對一些大數(shù)據(jù)量操作Excel時經(jīng)常會遇到一個常見的問題內(nèi)存溢出。今天給大家推薦一個簡單、高效、低內(nèi)存避免OOM(內(nèi)存溢出)的.NET操作Excel開源框架:MiniExcel。
官方介紹
MiniExcel簡單、高效避免OOM的.NET處理Excel查、寫、填充數(shù)據(jù)工具。目前主流框架大多需要將數(shù)據(jù)全載入到內(nèi)存方便操作,但這會導(dǎo)致內(nèi)存消耗問題,MiniExcel 嘗試以 Stream 角度寫底層算法邏輯,能讓原本1000多MB占用降低到幾MB,避免內(nèi)存不夠情況。
項目特點
- 低內(nèi)存耗用,避免OOM、頻繁 Full GC 情況。
- 兼具搭配 LINQ 延遲查詢特性,能辦到低消耗、快速分頁等復(fù)雜查詢。
- 輕量,不需要安裝 Microsoft Office、COM+,DLL小于150KB。
主流Excel操作框架性能對比
導(dǎo)入、查詢 Excel 比較
導(dǎo)出、創(chuàng)建 Excel 比較
快速開始
注意:下面只展示部分代碼示例,詳情框架功能請前往源碼地址查看:https://gitee.com/dotnetchina/MiniExcel
Query 查詢 Excel 返回強型別 IEnumerable 數(shù)據(jù)
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>();
Query 查詢 Excel 返回Dynamic IEnumerable 數(shù)據(jù)
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<string, object>>
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
推薦使用,可以避免載入全部數(shù)據(jù)到內(nèi)存.
MiniExcel.SaveAs(path, reader);
推薦 DataReader 多表格導(dǎo)出方式(建議使用 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/MiniExcel
該文章在 2023/10/23 19:03:17 編輯過