From 791cb58b32fc262cc0a1a23a668f5c45b8a97d41 Mon Sep 17 00:00:00 2001 From: xwHang <18258359477@163.com> Date: Thu, 8 May 2025 17:14:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=AF=E7=A9=BA=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E5=AF=BC=E5=85=A5=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Utility/ImportHelper.cs | 6 ++++ .../ExcelImporter_Tests.cs | 7 ++++ .../Import/NullableEnumTestImportDto.cs | 30 ++++++++++++++++++ .../TestFiles/Import/NullableEnum.xlsx | Bin 0 -> 9889 bytes 4 files changed, 43 insertions(+) create mode 100644 src/Magicodes.ExporterAndImporter.Tests/Models/Import/NullableEnumTestImportDto.cs create mode 100644 src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/NullableEnum.xlsx diff --git a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs index 7a7aebb8..32e8aecd 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs @@ -1251,6 +1251,12 @@ protected virtual void ParseData(ExcelPackage excelPackage) SetValue(cell, dataItem, propertyInfo, value); continue; } + // 如果是可空枚举,选中空白项传入"",处理成null,不然会出现SetValue会报错 + else if (propertyInfo.PropertyType.IsNullable() && propertyInfo.PropertyType.GetNullableUnderlyingType().IsEnum) + { + SetValue(cell,dataItem,propertyInfo,null); + continue; + } } if (propertyInfo.PropertyType.IsEnum diff --git a/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs b/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs index dc7110e7..77b23d55 100644 --- a/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs +++ b/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs @@ -1210,5 +1210,12 @@ public async Task Issue377_Test() import.HasError.ShouldBeFalse(); import.Data.Count.ShouldBe(3); } + [Fact(DisplayName = "可空枚举类型导入测试")] + public async Task NullableEnum_Test() + { + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "NullableEnum.xlsx"); + var import = await Importer.Import(filePath); + import.HasError.ShouldBeFalse(); + } } } \ No newline at end of file diff --git a/src/Magicodes.ExporterAndImporter.Tests/Models/Import/NullableEnumTestImportDto.cs b/src/Magicodes.ExporterAndImporter.Tests/Models/Import/NullableEnumTestImportDto.cs new file mode 100644 index 00000000..8fdf91a2 --- /dev/null +++ b/src/Magicodes.ExporterAndImporter.Tests/Models/Import/NullableEnumTestImportDto.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Magicodes.ExporterAndImporter.Core; + +namespace Magicodes.IE.Tests.Models.Import; +/// +/// 可空枚举问题测试 +/// +public class NullableEnumTestImportDto +{ + /// + /// 编号 + /// + [ImporterHeader(Name = "编号")] + public string No { get; set; } + /// + /// 等级 + /// + [ImporterHeader(Name = "等级")] + public EnumTest? Level { get; set; } +} +public enum EnumTest +{ + A, + B, +} \ No newline at end of file diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/NullableEnum.xlsx b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Import/NullableEnum.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6b9bf95721f8c8d1e5394e4adfc1a7b4a8bbbd6b GIT binary patch literal 9889 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 literal 0 HcmV?d00001