Пример #1
0
        /// <summary>
        ///     添加数据行错误
        /// </summary>
        /// <param name="rowIndex"></param>
        /// <param name="importerHeaderInfo"></param>
        /// <param name="errorMessage"></param>
        protected virtual void AddRowDataError(int rowIndex, ImporterHeaderInfo importerHeaderInfo,
                                               string errorMessage = "数据格式无效!")
        {
            var rowError = ImportResult.RowErrors.FirstOrDefault(p => p.RowIndex == rowIndex);

            if (rowError == null)
            {
                rowError = new DataRowErrorInfo
                {
                    RowIndex = rowIndex
                };
                ImportResult.RowErrors.Add(rowError);
            }

            rowError.FieldErrors.Add(importerHeaderInfo.ExporterHeader.Name, errorMessage);
        }
Пример #2
0
        public async Task ImportFailureData()
        {
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "学生基础数据导入带描述头.xlsx");
            var import   = await Importer.Import <ImportStudentDtoWithSheetDesc>(filePath);

            import.ShouldNotBeNull();
            if (import.Exception != null)
            {
                _testOutputHelper.WriteLine(import.Exception.ToString());
            }

            if (import.RowErrors.Count > 0)
            {
                _testOutputHelper.WriteLine(JsonConvert.SerializeObject(import.RowErrors));
            }
            import.HasError.ShouldBeFalse();
            import.Data.ShouldNotBeNull();
            import.Data.Count.ShouldBe(16);

            List <DataRowErrorInfo> errorList = new List <DataRowErrorInfo>();

            //出现五条无法完成业务效验的错误数据
            foreach (var item in import.Data.Skip(5).ToList())
            {
                var errorInfo = new DataRowErrorInfo()
                {
                    //由于 Index 从开始
                    RowIndex = import.Data.ToList().FindIndex(o => o.Equals(item)) + 1,
                };
                errorInfo.FieldErrors.Add("序号", "数据库已重复");
                errorInfo.FieldErrors.Add("学籍号", "无效的学籍号,疑似外来人物");
                errorList.Add(errorInfo);
            }

            bool result = Importer.OutputBussinessErrorData <ImportStudentDtoWithSheetDesc>(filePath, errorList, out string msg);

            using (var stream = new FileStream(filePath, FileMode.Open))
            {
                var resultByte = Importer.OutputBussinessErrorData <ImportStudentDtoWithSheetDesc>(stream, errorList, out byte[] fileByte);
                resultByte.ShouldBeTrue();
                fileByte.ShouldNotBeNull();
            }
            result.ShouldBeTrue();
        }
Пример #3
0
        /// <summary>
        ///     获取当前行
        /// </summary>
        /// <param name="rowIndex"></param>
        /// <returns></returns>
        private DataRowErrorInfo GetDataRowErrorInfo(int rowIndex)
        {
            if (ImportResult.RowErrors == null)
            {
                ImportResult.RowErrors = new List <DataRowErrorInfo>();
            }

            var dataRowError = ImportResult.RowErrors.FirstOrDefault(p => p.RowIndex == rowIndex);

            if (dataRowError == null)
            {
                dataRowError = new DataRowErrorInfo
                {
                    RowIndex = rowIndex
                };
                ImportResult.RowErrors.Add(dataRowError);
            }

            return(dataRowError);
        }
Пример #4
0
        public async Task ImportFailureAxisDataWithoutDesc()
        {
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "管轴导入数据.xlsx");
            var import   = await Importer.Import <ImportGalleryAxisDto>(filePath);

            import.ShouldNotBeNull();
            if (import.Exception != null)
            {
                _testOutputHelper.WriteLine(import.Exception.ToString());
            }

            if (import.RowErrors.Count > 0)
            {
                _testOutputHelper.WriteLine(JsonConvert.SerializeObject(import.RowErrors));
            }
            import.HasError.ShouldBeFalse();
            import.Data.ShouldNotBeNull();


            List <DataRowErrorInfo> ErrorList = new List <DataRowErrorInfo>();

            //出现五条无法完成业务效验的错误数据
            foreach (var item in import.Data.ToList())
            {
                var errorInfo = new DataRowErrorInfo()
                {
                    //由于 Index 从开始
                    RowIndex = import.Data.ToList().FindIndex(o => o.Equals(item)) + 1,
                };
                errorInfo.FieldErrors.Add("管轴编号", "数据库已重复");
                errorInfo.FieldErrors.Add("管廊编号", "责任区域不存在");
                errorInfo.FieldErrors.Add("责任区域", "责任区域不存在");
                ErrorList.Add(errorInfo);
            }
            var result = Importer.OutputBussinessErrorData <ImportGalleryAxisDto>(filePath, ErrorList, out string errorDataFilePath);

            result.ShouldBeTrue();
        }
        /// <summary>
        /// 导入模型验证数据
        /// </summary>
        /// <returns></returns>
        public Task <ImportResult <T> > Import(string filePath = null)
        {
            if (!string.IsNullOrWhiteSpace(filePath))
            {
                FilePath = filePath;
            }

            ImportResult = new ImportResult <T>()
            {
                RowErrors = new List <DataRowErrorInfo>()
            };
            ExcelImporterAttribute = typeof(T).GetAttribute <ExcelImporterAttribute>(true) ?? new ExcelImporterAttribute();

            try
            {
                CheckImportFile(FilePath);

                using (Stream stream = new FileStream(FilePath, FileMode.Open))
                {
                    using (var excelPackage = new ExcelPackage(stream))
                    {
                        #region 检查模板
                        ParseTemplate(excelPackage);
                        if (ImportResult.HasError)
                        {
                            return(Task.FromResult(ImportResult));
                        }
                        #endregion

                        ParseData(excelPackage);
                        for (var i = 0; i < ImportResult.Data.Count; i++)
                        {
                            var isValid = ValidatorHelper.TryValidate(ImportResult.Data[i], out var validationResults);
                            if (!isValid)
                            {
                                var dataRowError = new DataRowErrorInfo
                                {
                                    RowIndex = ExcelImporterAttribute.HeaderRowIndex + i + 1
                                };
                                foreach (var validationResult in validationResults)
                                {
                                    var key    = validationResult.MemberNames.First();
                                    var column = ImporterHeaderInfos.FirstOrDefault(a => a.PropertyName == key);
                                    if (column != null)
                                    {
                                        key = column.ExporterHeader.Name;
                                    }
                                    var value = validationResult.ErrorMessage;
                                    if (dataRowError.FieldErrors.ContainsKey(key))
                                    {
                                        dataRowError.FieldErrors[key] += (Environment.NewLine + value);
                                    }
                                    else
                                    {
                                        dataRowError.FieldErrors.Add(key, value);
                                    }
                                }
                                ImportResult.RowErrors.Add(dataRowError);
                            }
                        }
                        LabelingError(excelPackage);
                    }
                }
            }
            catch (Exception ex)
            {
                ImportResult.Exception = ex;
            }

            return(Task.FromResult(ImportResult));
        }