Loading... ``` # MiniExcel ### 简介 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。 ![image](https://oss.hunji.xyz/blogoss/202310/113120478-33d59980-9244-11eb-8675-a49651c8af67.png) ### 特点 - 低内存耗用,避免OOM、频繁 Full GC 情况 - 支持`即时`操作每行数据 - 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询 - 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB - 简便操作的 API 风格 ### 安装 请查看 [NuGet](https://www.nuget.org/packages/MiniExcel) >dotnet add package MiniExcel --version 1.31.0 ### 读/导入 Excel <a name="getstart1"></a> #### 1. Query 查询 Excel 返回`强型别` IEnumerable 数据 [[Try it]](https://dotnetfiddle.net/w5WD1J) ```csharp 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](https://oss.hunji.xyz/blogoss/202310/111107423-c8c46b80-8591-11eb-982f-c97a2dafb379.png) #### 2. Query 查询 Excel 返回`Dynamic` IEnumerable 数据 [[Try it]](https://dotnetfiddle.net/w5WD1J) * Key 系统预设为 `A,B,C,D...Z` | MiniExcel | 1 | | --------- | - | | Github | 2 | ```csharp 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]](https://dotnetfiddle.net/w5WD1J) #### 4. Query 查询支援延迟加载(Deferred Execution),能配合LINQ First/Take/Skip办到低消耗、高效率复杂查询 举例 : 查询第一笔数据 ```csharp 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](https://oss.hunji.xyz/blogoss/202310/111072392-6037a900-8515-11eb-9693-5ce2dad1e460.gif) #### 5. 查询指定 Sheet 名称 #### 6. 查询所有 Sheet 名称跟数据 #### 7. 查询所有栏(列) #### 8. Dynamic Query 转成 `IDictionary<string,object>` 数据 #### 9. Query 读 Excel 返回 DataTable #### 10. 指定单元格开始读取数据 #### 11. 合并的单元格填充 #### 12. 读取大文件硬盘缓存 (Disk-Base Cache - SharedString) ### 写/导出 Excel <a name="getstart2"></a> 1. 必须是非abstract 类别有公开无参数构造函数 2. MiniExcel SaveAs 支援 `IEnumerable参数延迟查询`,除非必要请不要使用 ToList 等方法读取全部数据到内存 图片 : 是否呼叫 ToList 的内存差别 #### ![image](https://oss.hunji.xyz/blogoss/202310/112587389-752b0b00-8e38-11eb-8a52-cfb76c57e5eb.png)1. 支持集合<匿名类别>或是<强型别> [[Try it]](https://dotnetfiddle.net/w5WD1J) ```csharp 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>>` ```csharp 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 - 推荐使用,可以避免载入全部数据到内存 ```csharp MiniExcel.SaveAs(path, reader); ``` ![image](https://oss.hunji.xyz/blogoss/202310/121275378-149a5e80-c8bc-11eb-85fe-5453552134f0.png) 推荐 DataReader 多表格导出方式(建议使用 Dapper ExecuteReader ) ```csharp 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]](https://dotnetfiddle.net/JOen0e) #### 7. 创建多个工作表(Sheet) #### 8. 表格样式选择 #### 9. AutoFilter 筛选 #### 10. 图片生成 #### 11. Byte Array 文件导出 #### 12. 垂直合并相同的单元格 #### 13. 是否写入 null values cell ## 项目地址 文档地址:https://github.com/mini-software/MiniExcel #### 推荐阅读 - [开源项目MiniWord .NET Word-Word操作](https://mp.weixin.qq.com/s/-_aVbQjFft63EwLkJdzuEQ) - [博客系统必备-Moonglade Blog](https://mp.weixin.qq.com/s/wfcYZLPok8VnTK4fwDMp_A) - [C#编写的一款电子桌面宠物-Candy](https://mp.weixin.qq.com/s/51djCV3_u7qIqDuomA8_qw) - [ShellProgressBar控制台中漂亮的显示进度条](https://mp.weixin.qq.com/s/dY-4svHo5yJ03EDs0ZWGtg) - [控制台必备神器-AnsiConsole](https://mp.weixin.qq.com/s/FBDJKIOVR6swXBAYUwd7cg) 欢迎关注我的公众号“**Net分享**”,技术文章第一时间推送,随缘更新 , 分享一些你可能注意不到的细节。 <center> <img src="https://oss.hunji.xyz/blogoss/202310/1920368-20221018151428175-1348767064.jpg" style="width: 140px;"> </center> ``` ``` 最后修改:2023 年 10 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏