前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源项目MiniExcel-简单、高效避免OOM的.NET处理Excel查、写、填充数据工具

开源项目MiniExcel-简单、高效避免OOM的.NET处理Excel查、写、填充数据工具

原创
作者头像
用户2734763
发布2023-07-26 14:37:14
6660
发布2023-07-26 14:37:14
举报
文章被收录于专栏:Net分享Net分享

MiniExcel

简介

MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。

目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。

图片
图片

image

特点

  • • 低内存耗用,避免OOM、频繁 Full GC 情况
  • • 支持即时操作每行数据
  • • 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询
  • • 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB
  • • 简便操作的 API 风格

安装

请查看 NuGet

dotnet add package MiniExcel --version 1.31.0

读/导入 Excel

1. Query 查询 Excel 返回强型别 IEnumerable 数据 [Try it]
代码语言:javascript
复制
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);

// or

using (var stream = File.OpenRead(path))
    var rows = stream.Query<UserAccount>();
图片
图片

image

2. Query 查询 Excel 返回Dynamic IEnumerable 数据 [Try it]
  • • Key 系统预设为 A,B,C,D...Z

MiniExcel

1

Github

2

代码语言:javascript
复制
var rows = MiniExcel.Query(path).ToList();

// or 
using (var stream = File.OpenRead(path))
{
    var rows = stream.Query().ToList();
                
    Assert.Equal("MiniExcel", rows[0].A);
    Assert.Equal(1, rows[0].B);
    Assert.Equal("Github", rows[1].A);
    Assert.Equal(2, rows[1].B);
}
3. 查询数据以第一行数据当Key [Try it]
4. Query 查询支援延迟加载(Deferred Execution),能配合LINQ First/Take/Skip办到低消耗、高效率复杂查询

举例 : 查询第一笔数据

代码语言:javascript
复制
var row = MiniExcel.Query(path).First();
Assert.Equal("HelloWorld", row.A);

// or

using (var stream = File.OpenRead(path))
{
    var row = stream.Query().First();
    Assert.Equal("HelloWorld", row.A);
}

与其他框架效率比较 :

图片
图片

queryfirst

5. 查询指定 Sheet 名称
6. 查询所有 Sheet 名称跟数据
7. 查询所有栏(列)
8. Dynamic Query 转成 IDictionary<string,object> 数据
9. Query 读 Excel 返回 DataTable
10. 指定单元格开始读取数据
11. 合并的单元格填充
12. 读取大文件硬盘缓存 (Disk-Base Cache - SharedString)

写/导出 Excel

  1. 1. 必须是非abstract 类别有公开无参数构造函数
  2. 2. MiniExcel SaveAs 支援 IEnumerable参数延迟查询,除非必要请不要使用 ToList 等方法读取全部数据到内存

图片 : 是否呼叫 ToList 的内存差别

图片
图片

image1. 支持集合<匿名类别>或是<强型别> [Try it]

代码语言:javascript
复制
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
MiniExcel.SaveAs(path, new[] {
    new { Column1 = "MiniExcel", Column2 = 1 },
    new { Column1 = "Github", Column2 = 2}
});
2. IEnumerable<IDictionary<string, object>>
代码语言:javascript
复制
var values = new List<Dictionary<string, object>>()
{
    new Dictionary<string,object>{{ "Column1", "MiniExcel" }, { "Column2", 1 } },
    new Dictionary<string,object>{{ "Column1", "Github" }, { "Column2", 2 } }
};
MiniExcel.SaveAs(path, values);

output :

Column1

Column2

MiniExcel

1

Github

2

3. IDataReader
  • • 推荐使用,可以避免载入全部数据到内存
代码语言:javascript
复制
MiniExcel.SaveAs(path, reader);
图片
图片

image

推荐 DataReader 多表格导出方式(建议使用 Dapper ExecuteReader )

代码语言:javascript
复制
using (var cnn = Connection)
{
    cnn.Open();
    var sheets = new Dictionary<string,object>();
    sheets.Add("sheet1", cnn.ExecuteReader("select 1 id"));
    sheets.Add("sheet2", cnn.ExecuteReader("select 2 id"));
    MiniExcel.SaveAs("Demo.xlsx", sheets);
}
4. Datatable
5. Dapper Query
6. SaveAs 支持 Stream,生成文件不落地 [Try it]
7. 创建多个工作表(Sheet)
8. 表格样式选择
9. AutoFilter 筛选
10. 图片生成
11. Byte Array 文件导出
12. 垂直合并相同的单元格
13. 是否写入 null values cell

项目地址

文档地址:https://github.com/mini-software/MiniExcel

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MiniExcel
    • 简介
      • 特点
        • 安装
          • 读/导入 Excel
            • 写/导出 Excel
              • 项目地址
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档