前言
日常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入、导出等,但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出。今天给大家推荐一个简单、高效、低内存避免OOM(内存溢出)的.NET操作Excel开源框架:MiniExcel。
官方介绍
MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。
项目特点
-
低内存耗用,避免OOM、频繁 Full GC 情况。
支持即时操作每行数据。
兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询。
轻量,不需要安装 Microsoft Office、COM ,DLL小于150KB。
简便操作的 API 风格。
主流Excel操作框架性能对比
导入、查询 Excel 比较
导出、创建 Excel 比较
快速开始
注意:下面只展示部分代码示例,详情框架功能请前往源码地址查看:https://gitee.com/dotnetchina/MiniExcel
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>;
Query 查询 Excel 返回Dynamic IEnumerable 数据
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
推荐使用,可以避免载入全部数据到内存.
MiniExcel.SaveAs(path, reader);
推荐 DataReader 多表格导出方式(建议使用 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);
}
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
https://gitee.com/dotnetchina/MiniExcel
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。