簡介
MiniExcel簡單、高效避免OOM的.NET處理Excel查、寫、填充資料工具。目前主流框架大多需要將資料全載入到記憶體方便操作,但這會導致記憶體消耗問題,MiniExcel 嘗試以 Stream 角度寫底層演算法邏輯,能讓原本1000多MB佔用降低到幾MB,避免記憶體不夠情況。
特點
低記憶體耗用,避免OOM、頻繁 Full GC 情況 支援即時操作每行資料 兼具搭配 LINQ 延遲查詢特性,能辦到低消耗、快速分頁等複雜查詢 輕量,不需要安裝 Microsoft Office、COM+,DLL小於150KB 簡便操作的 API 風格
安裝 MiniExcel
透過 NuGet 安裝 MiniExcel 包:Install-Package MiniExcel
MiniExcel讀寫Excel文件
讀取 Excel 檔案
using MiniExcelLibs;
// 讀取 Excel 檔案到 DataSet
var ds = ExcelUtil.OpenExcelFile("demo.xlsx");
// 讀取指定工作表
var sheet = ds.Tables["Sheet1"];
// 遍歷行
foreach (DataRow row in sheet.Rows)
{
// 處理每一行
Console.WriteLine(row[0]);
}
寫入 Excel 檔案
using MiniExcelLibs;
// 建立 DataTable
var table = new DataTable();
table.Columns.Add("姓名");
table.Columns.Add("年齡");
table.Columns.Add("班級");
// 新增資料
table.Rows.Add("李雷", "18","三年一班");
table.Rows.Add("韓梅梅", "18","三年一班");
table.Rows.Add("李白", "18","三年二班");
table.Rows.Add("杜甫", "18","三年二班");
table.Rows.Add("白居易", "18","三年二班");
// 寫入 Excel 檔案
ExcelUtil.SaveExcel(table, "demo.xlsx");
讀取 Excel
using MiniExcelLibs;
//指定讀取的Sheet
MiniExcel.Query(path, sheetName: "SheetName");
//讀取所有列
var columns = MiniExcel.GetColumns("D:\\Demo\\Student.xlsx",useHeaderRow:true);
// 讀取單個單元格
var value = ExcelUtil.GetValue("demo.xlsx", "A1");
// 讀取指定工作表的單元格
var valueFromSheet = ExcelUtil.GetValue("demo.xlsx", "Sheet2", "A1");
寫入 Excel 特定單元格
using MiniExcelLibs;
// 將值寫入到 Excel 檔案的特定單元格
ExcelUtil.SetValue("demo.xlsx", "A1", "韓梅梅");
透過實體類來匯入匯出
定義實體類//學生實體類 public class Student { //指定Excel的列表 [ExcelColumnName("姓名")] public string Name { get; set; } [ExcelColumnName("年齡")] public int Age { get; set; } //指定Excel的列寬 [ExcelColumnWidth(20)] [ExcelColumnName("所在班級")] public string ClassName{ get; set; } }
匯出
//匯出Excel
private void WriteExcel()
{
// 建立一個包含資料的列表
var data = new List<Student>
{
new Student{Name= "李雷",Age= 20,ClassName= "三年二班" },
new Student{ Name= "韓梅梅",Age= 18,ClassName= "三年二班" },
new Student{ Name= "李白", Age= 19, ClassName= "三年二班" }
};
// 指定要儲存的檔名
var saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel Files|*.xlsx";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = saveFileDialog.FileName;
// 寫入資料到 Excel 檔案
MiniExcel.SaveAs(filePath, data);
MessageBox.Show("資料已成功匯出到 Excel 檔案!");
}
}
在現有Excel的基礎上插入行
//匯出Excel
private void WriteExcel()
{
// 指定要儲存的檔名
var saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel Files|*.csv";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = saveFileDialog.FileName;
// 寫入資料到 Excel 檔案
MiniExcel.SaveAs(filePath, data);
//插入行
var d = new Student
{ Name = "白居易", Age = 20, ClassName= "三年二班" };
MiniExcel.Insert(filePath, d);
MessageBox.Show("已成功在Excel 檔案種插入1行資料 !");
}
}
讀取Excel並對映到實體類
private void ReadExcel()
{
// IEnumerable
var rows = MiniExcel.Query<Student>("D:\\Demo\\Student.xlsx");
foreach (var row in rows)
{
//row 就是一個Student實體
Console.WriteLine(row.Name);
}
}
使用模板匯出資料
類似 Vue 模板 {{變數名稱}}注意:Excel模板中變數名區分大小寫。
//單條資料匯出
private void WriteExcelByTemplate()
{
string template = "D:\\Demo\\StudentTemplate.xlsx";
var value = new Student
{
Name = "杜牧",
Age = 19,
ClassName= "三年二班"
};
MiniExcel.SaveAsByTemplate("D:\\Demo\\StudentData.xlsx", template, value);
}
集合渲染 {{集合名稱.欄位名稱}}
// 資料集合匯出
private void WriteExcelByListTemplate()
{
string template = "D:\\Demo\\StudentListTemplate.xlsx";
// 建立一個包含資料的列表
var data = new
{
P = new[]
{
new Student{Name= "曹操",Age= 20,ClassName= "三年二班" },
new Student{ Name= "劉備",Age= 18,ClassName= "三年二班" },
new Student{ Name= "孫權", Age= 19, ClassName= "三年二班" }
}
};
MiniExcel.SaveAsByTemplate("D:\\Demo\\StudentData.xlsx", template, data);
}
來源:C#使用開源操作庫MiniExcel操作Excel https://www.iwmyx.cn/miniexceldemo.html