MiniExcel
简介
MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。
目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。
特点
- 低内存耗用,避免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]
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>();
2. Query 查询 Excel 返回Dynamic IEnumerable 数据 [Try it]
- Key 系统预设为
A,B,C,D...Z
| MiniExcel | 1 |
|---|---|
| Github | 2 |
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办到低消耗、高效率复杂查询
举例 : 查询第一笔数据
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);
}
与其他框架效率比较 :
5. 查询指定 Sheet 名称
6. 查询所有 Sheet 名称跟数据
7. 查询所有栏(列)
8. Dynamic Query 转成 IDictionary<string,object> 数据
9. Query 读 Excel 返回 DataTable
10. 指定单元格开始读取数据
11. 合并的单元格填充
12. 读取大文件硬盘缓存 (Disk-Base Cache - SharedString)
写/导出 Excel
- 必须是非abstract 类别有公开无参数构造函数
- MiniExcel SaveAs 支援
IEnumerable参数延迟查询,除非必要请不要使用 ToList 等方法读取全部数据到内存
图片 : 是否呼叫 ToList 的内存差别
1. 支持集合<匿名类别>或是<强型别> [Try it]
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>>
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
- 推荐使用,可以避免载入全部数据到内存
MiniExcel.SaveAs(path, reader);
推荐 DataReader 多表格导出方式(建议使用 Dapper ExecuteReader )
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
项目地址
推荐阅读
- 开源项目MiniWord .NET Word-Word操作
- 博客系统必备-Moonglade Blog
- C#编写的一款电子桌面宠物-Candy
- ShellProgressBar控制台中漂亮的显示进度条
- 控制台必备神器-AnsiConsole
欢迎关注我的公众号“Net分享”,技术文章第一时间推送,随缘更新 , 分享一些你可能注意不到的细节。