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

推荐订阅源

I
InfoQ
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
博客园 - 聂微东
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
F
Fortinet All Blogs
H
Help Net Security
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
L
LangChain Blog
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms自定义控件(1) 基于.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的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器
推荐一款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入门详解》的全部内容,旨在抛砖引玉,一起学习,共同进步。