终朝只恨聚无多 發表於 2025-4-29 12:00:00

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

<p>在实际应用中,经常需要用到数据的导入与导出,而在这些导入导出功能中,最常用的就是Excel格式,它能非常方便的实现格式化数据呈现。目前主流框架大多需要将数据全载入到内存方便操作,但如果数据量过大,这可能会导致内存消耗问题,今天介绍的MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。本文以一些简单的小例子,简述MiniExcel的常见用法,仅供学习分享之用,如有不足之处,还请指正。</p>
<p>&nbsp;</p>
<h1>什么是MiniExcel?</h1>
<p>&nbsp;</p>
<p>MiniExcel是.Net基金会旗下的项目,是一款简单、高效避免OOM(Out of Memory)的.NET处理Excel查、写、填充数据工具。</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250426184214033-210101472.png"></p>
<p>&nbsp;</p>
<h1>MiniExcel的特点</h1>
<p>&nbsp;</p>
<p>与其他Excel处理框架相比,MiniExcel具有如下特点:</p>
<ul>
<li><span style="font-family: &quot;Microsoft YaHei&quot;">低内存耗用,避免OOM、频繁 Full GC 情况</span></li>
<li><span style="font-family: &quot;Microsoft YaHei&quot;">支持即时操作每行数据</span></li>
<li><span style="font-family: &quot;Microsoft YaHei&quot;">兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询</span></li>
<li><span style="font-family: &quot;Microsoft YaHei&quot;">轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB</span></li>
<li><span style="font-family: &quot;Microsoft YaHei&quot;">简便操作的 API 风格</span></li>
</ul>
<p>&nbsp;</p>
<h1>Excel操作性能比较</h1>
<p>&nbsp;</p>
<p>以下是MiniExcel官方列出的与其他Excel框架的的性能比较。主要分为读取和写入,如下所示:</p>
<p>&nbsp;</p>
<h2>导入和查询比较</h2>
<p>&nbsp;</p>
<p>逻辑 : 以&nbsp;<strong>Test1,000,000x10.xlsx</strong> 做基准与主流框架做性能测试,总共 1,000,000 行 * 10 列笔 "HelloWorld",文件大小 23 MB</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250426185248695-925225836.png"></p>
<p>&nbsp;</p>
<h2>导出和创建Excel</h2>
<p>&nbsp;</p>
<p>逻辑 : 创建1千万笔 "HelloWorld"</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250426233227579-530156858.png"></p>
<p>通过上述对比,可以发现,MiniExcel无论在读取,还是写入,性能都挺不错,值得学习。</p>
<p>&nbsp;</p>
<h1>MiniExcel安装</h1>
<p>&nbsp;</p>
<p>在Visual Studio 2022中,可以通过Nuget包管理器进行安装,当前最新版本为v1.41.1,如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250426233806916-1975646703.png"></p>
<p>&nbsp;</p>
<h1>Excel读取</h1>
<p>&nbsp;</p>
<p>MiniExcel最强大之处,将Excel中的列和模型中的属性名,进行自动匹配,进而实现ORM,减少手动匹配的繁琐操作。如下所示:</p>
<p>当前有一个Persons.xlsx的Excel,如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250426234959652-1421743559.png"></p>
<p>我们创建一个Person的模型类,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>namespace DemoMiniExcel
{
    public class Person
    {
      public int ID { get; set; }

      public string Name { get; set; }

      public int Age { get; set; }
    }
}</code></pre>
<p>然后通过MiniExcel的Query方法进行查询,Query方法返回值支持泛型操作,传入指定的模型类对象,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>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&lt;Person&gt;(excel).ToList();
            if (rows.Count &gt; 0)
            {
                foreach (var item in rows)
                {
                  Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");
                }
            }
            Console.WriteLine("Hello, World!");
      }
    }
}</code></pre>
<p>测试示例,如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250427000318565-1206553181.png"></p>
<p>在上述示例中采用MiniExcel的Query方法只是其中一种方式,还可以通过MiniExcel对Stream的扩展方法Query进行操作,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>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&lt;Person&gt;().ToList();
                if (rows.Count &gt; 0)
                {
                  foreach (var item in rows)
                  {
                        Console.WriteLine($"ID={item.ID},Name={item.Name},Age={item.Age}");
                  }
                }
            }
            Console.WriteLine("Hello, World!");
      }
    }
}</code></pre>
<p>实例运行效果和上面一样,不再赘述。</p>
<p>&nbsp;</p>
<h1>Excel写入</h1>
<p>&nbsp;</p>
<p>MiniExcel支持将对象数据写入到Excel,可以通过MiniExcel提供的SaveAs方法,将对象数据写入Excel,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person2.xlsx");
var persons = new List&lt;Person&gt;();
for (int i = 0; i &lt; 10; i++)
{
    persons.Add(new Person()
    {
      ID = i,
      Name = "A" + i.ToString(),
      Age = 20 + i,
    });
}
MiniExcel.SaveAs(excel, persons);</code></pre>
<p>MiniExcel写入的Excel,默认还自带格式,如下所示:</p>
<p><img src="https://img2024.cnblogs.com/blog/1068941/202504/1068941-20250427001753859-671535541.png"></p>
<p>同时MiniExcel,还支持Stream的读写方式创建Excel,如下所示:</p>
<pre class="language-csharp highlighter-hljs"><code>string excel = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Person3.xlsx");
var persons = new List&lt;Person&gt;();
for (int i = 0; i &lt; 10; i++)
{
    persons.Add(new Person()
    {
      ID = i,
      Name = "A" + i.ToString(),
      Age = 20 + i,
    });
}
using (var stream = File.Create(excel))
{
    stream.SaveAs(persons);
}</code></pre>
<p>实例运行后,导出的Excel效果和上面一样,不再赘述。</p>
<p>&nbsp;</p>
<h1>参考文档</h1>
<p>&nbsp;</p>
<p>本文主要介绍MiniExcel的简单用途,关于更多内容,请参考官方文档:https://gitee.com/dotnetchina/MiniExcel</p>
<p>以上就是《推荐一款Excel读写神器之MiniExcel入门详解》的全部内容,旨在抛砖引玉,一起学习,共同进步。</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">

    <p style="border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 30px; font-family: 微软雅黑; font-size: 12px" id="PSignature">
<br>

   <img alt="" src="https://images.cnblogs.com/cnblogs_com/hsiang/1154298/o_115f1cd8.jpg" width="80px" height="80px">
   
    作者:老码识途
    <br>
    出处:http://www.cnblogs.com/hsiang/
    <br>
    本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
    <br>关注个人公众号,定时同步更新技术及职场文章
<br><br>
   </p>
</div><br><br>
来源:https://www.cnblogs.com/hsiang/p/18848254
頁: [1]
查看完整版本: 推荐一款Excel读写神器之MiniExcel入门详解