大家有沒有過這樣的經歷:開發某個項目,需要調用Excel控件去生成Excel文件、填充數據、改變格式等等,常常在測試環境中一切正常,但在生產環境卻無法正常調用Excel,不是安裝的Excel版本不正確導致調用錯誤,就是因為超額數據量導致調用控件消耗內存過大,無法順利解決問題,搞得碼農心態崩潰,導致DeadLine延遲?現在好了,鐺鐺鐺,值得推薦的一款實用控件來了:MiniExcel!
1. 控件介紹
MiniExcel簡單、高效避免’OOM’的.NET處理Excel查、寫、填充數據工具。
‘OOM’,全稱“Out Of Memory”,意思是“內存用完了”。它來源于java.lang.OutOfMemoryError。
目前主流框架大多需要將數據全載入到內存方便操作,但這會導致內存消耗問題,MiniExcel嘗試以 Stream角度寫底層算法邏輯,能讓原本1000多MB占用降低到幾MB,避免內存不夠情況,而且不再要求系統本身必須安裝Excel。
MiniExcel 是一個在 .NET 平臺上用于操作 Excel 文件的庫。它的特點是輕量級、簡單易用,并且支持讀取和寫入 Excel 文件的功能。
使用 MiniExcel 可以進行以下操作:
讀取 Excel 文件的數據,并將其轉換為多維數組或實體對象。
將多維數組或實體對象寫入 Excel 文件,并保存為.xlsx格式。
根據指定的范圍讀取或寫入數據。
支持對單元格的樣式、格式進行設置。
項目目標是:力求做最簡單、最實用的Excel控件!
這個項目已經被dotNET China收錄,成為一個很有前途的開源項目,并在Gitee上得到站點推薦,得到了1.1KStars。
2. 特點簡述
支持.Net4.5,.Net5.0,Core .Net2.0。
低內存耗用,避免’OOM’(out of memoery)、頻繁 Full GC 情況。
支持即時操作每行數據。
兼具搭配 LINQ 延遲查詢特性,能辦到低消耗、快速分頁等復雜查詢。
輕量,不需要安裝 Microsoft Office、COM+,DLL小于150KB。
簡便操作的 API 風格。
3. 安裝
這個項目是通過NuGet包實現安裝。簡單來說,就是在.NET CLI模式下,執行如下命令即可自動安裝:
dotnet add package MiniExcel --version 1.23.2
4. 性能比較與測試
Benchmarks 邏輯可以在 MiniExcel.Benchmarks 中進行查看或是提交 PR,運行指令如下:
dotnet run -p .\\benchmarks\\MiniExcel.Benchmarks\\ -c Release -f netcoreapp3.1 \-- -f \* --join
最后一次運行規格、結果:
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical
cores
[Host] : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT
Job-ZYYABG : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT
IterationCount=3 LaunchCount=3 WarmupCount=3
現在我們做一個查詢、導入性能比較:
邏輯 : 以 Test1,000,000x10.xlsx 做基準與主流框架做性能測試,總共 1,000,000 行 *
10 列筆 “HelloWorld”,文件大小 23 MB。測試結果列在下圖中:
導出、創建Excel性能比較參見下圖:
5. 示例:
下面將給出部分樣例和效果圖,供大家參考。
using MiniExcelLibs;public void ReadExcel(string filePath){
var result = MiniExcel.Query(filePath)
.FirstOrDefault();
var data = result?[0][0];
Console.WriteLine(data);}public void WriteExcel(string filePath){
var data = new List<object[]>
{
new object[] { "Name", "Age" },
new object[] { "John", 25 },
new object[] { "Amy", 30 }
};
MiniExcel.Save(filePath, data);}
以上示例代碼中,通過 MiniExcel.Query 方法可以讀取 Excel 文件的數據,并使用 FirstOrDefault 方法獲取第一個工作表的數據。通過索引可以訪問特定的單元格數據。
通過 MiniExcel.Save 方法可以將數據寫入 Excel 文件,并保存為指定的路徑。
MiniExcel 簡化了對 Excel 文件的讀寫操作,適用于簡單的數據處理需求。相比于其他更復雜的庫,MiniExcel 是一個更輕量級的選擇,對于一些小規模的 Excel 操作場景可能更加適合。
Query 查詢 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\>();
指定單元格開始讀取數據
MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")
查詢所有 Sheet 名稱跟數據
var sheetNames = MiniExcel.GetSheetNames(path);
foreach (var sheetName in sheetNames)
{
var rows = MiniExcel.Query(path, sheetName: sheetName);
}
查詢所有欄(列)
var columns = MiniExcel.GetColumns(path);
高頻使用示例就介紹到這里啦,有需求的伙伴可以自行獲取項目地址學習更多優秀示例。
6. 最后有話說
這個開源項目提供全部源代碼,方便大家下載,還提供了很詳細的文檔說明。
以本人使用經驗來看,這個控件已經基本滿足了調用Excel控件開發需求,大家可以多多嘗試。而且,這個項目的團隊依然在繼續維護,讓人很看好。
有一個這么好用的工具,在項目開發過程中會讓你不用擔心內存不夠用,不用考慮對Excel的內容大小進行限制。所以本人很有誠意的推薦這款Mini控件啦。還有,通過對源代碼的學習,可以提高自己的水平。
該文章在 2023/9/7 16:14:03 編輯過