首先列举一下几种操作Excel的方法
Open XML SDK
微软官方的组件,偏向底层,仅支持.xlsx,开源组件。
Microsoft.Office.Interop.Excel(com)
需要安装office软件才可以使用(不推荐使用)。
NPOI
老牌组件,功能强大,就是相对来说慢一点,大数据量可能导致内存溢出,需要第三方依赖,全格式支持,开源组件。
Epplus
相对于NPOI而言有个更强的处理能力,(NPOI:4-5万行内存溢出,epplus:20-23万行内存溢出),但是不支持.xls格式的Excel表,只能处理.xlsx格式,开源组件。
Spire
商业化组件,没啥好说的全部拉满。
Aspose
商业化组件,没啥好说的全部拉满。
MiniExcel
简介
目前大多数流行的框架需要将所有数据加载到内存中以方便操作,但这会导致内存消耗问题。MiniExcel尝试使用stream中的算法将原来的1000 MB占用减少到几MB,以避免OOM(内存不足),全格式支持,开源组件。
特征
- 低内存消耗,避免 OOM(内存不足)和完整 GC
- 支持每行数据的操作
real-time
- 支持LINQ延时执行,可以做低消耗、快分页等复杂查询
- 轻量级,未安装Microsoft Office,无COM+,DLL大小小于150KB
- 简单的 API 样式来读/写/填充 excel
官网
技术
MiniExcel、C#、Dapper、SqlServer
官网实现
注1:使用同一列的第一个IEnumerable作为填写列表的基础
法典:
//1. By POCO
var value = new
{
employees = new[] {
new {name="Jack",department="HR"},
new {name="Lisa",department="HR"},
new {name="John",department="HR"},
new {name="Mike",department="IT"},
new {name="Neo",department="IT"},
new {name="Loan",department="IT"}
}
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);
//2. By Dictionary
var value = new Dictionary<string, object>()
{
["employees"] = new[] {
new {name="Jack",department="HR"},
new {name="Lisa",department="HR"},
new {name="John",department="HR"},
new {name="Mike",department="IT"},
new {name="Neo",department="IT"},
new {name="Loan",department="IT"}
}
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);
个人实例
模板
实体类(model)
public class people
{
public string name{ get; set; }
public string sex { get; set; }
public string age { get; set; }
}
public class subject
{
public string name{ get; set; }
public string grade { get; set; }
public string gpa { get; set; }
}
查询数据,并插入数据
using (var dbConnection = new SqlConnection(dbConnectionStr))
{
dbConnection.Open();
string sql1 = $@" select * from people ";
string sql2 = $@" select * from subject ";
var people = dbConnection.Query<people>(sql1).ToList();
var subject = dbConnection.Query<subject>(sql2).ToList();
var value = new
{
people = people,
subject = subject
};
MiniExcel.SaveAsByTemplate("保存路径", "模板路径", value);
}