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

MiniExcel

环境:.NET6.0

NuGet: https://www.nuget.org/packages/MiniExcel/

Gitee: https://gitee.com/dotnetchina/MiniExcel

读取Excel

Asp.Net Core

示例一:通过接口上传文件的方式 POST请求方式以body中的form-data为参数

  1. 常用的文件导入接口,导入接口示例:
/// <summary>
/// 导入信息
/// </summary>
/// <param name="file"></param>
[HttpPost("/ImportExcel")]
public void ImportExcel(IFormFile file)
{
    
}
  1. 需要导入的Excel文件内容格式:

ImportExcel

  1. 导入要求,忽略【编号】列,只读取【姓名】【年龄】【电话】【出生年月】四列数据
  2. 准备一个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; }
}
  1. 在第一步的方法体内加入代码:
// 读取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();

startCell

  1. 运行代码测试:

ExcelData

  1. 获取到集合后就可以继续进行其他的业务逻辑了,如更新,新增等.....
  2. 工具,加入一个扩展方式直接读取为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;
    }
}
  1. 使用扩展方法读取数据:
/// <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数据,通接口请求获取要导出数据的文件流,并下载保存

  1. 文件导出下载接口,导出示例:
/// <summary>
/// 导出信息
/// </summary>
/// <returns></returns>
[HttpPost("/ExportExcel")]
public IActionResult ExportExcel()
{

}
  1. 需要导出的Excel文件内容格式:

ExportExcel

  1. 准备导出的信息实体
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; }
}
  1. 查询并创建导出实体的集合数据,可以直接通过SqlSugarORM进行数据查询如:
var data = ISqlSugarClient.Queryable<UserInfo>
            .Where(user => user.IsDel == false)
            .Select<ExportUserInfo>
            .ToList();
  1. 创建文件流并返回
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"
};
  1. 完整导出示例:
/// <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"
    };
}
  1. 导出Excel表格示例:

ExportExcelShow

方法内支持异步。

最后修改:2023 年 07 月 26 日
如果觉得我的文章对你有用,请随意赞赏