找回密码
 立即注册
首页 资源区 代码 推荐一款Excel读写神器之MiniExcel入门详解 ...

推荐一款Excel读写神器之MiniExcel入门详解

蔺蓉城 2025-5-29 10:54:26
在实际应用中,经常需要用到数据的导入与导出,而在这些导入导出功能中,最常用的就是Excel格式,它能非常方便的实现格式化数据呈现。目前主流框架大多需要将数据全载入到内存方便操作,但如果数据量过大,这可能会导致内存消耗问题,今天介绍的MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。本文以一些简单的小例子,简述MiniExcel的常见用法,仅供学习分享之用,如有不足之处,还请指正。
 
什么是MiniExcel?

 
MiniExcel是.Net基金会旗下的项目,是一款简单、高效避免OOM(Out of Memory)的.NET处理Excel查、写、填充数据工具。
1.png

 
MiniExcel的特点

 
与其他Excel处理框架相比,MiniExcel具有如下特点:

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

 
以下是MiniExcel官方列出的与其他Excel框架的的性能比较。主要分为读取和写入,如下所示:
 
导入和查询比较

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

 
导出和创建Excel

 
逻辑 : 创建1千万笔 "HelloWorld"
3.png

通过上述对比,可以发现,MiniExcel无论在读取,还是写入,性能都挺不错,值得学习。
 
MiniExcel安装

 
在Visual Studio 2022中,可以通过Nuget包管理器进行安装,当前最新版本为v1.41.1,如下所示:
4.png

 
Excel读取

 
MiniExcel最强大之处,将Excel中的列和模型中的属性名,进行自动匹配,进而实现ORM,减少手动匹配的繁琐操作。如下所示:
当前有一个Persons.xlsx的Excel,如下所示:
5.png

我们创建一个Person的模型类,如下所示:
  1. namespace DemoMiniExcel
  2. {
  3.     public class Person
  4.     {
  5.         public int ID { get; set; }
  6.         public string Name { get; set; }
  7.         public int Age { get; set; }
  8.     }
  9. }
复制代码
然后通过MiniExcel的Query方法进行查询,Query方法返回值支持泛型操作,传入指定的模型类对象,如下所示:
  1. namespace DemoMiniExcel
  2. {
  3.     internal class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx");
  8.             var rows = MiniExcel.Query<Person>(excel).ToList();
  9.             if (rows.Count > 0)
  10.             {
  11.                 foreach (var item in rows)
  12.                 {
  13.                     Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");
  14.                 }
  15.             }
  16.             Console.WriteLine("Hello, World!");
  17.         }
  18.     }
  19. }
复制代码
测试示例,如下所示:
6.png

在上述示例中采用MiniExcel的Query方法只是其中一种方式,还可以通过MiniExcel对Stream的扩展方法Query进行操作,如下所示:
  1. namespace DemoMiniExcel
  2. {
  3.     internal class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx");
  8.             using (var stream = File.OpenRead(excel))
  9.             {
  10.                 var rows = stream.Query<Person>().ToList();
  11.                 if (rows.Count > 0)
  12.                 {
  13.                     foreach (var item in rows)
  14.                     {
  15.                         Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");
  16.                     }
  17.                 }
  18.             }
  19.             Console.WriteLine("Hello, World!");
  20.         }
  21.     }
  22. }
复制代码
实例运行效果和上面一样,不再赘述。
 
Excel写入

 
MiniExcel支持将对象数据写入到Excel,可以通过MiniExcel提供的SaveAs方法,将对象数据写入Excel,如下所示:
  1. string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person2.xlsx");
  2. var persons = new List<Person>();
  3. for (int i = 0; i < 10; i++)
  4. {
  5.     persons.Add(new Person()
  6.     {
  7.         ID = i,
  8.         Name = "A" + i.ToString(),
  9.         Age = 20 + i,
  10.     });
  11. }
  12. MiniExcel.SaveAs(excel, persons);
复制代码
MiniExcel写入的Excel,默认还自带格式,如下所示:
7.png

同时MiniExcel,还支持Stream的读写方式创建Excel,如下所示:
  1. string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person3.xlsx");
  2. var persons = new List<Person>();
  3. for (int i = 0; i < 10; i++)
  4. {
  5.     persons.Add(new Person()
  6.     {
  7.         ID = i,
  8.         Name = "A" + i.ToString(),
  9.         Age = 20 + i,
  10.     });
  11. }
  12. using (var stream = File.Create(excel))
  13. {
  14.     stream.SaveAs(persons);
  15. }
复制代码
实例运行后,导出的Excel效果和上面一样,不再赘述。
 
参考文档

 
本文主要介绍MiniExcel的简单用途,关于更多内容,请参考官方文档:https://gitee.com/dotnetchina/MiniExcel
以上就是《推荐一款Excel读写神器之MiniExcel入门详解》的全部内容,旨在抛砖引玉,一起学习,共同进步。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册