.net core 中 excel 导入、导出

 

Rong.EasyExcel

支持 .net core 2.0 以上

当前已集成 NPOI,EpPlus

导入:单/多个sheet导入、 DataAnnotations 数据验证、默认值、字段忽略、公式计算、合并单元格取值、指定行区间导入等。

导出:支持 样式、字体、列宽、行高、列合并、行合并、列统计、数据格式化 、指定表头导出 等设置。

1.添加引用:

//Package Manager
Install-Package Rong.EasyExcel -Version 1.0.1
//.NET CLI
dotnet add package Rong.EasyExcel --version 1.0.1
//或搜索 Nuget 包:Rong.EasyExcel

 

2.添加服务:

在 Startup.cs 中 添加服务(选其一即可,多个则取最后一个)

//使用 Npoi 

services.AddNpoiExcel();

//或使用 EpPlus 

services.AddEpPlusExcel();

 

3.导入

excel 中的表头行的名称必须与Display特性的name或属性名称对应,导入类中的所有 “未被忽略(不带IgnoreColumn特性)”的属性在表头中必须存在

//导入类
    public class ImportTest
    {
        [Display(Name = "姓名")]
        [Required(ErrorMessage = "{0}不能为空")]
        [StringLength(4, ErrorMessage = "{0}最大长度为{1}")]
        public virtual string Name { get; set; }

        [Display(Name = "手机号")]
        [RegularExpression(@"^1[3456789]\d{9}$", ErrorMessage = "{0}格式错误")]
        public virtual string Phone { get; set; }

        [Display(Name = "年龄")]
        [Required(ErrorMessage = "{0}不能为空")]
        [Range(10, 100, ErrorMessage = "{0}区间为{1}~{2}")]
        public virtual int Age { get; set; }

        [Display(Name = "成绩")]
        [Range(0, 150, ErrorMessage = "{0}区间为{1}~{2}")]
        public virtual decimal? Score { get; set; }

        [Display(Name = "日期")]
        [DefaultValue(typeof(DateTime), "2020-9-9")]
        public virtual DateTime Date { get; set; }

        [Display(Name = "学历")]
        [EnumDataType(typeof(TestEnum), ErrorMessage = "{0}值不存在")]
        public virtual TestEnum? Edu { get; set; }

        public virtual string NoDisplayName { get; set; }

        [IgnoreColumn]
        public virtual string IgnoreName { get; set; }
    }

    //导入方法
    public async Task Import(Stream stream)
    {
       try
        {
            var data = await _excelImportManager.ImportAsync<ImportTest>(stream, opt =>
            {
               // opt.SheetIndex = 0;
               // opt.ValidateMode = ExcelValidateModeEnum.ThrowRow;//可设置异常处理模式
            });

            //检查错误并抛出异常
            data.CheckError();

            //获取有效数据
            var valid = data.GetValidData();

            //获取无效数据
            var invalid = data.GetInvalidData();

            //获取全部数据
            var all = data.GetAllData();

            //获取错误信息,若无错误则返回null
            var error = data.GetErrorMessage();
        }
        catch (Exception e)
        { 
            //返回错误信息: e.Message
        }
    }

 

net core 生成eml格式的附件 .net core excel导入_字段

说明

  • 表头:表头名称对应 System.ComponentModel.DataAnnotations 下的 Display 特性的 Name ,若不存在 Display 特性 ,则使用 TImportDto 属性名称作为表头
  • 验证:字段验证可使用 System.ComponentModel.DataAnnotations 的所有特性,如 Required,StringLength,Range,RegularExpression,EnumDataType等
  • 默认值:若某字段为空但是需要设置默认值时,可使用 DefaultValue 特性,如 [DefaultValue(typeof(DateTime), "2020-9-9")]
  • 忽略字段:可使用 IgnoreColumn 特性来忽略导入的 TImportDto 的属性字段,添加该特性的属性字段不会被单元格赋值和验证
  • 配置:_excelImportManager.Import 的第二个参数 ExcelImportOptions 可进行配置

4.导出

//导出类
    public class ExportTest
    {
        [Display(Name = "姓名")]
        public virtual string Name { get; set; }

        [Display(Name = "生日")]
        [DataStyle(DataFormat = "yyyy\"年\"m\"月\"d\"日\";@")]
        public virtual DateTime? Date { get; set; }

        [Display(Name = "成绩")]
        [DataStyle(DataFormat = "#,##0.00_ ")]
        [ColumnStats((int)FunctionEnum.Sum)]
        [DefaultValue(typeof(decimal), "0")]
        public virtual decimal? Score { get; set; }

        [Display(Name = "是否及格")]
        public virtual bool IsPass => Score > 3000;

        [Display(Name = "学历")]
        [IgnoreColumn]
        public virtual TestEnum? Edu { get; set; }

        [IgnoreColumn]
        public virtual string IgnoreName{ get; set; }
    }

    //导出方法
    public async Task<byte[]> Export(List<ExportTest> list)
    { 
        try
        {
           var bytes = await _excelExportManager.ExportAsync<ExportTest>(list, opt =>
            {
                //opt.ExcelType = ExcelTypeEnum.Xlsx;
                //opt.SheetName = "sheet名称";
            });

            return bytes;
        }
        catch (Exception e)
        { 
            //返回错误信息: e.Message
        }
    }

     // 获取excel文件
     private FileStreamResult GetExcel(byte[] buffer)
      {
          string xlsMime = "application/vnd.ms-excel";
          string xlsxMime = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

          Stream stream = new MemoryStream(buffer);
          stream.Seek(0, SeekOrigin.Begin);

          return new FileStreamResult(stream, xlsxMime)
          {
              FileDownloadName = "导出的Excel.xlsx"
          };
      }

 

net core 生成eml格式的附件 .net core excel导入_字段

说明

  • 表头:表头名称对应 System.ComponentModel.DataAnnotations 下的 Display 特性的 Name ,若不存在 Display 特性 ,则使用 TImportDto 属性名称作为表头
  • 默认值:若某字段为空但是需要设置默认值时,可使用 DefaultValue 特性,如 [DefaultValue(typeof(DateTime), "2020-9-9")]
  • 忽略字段:可使用 IgnoreColumn 特性来忽略导出的 TExportDto 的属性字段,添加该特性的属性字段不会被导出
  • 配置:_excelExportManager.Export 的第二个参数 ExcelExportOptions 可进行配置
  • 指定表头和顺序:可使用第三个参数指定筛选只需要导出的字段,不指定则按 TExportDto 字段顺序导出全部,指定则按数组顺序导出【导出的表头字段可通过_excelExportManager.GetExportHeader<ExportTest>()方法获取】

4.特性

  • 表头样式:HeaderStyle (有列宽),设置在类或属性上【导出】
  • 表头字体:HeaderFont,设置在类或属性上【导出】
  • 数据样式:DataStyle ,设置在类或属性上【导出】
  • 数据字体:DataFont ,设置在类或属性上【导出】
  • 行高:RowHeight ,设置在类上【导出】
  • 行合并:MergeRow ,设置在属性上;【导出】
  • 列合并:MergeColumn(nameof(属性1),nameof(属性2),……) ,设置在类上,可多个【导出】
  • 列统计:ColumnStats((short)FunctionEnum.Min) ,设置在属性上,可多个【导出】
  • 忽略列:IgnoreColumn ,设置在属性上【导入、导出】