惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
Last Week in AI
Last Week in AI
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
O
OpenAI News
The Last Watchdog
The Last Watchdog
T
The Blog of Author Tim Ferriss
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
Forbes - Security
Forbes - Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
有赞技术团队
有赞技术团队
Jina AI
Jina AI
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
L
LangChain Blog
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AI
AI
博客园 - 聂微东
W
WeLiveSecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Scott Helme
Scott Helme
罗磊的独立博客
Martin Fowler
Martin Fowler
S
Security Affairs
T
Tor Project blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
美团技术团队
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
Cisco Talos Blog
Cisco Talos Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
Intezer
B
Blog
WordPress大学
WordPress大学
I
InfoQ
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
P
Privacy & Cybersecurity Law Blog
雷峰网
雷峰网

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms图像控件 基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器 推荐一种程序崩溃闪退或卡死的分析方法 推荐一款Ioc容器之Ninject入门详解 ASP.NET Core WebApi+React UI开发入门详解
推荐一款Excel读写神器之MiniExcel入门详解
老码识途呀 · 2025-04-29 · via 博客园 - 老码识途呀

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

什么是MiniExcel?

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

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

导出和创建Excel

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

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

MiniExcel安装

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

Excel读取

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

当前有一个Persons.xlsx的Excel,如下所示:

我们创建一个Person的模型类,如下所示:

namespace DemoMiniExcel
{
    public class Person
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }
}

然后通过MiniExcel的Query方法进行查询,Query方法返回值支持泛型操作,传入指定的模型类对象,如下所示:

namespace DemoMiniExcel
{
    internal class Program
    {
        static void Main(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!");
        }
    }
}

测试示例,如下所示:

在上述示例中采用MiniExcel的Query方法只是其中一种方式,还可以通过MiniExcel对Stream的扩展方法Query进行操作,如下所示:

namespace DemoMiniExcel
{
    internal class Program
    {
        static void Main(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!");
        }
    }
}

实例运行效果和上面一样,不再赘述。

Excel写入

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

以上就是《推荐一款Excel读写神器之MiniExcel入门详解》的全部内容,旨在抛砖引玉,一起学习,共同进步。