• 一个简单高效低内存的.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 数据

    1. public class UserAccount
    2. {
    3.     public Guid ID { getset; }
    4.     public string Name { getset; }
    5.     public DateTime BoD { getset; }
    6.     public int Age { getset; }
    7.     public bool VIP { getset; }
    8.     public decimal Points { getset; }
    9. }
    10. var rows = MiniExcel.Query(path);
    11. // or
    12. using (var stream = File.OpenRead(path))
    13.     var rows = stream.Query();

    Query 查询 Excel 返回Dynamic IEnumerable 数据

    1. var rows = MiniExcel.Query(path).ToList();
    2. // or 
    3. using (var stream = File.OpenRead(path))
    4. {
    5.     var rows = stream.Query().ToList();
    6.                 
    7.     Assert.Equal("MiniExcel", rows[0].A);
    8.     Assert.Equal(1, rows[0].B);
    9.     Assert.Equal("Github", rows[1].A);
    10.     Assert.Equal(2, rows[1].B);
    11. }

    支持集合<匿名类别>或是<强型别>

    1. var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
    2. MiniExcel.SaveAs(path, new[] {
    3.     new { Column1 = "MiniExcel"Column2 = 1 },
    4.     new { Column1 = "Github"Column2 = 2}
    5. });

    IEnumerable>

    1. var values = new List<Dictionary<stringobject>>()
    2. {
    3.     new Dictionary<string,object>{{ "Column1""MiniExcel" }, { "Column2"1 } },
    4.     new Dictionary<string,object>{{ "Column1""Github" }, { "Column2"2 } }
    5. };
    6. MiniExcel.SaveAs(path, values);

    IDataReader

    推荐使用,可以避免载入全部数据到内存.

    MiniExcel.SaveAs(path, reader);

    推荐 DataReader 多表格导出方式(建议使用 Dapper ExecuteReader )

    1. using (var cnn = Connection)
    2. {
    3.     cnn.Open();
    4.     var sheets = new Dictionary<string,object>();
    5.     sheets.Add("sheet1", cnn.ExecuteReader("select 1 id"));
    6.     sheets.Add("sheet2", cnn.ExecuteReader("select 2 id"));
    7.     MiniExcel.SaveAs("Demo.xlsx", sheets);
    8. }

    项目源码地址

    更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

    MiniExcel: 简单、高效避免OOM的.NET处理Excel查、写、模版填充数据工具。

    优秀项目和框架精选

    该项目已收录到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技术交流群👉

  • 相关阅读:
    游戏开发37课 狙击枪 视野问题
    MCE | TGF-β 信号通路
    Ubuntu 22.04安装过程
    eclipse启动一个Springboot项目
    R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、设置add参数为mean可视化不同水平均值的柱状图
    C# 用VS原生CheckBox控件制作漂亮的开关
    C语言字符指针
    SAP 公司代码全局参数设置及其意义
    同步、异步无障碍:Python异步装饰器指南
    如何压缩图片大小?减小图片大小方法来啦
  • 原文地址:https://blog.csdn.net/qq_37237487/article/details/134067855