一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel

前言

日常工作中经常与数据打交道的同学肯定会难以避免对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

加入DotNetGuide技术交流群

1、提供.NET开发者分享自己优质文章的群组和获取更多全面的C#/.NET/.NET Core学习资料、视频、文章、书籍,社区组织,工具和常见面试题资源,帮助大家更好地了解和使用 .NET技术。

2、在这个群里,开发者们可以分享自己的项目经验、遇到的问题以及解决方案,倾听他人的意见和建议,共同成长与进步。

3、可以结识更多志同道合的开发者,甚至可能与其他开发者合作完成有趣的项目。通过这个群组,我们希望能够搭建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值。

欢迎加入DotNetGuide技术交流群👉

相关推荐
追逐时光者3 小时前
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
【.net】·【c#】·【开源项目】·【winform】
追逐时光者3 天前
3款.NET开源、功能强大的通讯调试工具,效率提升利器!
【.net】·【c#】·【开源项目】
追逐时光者4 天前
C#/.NET/.NET Core技术前沿周刊 | 第 18 期(2024年12.16-12.22)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者5 天前
C#字符串拼接的几种方式及其性能分析对比
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者7 天前
一个.NET开源、易于使用的屏幕录制工具
【.net】·【开源项目】
追逐时光者8 天前
好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!
【visual studio】·【.net】·【c#】·【实用工具】·【ai编程】
追逐时光者10 天前
基于.NET WinForm开发的一款硬件及协议通讯工具
【.net】·【开源项目】·【winform】
追逐时光者10 天前
一款基于 .NET MVC 框架开发、功能全面的MES系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者12 天前
C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
【.net】·【c#】·【.net core】·【技术前沿周刊】