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

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

以下是MiniExcel官方列出的与其他Excel框架的的性能比较。主要分为读取和写入,如下所示:
逻辑 : 以 Test1,000,000x10.xlsx 做基准与主流框架做性能测试,总共 1,000,000 行 * 10 列笔 "HelloWorld",文件大小 23 MB

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

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


namespace DemoMiniExcel{public class Person{public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }}}
namespace DemoMiniExcel{internal class Program{staticvoidMain(string[] args){string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx");var rows = MiniExcel.Query<Person>(excel).ToList();if (rows.Count > 0){foreach (var item in rows){Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");}}Console.WriteLine("Hello, World!");}}}

namespace DemoMiniExcel{internal class Program{staticvoidMain(string[] args){string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person.xlsx");using (var stream = File.OpenRead(excel)){var rows = stream.Query<Person>().ToList();if (rows.Count > 0){foreach (var item in rows){Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");}}}Console.WriteLine("Hello, World!");}}}
MiniExcel支持将对象数据写入到Excel,可以通过MiniExcel提供的SaveAs方法,将对象数据写入Excel,如下所示:
string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person2.xlsx");var persons = new List<Person>();for (int i = 0; i < 10; i++){persons.Add(new Person(){ID = i,Name = "A" + i.ToString(),Age = 20 + i,});}MiniExcel.SaveAs(excel, persons);
MiniExcel写入的Excel,默认还自带格式,如下所示:

同时MiniExcel,还支持Stream的读写方式创建Excel,如下所示:
string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person3.xlsx");var persons = new List<Person>();for (int i = 0; i < 10; i++){persons.Add(new Person(){ID = i,Name = "A" + i.ToString(),Age = 20 + i,});}using (var stream = File.Create(excel)){stream.SaveAs(persons);}
实例运行后,导出的Excel效果和上面一样,不再赘述。
本文主要介绍MiniExcel的简单用途,关于更多内容,请参考官方文档:https://gitee.com/dotnetchina/MiniExcel
作者:小码编匠

谁说 WinForm 不能高颜值?看这个 Ant Design 无边框收银系统
WinForm + SQL Server 开发企业物资管理系统(库存、出入库、审批全搞定)
基于 WinForm、Halcon、OpenCV的多功能图像处理与机器视觉框架
WPF + Halcon + YOLO 工业视觉检测的全能上位机
零依赖!WinForm 车牌识别系统开发全流程(算法实现+模块拆解)
WPF/WinForm 也能用 ECharts?快来试试这个开源项目
WinForm 也能玩转工业物联网?这个轻量级 SCADA 数据采集网关做到了
WPF+OpenCvSharp搭个可视化调试神器,别再写 Console 测试 OpenCV 了!
C# 工业级串口数据实时解析工具:策略模式 + 多线程 + 帧同步实战
WPF + OpenCvSharp 搭个 OpenCV 脚手架,所见即所得玩转图像处理
WinForm + AntdUI 实现物料编码自动填充,彻底告别手工 BOM
无需联网!基于 .NET + YOLO 的桌面端图像与视频目标检测实战
.NET 9 智能门锁管理系统:远程开锁与临时密码(酒店/民宿)
Avalonia 工业级实战:从 PLC 通信到 Web HMI 的完整方案
一个值得收藏的 WinForms 界面框架:流式菜单 + 分割容器 + 多标签页
C# 做动态数据看板?这个 WinForms 多图表方案值得参考
C# 面向自动化产线上位机开源项目(支持报警、日志与多语言)
真正能落地的 .NET 8/9/10 企业平台:集成权限、流程引擎与实时通信
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力



