C#使用開源操作庫MiniExcel操作Excel

武穆逸仙發表於2024-05-20

簡介

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

相關文章