首页 > 编程语言 >浅谈C#库之MiniExcel

浅谈C#库之MiniExcel

时间:2024-12-12 08:58:42浏览次数:12  
标签:浅谈 MiniExcel C# 查询 new var path Query

一、MiniExcel的介绍

       ‌ 是一个简单、高效的.NET库,专门用于处理Excel文件的读写和模板填充操作,旨在避免内存溢出(OOM)问题。它通过使用流(Stream)的方式进行底层算法设计,能够显著减少内存占用,通常可以将原本需要1000多MB的内存占用降低到几MB,从而有效避免内存不足的情况‌。

二、MiniExcel的特点

  • 低内存消耗,避免OOM和完整的GC。
  • 支持对每行数据进行实时操作。
  • 支持LINQ延迟执行,可以实现低消耗、快速分页等复杂查询。
  • 轻量级,无需安装Microsoft Office,无COM+,DLL大小小于150KB。
  • 易于使用的API风格,用于读写填充Excel。

三、MiniExcel的安装使用

安装

你可以通过NuGet安装MiniExcel包。

导入/查询Excel
  • Query查询Excel:返回强类型的IEnumerable数据。
public class UserAccount
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public DateTime BoD { get; set; }
    public int Age { get; set; }
    public bool VIP { get; set; }
    public decimal Points { get; set; }
}
var rows = MiniExcel.Query<UserAccount>(path);

支持延迟加载:可以配合LINQ进行低消耗、高效率的复杂查询。

var row = MiniExcel.Query(path).First();

导出/创建Excel
  • 支持集合<匿名类别>或是<强型别>
MiniExcel.SaveAs(path, new[] {
    new { Column1 = "MiniExcel", Column2 = 1 },
    new { Column1 = "Github", Column2 = 2}
});

IDataReader:推荐使用,可以避免载入全部数据到内存。

MiniExcel.SaveAs(path, reader);

支持Stream:生成文件不落地。

using (var stream = new MemoryStream()) {
    stream.SaveAs(values);
}

创建多个工作表(Sheet)
var users = new[] { new { Name = "Jack", Age = 25 }, new { Name = "Mike", Age = 44 } };
var department = new[] { new { ID = "01", Name = "HR" }, new { ID = "02", Name = "IT" } };
var sheets = new Dictionary<string, object>
{
    ["users"] = users,
    ["department"] = department
};
MiniExcel.SaveAs(path, sheets);
模板填充Excel
  • 基本填充
var value = new
{
    Name = "Jack",
    CreateDate = new DateTime(2021, 01, 01),
    VIP = true,
    Points = 123
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);

四、MiniExcel库的详细用法

1. 查询数据以第一行数据当Key

你可以使用useHeaderRow: true参数,使得第一行数据作为键值。例如:

var rows = MiniExcel.Query(useHeaderRow: true).ToList();

这样,rows中的每个元素都将是一个字典,键为列名,值为对应的数据。

2. Query查询支持延迟加载(Deferred Execution)

MiniExcel支持LINQ的延迟加载,可以配合LINQ的FirstTakeSkip等方法实现低消耗、高效率的复杂查询。例如,查询第一笔数据:

var row = MiniExcel.Query(path).First();

或者使用流:

using (var stream = File.OpenRead(path))
{
    var row = stream.Query().First();
}

3. 查询指定Sheet名称

可以指定查询特定的Sheet:

MiniExcel.Query(path, sheetName: "SheetName");

或者使用流:

stream.Query(sheetName: "SheetName");

4. 查询所有Sheet名称和数据

可以获取所有Sheet的名称和数据:

var sheetNames = MiniExcel.GetSheetNames(path);
foreach (var sheetName in sheetNames)
{
    var rows = MiniExcel.Query(path, sheetName: sheetName);
}

5. 查询所有列

可以获取所有列的名称:

var columns = MiniExcel.GetColumns(path); // e.g result : ["A","B"...]

或者使用useHeaderRow: true获取实际的列名称:

var columns = MiniExcel.GetColumns(path, useHeaderRow: true);

6. Dynamic Query转换成IDictionary<string,object>数据

可以将查询结果转换为字典形式:

foreach(IDictionary<string,object> row in MiniExcel.Query(path))
{
    //..
}

或者使用LINQ:

var rows = MiniExcel.Query(path).Cast<IDictionary<string,object>>();

7. 指定单元格开始读取数据

可以指定从某个单元格开始读取数据:

MiniExcel.Query(path, useHeaderRow: true, startCell: "B3");

8. 合并的单元格填充

MiniExcel支持合并单元格的填充,但效率相对较低:

// 具体用法请参考MiniExcel官方文档

9. 多工作表(Sheet)操作

可以创建包含多个工作表的Excel文件:

var sheets = new Dictionary<string, object>
{
    ["users"] = users,
    ["department"] = department
};
MiniExcel.SaveAs(path, sheets);

10. AutoFilter筛选

MiniExcel支持AutoFilter筛选功能,具体用法请参考官方文档。

11. 流式导出Excel

支持流式导出,生成文件不落地:

using (var stream = new MemoryStream())
{
    stream.SaveAs(values);
}

12. 垂直合并相同的单元格

MiniExcel支持垂直合并相同的单元格,具体用法请参考官方文档。

13. 是否写入null值单元格

MiniExcel允许配置是否写入null值的单元格,具体配置方法请参考官方文档。

以上是MiniExcel的一些高级用法,更多详细用法和配置选项,可以参考MiniExcel的官方文档和GitHub页面。

标签:浅谈,MiniExcel,C#,查询,new,var,path,Query
From: https://blog.csdn.net/a876106354/article/details/144415461

相关文章

  • 浅谈C#库之Memcached
    一、Memcached的介绍        ‌Memcached‌是一个开源的分布式内存缓存系统,由LiveJournal的BradFitzpatrick开发,主要用于动态Web应用以减少数据库负载,提高访问速度和性能。Memcached通过将数据存储在内存中,使用高效的哈希算法进行数据存取,提供极高的读写性能‌。基......
  • ADCS8182替代AD7608,真双极性同步采样8ch、18bit模数转换芯片
    ADCS8182采用5V单电源供电,可以处理±10V和±5V真双极性输入信号,同时所有通道均能以高达200kSPS的吞吐速率采样。输入箝位保护电路可以耐受最高达±16.5V的电压。无论以何种采样频率工作,ADCS8182的模拟输入阻抗均为1MΩ。它采用单电源工作方式,具有片内滤波和高输入阻抗,因此......
  • autofac 通过类方式完成aop扩展
    usingAutofac;usingAutofac.Extras.DynamicProxy;namespaceautofac通过类的方式扩展aop;classProgram{    staticvoidMain(string[]args)    {        //创建一个容器        ContainerBuilderbuilder=newContainerBuilder();   ......
  • 在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTet
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • ### 使用C语言优化解决八皇后问题
    八皇后问题是一道经典的算法问题,它要求在8×8的棋盘上放置8个皇后,使得任何两个皇后都不能互相攻击。本文通过改进传统回溯算法的实现,采用占用标记数组优化冲突检测,从而提升算法效率。####八皇后问题的规则在八皇后问题中,每个皇后必须满足以下规则:1.不能位于同一行。2.不......
  • ### 最大化相邻字符ASCII码之差的最小值:C语言实现与详解
    在字符串处理问题中,如何调整字符的排列以最大化相邻字符ASCII码之差的最小值是一个有趣的挑战。本文将通过一个具体的C语言实现,带你了解这一问题的解决思路和代码细节。####问题描述给定一个字符串,通过调整其字符顺序,使得字符串中任意相邻字符ASCII码之差的最小值最大。###......
  • prometheus基于consul自动发现
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.prometheus&consul部署2.展示本文主要将prometheus和consul结合起来使用,通过conusl注册服务至prometheus,实现服务统一注册,统一报警管理等。整个架构思路consul+prometheus+alertmanage......
  • 图片底部空白缝隙解决法方案(CSS)
    当我想实现一个垂直轮播图时,图片底部会出现一个空白缝隙导致切换轮播图片显示不完整。这里可以用两个方法解决一、给图片添加(垂直对齐)vertical-align:baseline|middle|top;vertical-align属性的值可以是(1)关键字值:baseline|middle|top|bottom|sub|text-top|text-bottom;......
  • C语言编程1.24螺旋方阵
    题目描述本题要求从右下角开始按螺旋型递减打印数字方阵。输入格式输入为一个正整数n(1=<n<=20)。输出格式螺旋型递减顺序输出n行n列的数字方阵,每个数字占4个宽度,左对齐。输入样例复制在这里给出一组输入。例如:4输出样例复制在这里给出相应的输出。例如:1098......
  • c语言编程1.23报数
    题目描述输入两个正整数n和m((1<m<n<=50)),有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数m的人退出圈子,下一个人从1开始重新报数,报数m的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。提示:将......