.net core excel 導入導出 - EasyExcel


 

  .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
        }
    }

 

說明

  • 表頭:表頭名稱對應 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"
          };
      }

 

說明

  • 表頭:表頭名稱對應 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 ,設置在屬性上【導入、導出】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM