1- using Magicodes . ExporterAndImporter . Core ;
1+ using DocumentFormat . OpenXml . Bibliography ;
2+ using Magicodes . ExporterAndImporter . Core ;
23using Magicodes . ExporterAndImporter . Core . Extension ;
34using Magicodes . ExporterAndImporter . Core . Models ;
45using Magicodes . ExporterAndImporter . Excel ;
56using Magicodes . ExporterAndImporter . Tests . Models . Import ;
7+ using Magicodes . IE . Tests . Models . Import ;
68using Newtonsoft . Json ;
79using OfficeOpenXml ;
810using Shouldly ;
1618
1719namespace Magicodes . ExporterAndImporter . Tests
1820{
19- /// <summary>
20- /// 导入学生数据Dto
21- /// IsLabelingError:是否标注数据错误
22- /// </summary>
23- [ ExcelImporter ( IsLabelingError = true , IsOnlyErrorRows = true , HeaderRowIndex = 2 ) ]
24- public class ImportWithOnlyError
25- {
26-
27- /// <summary>
28- /// 序号
29- /// </summary>
30- [ ImporterHeader ( Name = "序号" ) ]
31- public long SerialNumber { get ; set ; }
32-
33- /// <summary>
34- /// 学籍号
35- /// </summary>
36- [ ImporterHeader ( Name = "学籍号" , IsAllowRepeat = false ) ]
37- [ MaxLength ( 30 , ErrorMessage = "学籍号字数超出最大限制,请修改!" ) ]
38- public string StudentCode { get ; set ; }
39-
40- /// <summary>
41- /// 姓名
42- /// </summary>
43- [ ImporterHeader ( Name = "姓名" ) ]
44- [ Required ( ErrorMessage = "学生姓名不能为空" ) ]
45- [ MaxLength ( 50 , ErrorMessage = "名称字数超出最大限制,请修改!" ) ]
46- public string Name { get ; set ; }
47-
48- /// <summary>
49- /// 身份证号码
50- /// </summary>
51- [ ImporterHeader ( Name = "身份证号" , IsAllowRepeat = false ) ]
52- [ Required ( ErrorMessage = "身份证号不能为空" ) ]
53- [ MaxLength ( 18 , ErrorMessage = "身份证字数超出最大限制,请修改!" ) ]
54- public string IdCard { get ; set ; }
55-
56- /// <summary>
57- /// 性别
58- /// </summary>
59- [ ImporterHeader ( Name = "性别" ) ]
60- [ Required ( ErrorMessage = "性别不能为空" ) ]
61- [ ValueMapping ( "男" , 0 ) ]
62- [ ValueMapping ( "女" , 1 ) ]
63- public Genders Gender { get ; set ; }
64-
65- /// <summary>
66- /// 家庭地址
67- /// </summary>
68- [ ImporterHeader ( Name = "家庭住址" ) ]
69- [ Required ( ErrorMessage = "家庭地址不能为空" ) ]
70- [ MaxLength ( 200 , ErrorMessage = "家庭地址字数超出最大限制,请修改!" ) ]
71- public string Address { get ; set ; }
72-
73- /// <summary>
74- /// 家长姓名
75- /// </summary>
76- [ ImporterHeader ( Name = "家长姓名" ) ]
77- [ Required ( ErrorMessage = "家长姓名不能为空" ) ]
78- [ MaxLength ( 50 , ErrorMessage = "家长姓名数超出最大限制,请修改!" ) ]
79- public string Guardian { get ; set ; }
80-
81- /// <summary>
82- /// 家长联系电话
83- /// </summary>
84- [ ImporterHeader ( Name = "家长联系电话" ) ]
85- [ MaxLength ( 20 , ErrorMessage = "家长联系电话字数超出最大限制,请修改!" ) ]
86- public string GuardianPhone { get ; set ; }
87-
88- /// <summary>
89- /// 学号
90- /// </summary>
91- [ ImporterHeader ( Name = "学号" ) ]
92- [ MaxLength ( 30 , ErrorMessage = "学号字数超出最大限制,请修改!" ) ]
93- public string StudentNub { get ; set ; }
94-
95- /// <summary>
96- /// 宿舍号
97- /// </summary>
98- [ ImporterHeader ( Name = "宿舍号" ) ]
99- [ MaxLength ( 20 , ErrorMessage = "宿舍号字数超出最大限制,请修改!" ) ]
100- public string DormitoryNo { get ; set ; }
101-
102- /// <summary>
103- /// QQ
104- /// </summary>
105- [ ImporterHeader ( Name = "QQ号" ) ]
106- [ MaxLength ( 30 , ErrorMessage = "QQ号字数超出最大限制,请修改!" ) ]
107- public string QQ { get ; set ; }
108-
109- /// <summary>
110- /// 民族
111- /// </summary>
112- [ ImporterHeader ( Name = "民族" ) ]
113- [ MaxLength ( 2 , ErrorMessage = "民族字数超出最大限制,请修改!" ) ]
114- public string Nation { get ; set ; }
115-
116- /// <summary>
117- /// 户口性质
118- /// </summary>
119- [ ImporterHeader ( Name = "户口性质" ) ]
120- [ MaxLength ( 10 , ErrorMessage = "户口性质字数超出最大限制,请修改!" ) ]
121- public string HouseholdType { get ; set ; }
122-
123- /// <summary>
124- /// 联系电话
125- /// </summary>
126- [ ImporterHeader ( Name = "学生联系电话" ) ]
127- [ MaxLength ( 20 , ErrorMessage = "手机号码字数超出最大限制,请修改!" ) ]
128- public string Phone { get ; set ; }
129-
130- /// <summary>
131- /// 状态
132- /// 测试可为空的枚举类型
133- /// </summary>
134- [ ImporterHeader ( Name = "状态" ) ]
135- public StudentStatus ? Status { get ; set ; }
136-
137- /// <summary>
138- /// 备注
139- /// </summary>
140- [ ImporterHeader ( Name = "备注" ) ]
141- [ MaxLength ( 200 , ErrorMessage = "备注字数超出最大限制,请修改!" ) ]
142- public string Remark { get ; set ; }
143-
144- /// <summary>
145- /// 是否住校(宿舍)
146- /// </summary>
147- [ ImporterHeader ( IsIgnore = true ) ]
148- public bool ? IsBoarding { get ; set ; }
149-
150- /// <summary>
151- /// 所属班级id
152- /// </summary>
153- [ ImporterHeader ( IsIgnore = true ) ]
154- public Guid ClassId { get ; set ; }
155-
156- /// <summary>
157- /// 学校Id
158- /// </summary>
159- [ ImporterHeader ( IsIgnore = true ) ]
160- public Guid ? SchoolId { get ; set ; }
161-
162- /// <summary>
163- /// 校区Id
164- /// </summary>
165- [ ImporterHeader ( IsIgnore = true ) ]
166- public Guid ? CampusId { get ; set ; }
167-
168- /// <summary>
169- /// 专业Id
170- /// </summary>
171- [ ImporterHeader ( IsIgnore = true ) ]
172- public Guid ? MajorsId { get ; set ; }
173-
174- /// <summary>
175- /// 年级Id
176- /// </summary>
177- [ ImporterHeader ( IsIgnore = true ) ]
178- public Guid ? GradeId { get ; set ; }
179- }
180-
18121 public class ExcelImporter_Tests_500 : TestBase
18222 {
18323 public ExcelImporter_Tests_500 ( ITestOutputHelper testOutputHelper )
@@ -191,29 +31,20 @@ public ExcelImporter_Tests_500(ITestOutputHelper testOutputHelper)
19131 [ Fact ( DisplayName = "带导入说明行的 Excel 自动标注错误后导出文件里表头缺失" ) ]
19232 public async Task Issue500_Test1 ( )
19333 {
194- var filePath = Path . Combine ( Directory . GetCurrentDirectory ( ) , "TestFiles" , "Import" , "学生基础数据导入带描述头测试下 .xlsx" ) ;
34+ var filePath = Path . Combine ( Directory . GetCurrentDirectory ( ) , "TestFiles" , "Import" , "issue500带描述头测试 .xlsx" ) ;
19535
19636 var errorStream = new MemoryStream ( ) ;
19737 var fs = new FileStream ( filePath , FileMode . Open ) ;
19838
199- var import = await Importer . Import < ImportWithOnlyError > ( fs , errorStream ) ;
39+ var import = await Importer . Import < Issue500 > ( fs , errorStream ) ;
20040
20141 if ( import . RowErrors . Count > 0 ) _testOutputHelper . WriteLine ( JsonConvert . SerializeObject ( import . RowErrors ) ) ;
20242
203- var filePath1 = GetTestFilePath ( $ "{ nameof ( Issue500_Test1 ) } .xlsx") ;
204- DeleteFile ( filePath1 ) ;
205-
206- using ( var fileStream = new FileStream ( filePath1 , FileMode . Create ) )
207- {
208- errorStream . Seek ( 0 , SeekOrigin . Begin ) ;
209- await errorStream . CopyToAsync ( fileStream ) ;
210- } ;
211-
212- using ( var pck = new ExcelPackage ( new FileInfo ( filePath1 ) ) )
43+ using ( var pck = new ExcelPackage ( errorStream ) )
21344 {
21445 pck . Workbook . Worksheets . Count . ShouldBe ( 1 ) ;
21546 var sheet = pck . Workbook . Worksheets . First ( ) ;
216- sheet . Cells [ 1 , 1 ] . Text . ShouldBe ( "序号" ) ;
47+ sheet . Cells [ 1 , 1 ] . Text . ShouldBe ( "序号" ) ;
21748 sheet . Cells [ 2 , 1 ] . Text . ShouldNotBeNullOrWhiteSpace ( ) ;
21849 }
21950 }
0 commit comments