Magicodes.IE之導入導出篩選器

總體設計

Magicodes.IE之導入導出篩選器

Magicodes.IE是一個導入導出通用庫,支持Dto導入導出以及動態導出,支持Excel、Word、Pdf、Csv和Html。在本篇教程,筆者將講述如何使用Magicodes.IE的導入導出篩選器。

在開始之前,我們需要先了解Magicodes.IE目前支持的篩選器:

接口說明IImportResultFilter導入結果篩選器,可以修改導入結果包括驗證錯誤信息(比如動態修改錯誤標註)IImportHeaderFilter導入列頭篩選器,可以修改列名、值映射集合等等IExporterHeaderFilter導出列頭篩選器,可以修改列頭、索引、值映射等等

導入結果篩選器(IImportResultFilter)的使用

導入結果篩選器可以修改導入結果包括驗證錯誤信息(比如動態修改錯誤標註),非常適合對導入數據和錯誤驗證內容進行二次動態加工,比如加入自定義校驗邏輯、驗證消息多語言翻譯等等。接下來我們開始實戰:

準備導入文件

如下圖所示,我們準備瞭如下Excel導入文件:

Magicodes.IE之導入導出篩選器

https://github.com/dotnetcore/Magicodes.IE/blob/master/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Errors/%E6%95%B0%E6%8D%AE%E9%94%99%E8%AF%AF.xlsx

準備Dto

Excel準備好了,我們需要準備一個Dto:

<code>[ExcelImporter(ImportResultFilter = typeof(ImportResultFilterTest), IsLabelingError = true)]public class ImportResultFilterDataDto1{/<code><code> /// /<code><code> /// 產品名稱/<code><code> /// /<code><code> [ImporterHeader(Name = "產品名稱")]/<code><code> public string Name { get; set; }/<code>
<code> /// /<code><code> /// 產品代碼/<code><code> /// 長度驗證/<code><code> /// 重複驗證/<code><code> /// /<code><code> [ImporterHeader(Name = "產品代碼", Description = "最大長度為20", AutoTrim = false, IsAllowRepeat = false)]/<code><code> public string Code { get; set; }}/<code>

如上述代碼所示,我們創建了名為“ImportResultFilterDataDto1”的Dto,使用ExcelImporter特性中的ImportResultFilter屬性指定了導入結果篩選器的類型。

創建類並實現接口IImportResultFilter

接下來我們就創建一個類並實現IImportResultFilter接口:

<code>public class ImportResultFilterTest : IImportResultFilter{/<code><code> /// /<code><code> /// 本示例修改數據錯誤驗證結果,可用於多語言等場景/<code><code> /// /<code><code> /// /<code><code> /// /<code><code> /// /<code><code> public ImportResult Filter(ImportResult importResult) where T : class, new/<code><code> {/<code><code> var errorRows = new List/<code><code> {/<code><code> 5,6/<code><code> };/<code><code> var items = importResult.RowErrors.Where(p => errorRows.Contains(p.RowIndex)).ToList;/<code>
<code> for (int i = 0; i < items.Count; i++)/<code><code> {/<code><code> for (int j = 0; j < items[i].FieldErrors.Keys.Count; j++)/<code><code> {/<code><code> var key = items[i].FieldErrors.Keys.ElementAt(j);/<code><code> var value = items[i].FieldErrors[key];/<code><code> items[i].FieldErrors[key] = value?.Replace("存在數據重複,請檢查!所在行:", "Duplicate data exists, please check! Where:");/<code><code> }/<code><code> }/<code><code> return importResult;/<code><code> }}/<code>

如上述代碼所示,我們將重複錯誤的驗證提示修改為了“Duplicate data exists, please check! Where”。接下來,我們需要編寫導入代碼:

編寫導入代碼

<code> public async Task ImportResultFilter_Test/<code><code> {/<code><code> var filePath = Path.Combine(Directory.GetCurrentDirectory, "TestFiles", "Errors", "數據錯誤.xlsx");/<code><code> var labelingFilePath = Path.Combine(Directory.GetCurrentDirectory, $"{nameof(ImportResultFilter_Test)}.xlsx");/<code><code> var result = await Importer.Import(filePath, labelingFilePath);/<code><code> }/<code>

打開上述代碼所示的標註文件路徑,就可以看到驗證提示被我們改成了英文:

Magicodes.IE之導入導出篩選器

導入列頭篩選器(IImportHeaderFilter)的使用

導入列頭篩選器可以修改列名、驗證屬性、值映射集合等等,非常適合動態修改列名、驗證邏輯、值映射等等。和前面的一樣,我們先得準備一個導入文件。

準備導入文件

Magicodes.IE之導入導出篩選器

https://github.com/dotnetcore/Magicodes.IE/blob/master/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/%E5%AF%BC%E5%85%A5%E5%88%97%E5%A4%B4%E7%AD%9B%E9%80%89%E5%99%A8%E6%B5%8B%E8%AF%95.xlsx

準備Dto

<code>/// /// 導入學生數據Dto/// IsLabelingError:是否標註數據錯誤/// [ExcelImporter(IsLabelingError = true, ImportHeaderFilter = typeof(ImportHeaderFilterTest))]public class ImportHeaderFilterDataDto1{/<code><code> /// /<code><code> /// 姓名/<code><code> /// /<code><code> [ImporterHeader(Name = "姓名", Author = "雪雁")]/<code><code> [Required(ErrorMessage = "學生姓名不能為空")]/<code><code> [MaxLength(50, ErrorMessage = "名稱字數超出最大限制,請修改!")]/<code><code> public string Name { get; set; }/<code>
<code> /// /<code><code> /// 性別/<code><code> /// /<code><code> [ImporterHeader(Name = "性別")]/<code><code> [Required(ErrorMessage = "性別不能為空")]/<code><code> public Genders Gender { get; set; }}/<code>

如上述代碼所示,我們通過ImportHeaderFilter屬性指定了列頭篩選器類型。接下來,我們需要完成相關實現:

創建類並實現接口IImportHeaderFilter

<code>/// /// 導入列頭篩選器測試/// 1)測試修改列頭/// 2)測試修改值映射/// public class ImportHeaderFilterTest : IImportHeaderFilter{/<code><code> public List Filter(List importerHeaderInfos)/<code><code> {/<code><code> foreach (var item in importerHeaderInfos)/<code><code> {/<code><code> if (item.PropertyName == "Name")/<code><code> {/<code><code> item.Header.Name = "Student";/<code><code> }/<code><code> else if (item.PropertyName == "Gender")/<code><code> {/<code><code> item.MappingValues = new Dictionary/<code><code> {/<code><code> {"男",0 },/<code><code> {"女",1 }/<code><code> };/<code><code> }/<code><code> }/<code><code> return importerHeaderInfos;/<code><code> }}/<code>

通過上述代碼,我們編寫了一些測試:

  1. 實現了IImportHeaderFilter

  2. 將屬性名稱為“Name”的列的列頭修改為“Student”

  3. 將屬性名稱為“Gender”的列的列映射改為男女映射

接下來我們繼續編寫導入邏輯:

<code> public async Task ImportHeaderFilter_Test/<code><code> {/<code><code> var filePath = Path.Combine(Directory.GetCurrentDirectory, "TestFiles", "Import", "導入列頭篩選器測試.xlsx");/<code><code> var import = await Importer.Import(filePath);/<code><code> }/<code>

如下圖所示,我們成功的將Excel列名為“Student”的列導入到了Dto的Name屬性,同時將男女轉換為了枚舉:

Magicodes.IE之導入導出篩選器

導出列頭篩選器(IExporterHeaderFilter)的使用

導出列頭篩選器可以修改列頭、索引、值映射,非常適合動態修改導出邏輯,比如列頭的中英轉換,值映射動態邏輯等等。接下來我們一起來實戰:

準備Dto並編寫導出代碼

<code>[Exporter(Name = "測試", TableStyle = "Light10", ExporterHeaderFilter = typeof(TestExporterHeaderFilter1))]public class ExporterHeaderFilterTestData1{/<code><code> [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]/<code><code> public string Text { get; set; }/<code>
<code> [ExporterHeader(DisplayName = "普通文本")] public string Text2 { get; set; }/<code>
<code> [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]/<code><code> public string Text3 { get; set; }/<code>
<code> [ExporterHeader(DisplayName = "數值", Format = "#,##0")]/<code><code> public decimal Number { get; set; }/<code>
<code> [ExporterHeader(DisplayName = "名稱", IsAutoFit = true)]/<code><code> public string Name { get; set; }}/<code>

如上述Dto代碼所示,我們通過導出特性Exporter的ExporterHeaderFilter屬性指定了導出列頭篩選器。

實現篩選器IExporterHeaderFilter

<code>public class TestExporterHeaderFilter1 : IExporterHeaderFilter{/<code><code> /// /<code><code> /// 表頭篩選器(修改名稱)/<code><code> /// /<code><code> /// /<code><code> /// /<code><code> public ExporterHeaderInfo Filter(ExporterHeaderInfo exporterHeaderInfo)/<code><code> {/<code><code> if (exporterHeaderInfo.DisplayName.Equals("名稱"))/<code><code> {/<code><code> exporterHeaderInfo.DisplayName = "name";/<code><code> }/<code><code> return exporterHeaderInfo;/<code><code> }}/<code>

如上述代碼所示,我們實現了導出篩選器,並將顯示名為“名稱”的列修改為了“name”。

編寫導出邏輯

<code>//導出IExporter exporter = new ExcelExporter;//使用GenFu生成測試數據var data1 = GenFu.GenFu.ListOf;var result = await exporter.Export(filePath, data1);/<code>

使用上述代碼導出後,我們來驗證導出結果:

Magicodes.IE之導入導出篩選器

是不是So easy呢?當然我們還可以做一些其他的事情,比如修改忽略列:

<code>public class TestExporterHeaderFilter2 : IExporterHeaderFilter{/<code><code> /// /<code><code> /// 表頭篩選器(修改忽略列)/<code><code> /// /<code><code> /// /<code><code> /// /<code><code> public ExporterHeaderInfo Filter(ExporterHeaderInfo exporterHeaderInfo)/<code><code> {/<code><code> if (exporterHeaderInfo.ExporterHeaderAttribute.IsIgnore)/<code><code> {/<code><code> exporterHeaderInfo.ExporterHeaderAttribute.IsIgnore = false;/<code><code> }/<code><code> return exporterHeaderInfo;/<code><code> }}/<code>

如何使用容器注入篩選器

篩選器主要是為了滿足大家能夠在導入導出時支持動態處理,比如值映射等等。但是通過特性指定篩選器的話,那麼如何支持依賴注入呢?不要慌,針對這個場景,我們也有考慮。

在ASP.NET Core的啟動類(StartUp)註冊容器

參考代碼如下:

<code>public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)/<code><code>{/<code><code> AppDependencyResolver.Init(app.ApplicationServices);/<code><code> //添加註入關係/<code><code> services.AddSingleton;/<code><code> services.AddSingleton;/<code><code> services.AddSingleton; /<code><code>}/<code>

然後就盡情使用吧。值得注意的是:

  1. 注入的篩選器類型的優先級高於特性指定的篩選器類型,也就是當兩者並存時,優先會使用注入的篩選器

  2. 注入的篩選器是全局的,當注入多種類型的篩選器時,均會執行,接下來我們還會支持更多細節控制
  3. 如果某個邏輯需要禁用所有篩選器,請參考下面部分

  4. 此功能需要2.4.0-beta2或以上版本才支持

使用IsDisableAllFilter屬性禁用所有的篩選器

如果某段導入導出需要禁用所有的篩選器,我們該如何處理?僅需將IsDisableAllFilter設置為true即可。導入導出特性均已支持。

轉載是一種動力 分享是一種美德

Magicodes.IE之導入導出篩選器

如果喜歡作者的文章,請關注【麥扣聊技術】訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

文檔官網:docs.xin-lai.com

編程交流群<85318032>

產品交流群<897857351>

Magicodes.IE之導入導出篩選器


分享到:


相關文章: