MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。
环境:.NET6.0
NuGet: https://www.nuget.org/packages/MiniExcel/
Gitee: https://gitee.com/dotnetchina/MiniExcel
读取Excel
Asp.Net Core
示例一:通过接口上传文件的方式 POST请求方式以body中的form-data为参数
- 常用的文件导入接口,导入接口示例:
/// <summary>
/// 导入信息
/// </summary>
/// <param name="file"></param>
[HttpPost("/ImportExcel")]
public void ImportExcel(IFormFile file)
{
}
- 需要导入的Excel文件内容格式:
- 导入要求,忽略【编号】列,只读取【姓名】【年龄】【电话】【出生年月】四列数据
- 准备一个Excel数据对应的实体类,在属性上面加入特性【ExcelColumnIndex】如下:
public class UserInfo
{
/// <summary>
/// 姓名
/// </summary>
[ExcelColumnIndex("B")]
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
[ExcelColumnIndex("C")]
public string Age { get; set; }
/// <summary>
/// 电话
/// </summary>
[ExcelColumnIndex("D")]
public string Tel { get; set; }
/// <summary>
/// 出生年月
/// </summary>
[ExcelColumnIndex("E")]
public string Birth { get; set; }
}
- 在第一步的方法体内加入代码:
// 读取file文件流
using var fileStream = file.OpenReadStream();
// 读取fileStream数据为强类型的IEnumerable<UserInfo>;参数:startCell(起始单元格): 要读取起始位置,但不包含起始位置
var excelData = fileStream.Query<UserInfo>(startCell:"B1");
// 将IEnumerable<UserInfo>转为List<UserInfo>集合
var excelDataList = excelData.ToList();
- 运行代码测试:
- 获取到集合后就可以继续进行其他的业务逻辑了,如更新,新增等.....
- 工具,加入一个扩展方式直接读取为List集合数据,可以根据常用经验自行修改扩展方法
public static class Tools
{
/// <summary>
/// 将文件转换为List
/// </summary>
/// <param name="file">body IFormFile参数</param>
/// <param name="startCell">从第几行开始读取(默认为:A1)</param>
/// <typeparam name="T">所属行的实体类加入特性[ExcelColumnIndex("A")] 表示读取A列</typeparam>
/// <returns>泛型集合</returns>
public static List<T> File2List<T>(this IFormFile file,string startCell = "A1") where T : class, new()
{
using var fileData = file.OpenReadStream();
var excelData = fileData.Query<T>(startCell:startCell);
var excelDataList = excelData.ToList();
return excelDataList;
}
}
- 使用扩展方法读取数据:
/// <summary>
/// 导入信息
/// </summary>
/// <param name="file"></param>
[HttpPost("/ImportExcel")]
public void ImportExcel(IFormFile file)
{
// 方式一:
// 读取file文件流
using var fileStream = file.OpenReadStream();
// 读取fileStream数据为强类型的IEnumerable<UserInfo>;
// 参数:startCell(起始单元格): 要读取起始位置,但不包含起始位置;
var excelData = fileStream.Query<UserInfo>(startCell:"B1");
// 将IEnumerable<UserInfo>转为List<UserInfo>集合
var userList1 = excelData.ToList();
// 方式二:
// 调用扩展方法
var userList2 = file.File2List<UserInfo>("B1");
}
导出Excel
Asp.Net Core
示例二:导出Excel数据,通接口请求获取要导出数据的文件流,并下载保存
- 文件导出下载接口,导出示例:
/// <summary>
/// 导出信息
/// </summary>
/// <returns></returns>
[HttpPost("/ExportExcel")]
public IActionResult ExportExcel()
{
}
- 需要导出的Excel文件内容格式:
- 准备导出的信息实体
public class ExportUserInfo
{
/// <summary>
/// 姓名
/// </summary>
[ExcelColumn(Name = "姓名",Index = 0),ExcelColumnWidth(23)]
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
[ExcelColumn(Name = "年龄",Index = 1),ExcelColumnWidth(23)]
public string Age { get; set; }
/// <summary>
/// 电话
/// </summary>
[ExcelColumn(Name = "电话",Index = 2),ExcelColumnWidth(23)]
public string Tel { get; set; }
/// <summary>
/// 出生年月
/// </summary>
[ExcelColumn(Name = "出生年月",Index = 3),ExcelColumnWidth(23)]
public string Birth { get; set; }
}
- 查询并创建导出实体的集合数据,可以直接通过SqlSugarORM进行数据查询如:
var data = ISqlSugarClient.Queryable<UserInfo>
.Where(user => user.IsDel == false)
.Select<ExportUserInfo>
.ToList();
- 创建文件流并返回
var memoryStream = new MemoryStream();
memoryStream.SaveAs(data,sheetName:"导出信息");
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = $"导出信息{DateTime.Now.Date:yyyy-MM-dd}.xlsx"
};
- 完整导出示例:
/// <summary>
/// 导出信息
/// </summary>
/// <returns></returns>
[HttpPost("/ExportExcel")]
public IActionResult ExportExcel()
{
var data = ISqlSugarClient.Queryable<UserInfo>
.Where(user => user.IsDel == false)
.Select<ExportUserInfo>
.ToList();
var memoryStream = new MemoryStream();
memoryStream.SaveAs(data,sheetName:"导出信息");
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = $"导出信息{DateTime.Now.Date:yyyy-MM-dd}.xlsx"
};
}
- 导出Excel表格示例: