开源.NET快速、简单避免OOM的Excel处理工具

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个.NET处理Excel查、写、填充数据的工具——MiniExcel。

开源.NET快速、简单避免OOM的Excel处理工具

目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。

开源.NET快速、简单避免OOM的Excel处理工具

特性

  • 低内存耗用,避免OOM、频繁 Full GC 情况
  • 支持即时操作每行数据
  • 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询
  • 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB
  • 简便操作的 API 风格


性能比较

  • 导入、查询 Excel 比较

逻辑 : 以 Test1,000,000x10.xlsx 做基准与主流框架做性能测试,总共 1,000,000 行 * 10 列笔 "HelloWorld",文件大小 23 MB

开源.NET快速、简单避免OOM的Excel处理工具

  • 导出、创建 Excel 比较

逻辑 : 创建1千万笔 "HelloWorld"

开源.NET快速、简单避免OOM的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(path);

// or

using (var stream = File.OpenRead(path))
    var rows = stream.Query();
开源.NET快速、简单避免OOM的Excel处理工具

  • Query 查询支援延迟加载(Deferred Execution),能配合LINQ First/Take/Skip办到低消耗、高效率复杂查询

举例 : 查询第一笔数据

var row = MiniExcel.Query(path).First();
Assert.Equal("HelloWorld", row.A);

// or

using (var stream = File.OpenRead(path))
{
    var row = stream.Query().First();
    Assert.Equal("HelloWorld", row.A);
}

与其他框架效率比较 :

开源.NET快速、简单避免OOM的Excel处理工具

  • Query 读 Excel 返回 DataTable

提醒 : 不建议使用,因为DataTable会将数据全载入内存,失去MiniExcel低内存消耗功能。

提醒 : 不建议使用,因为DataTable会将数据全载入内存,失去MiniExcel低内存消耗功能。
开源.NET快速、简单避免OOM的Excel处理工具

  • 指定单元格开始读取数据
MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")
开源.NET快速、简单避免OOM的Excel处理工具

  • 创建多个工作表(Sheet)
// 1. Dictionary
var users = new[] { new { Name = "Jack", Age = 25 }, new { Name = "Mike", Age = 44 } };
var department = new[] { new { ID = "01", Name = "HR" }, new { ID = "02", Name = "IT" } };
var sheets = new Dictionary
{
    ["users"] = users,
    ["department"] = department
};
MiniExcel.SaveAs(path, sheets);

// 2. DataSet
var sheets = new DataSet();
sheets.Add(UsersDataTable);
sheets.Add(DepartmentDataTable);
//..
MiniExcel.SaveAs(path, sheets);
开源.NET快速、简单避免OOM的Excel处理工具

  • IEnumerable 数据填充

Note1: 同行从左往右以第一个 IEnumerableUse 当列表来源 (不支持同列多集合)

//1. By POCO
var value = new
{
    employees = new[] {
        new {name="Jack",department="HR"},
        new {name="Lisa",department="HR"},
        new {name="John",department="HR"},
        new {name="Mike",department="IT"},
        new {name="Neo",department="IT"},
        new {name="Loan",department="IT"}
    }
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);

//2. By Dictionary
var value = new Dictionary()
{
    ["employees"] = new[] {
        new {name="Jack",department="HR"},
        new {name="Lisa",department="HR"},
        new {name="John",department="HR"},
        new {name="Mike",department="IT"},
        new {name="Neo",department="IT"},
        new {name="Loan",department="IT"}
    }
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);

模板:

开源.NET快速、简单避免OOM的Excel处理工具

最终效果:

开源.NET快速、简单避免OOM的Excel处理工具


—END—

开源协议:Apache2.0

开源地址:https://github.com/MiniExcel/MiniExcel

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章