/// <summary> /// Kiểm tra vị trí của worksheet và tên worksheet /// </summary> /// <param name="guardClause"></param> /// <param name="importWorksheet">worksheet mẫu</param> /// <param name="sheetName">Tên sheet</param> /// <param name="sheetPosition">Vị trí sheet hiện tại</param> /// CreatedBy: NVMANH public static void WorksheetInValid(this IGuardClause guardClause, ImportWorksheet importWorksheet, string sheetName, int sheetPosition) { if (importWorksheet == null) { throw new ImportException(String.Format("Tệp nhập khẩu không đúng mẫu, worksheet [{0}] sai vị trí hoặc không tồn tại trong tệp mẫu", sheetName)); } }
/// <summary> /// Thực hiện build dữ liệu nhập khẩu. /// </summary> /// <param name="excelPackage">Phạm vi chứa dữ liệu của file Excel</param> /// <param name="importFileTemplate">Đối tượng chứa thông tin file mẫu nhập khẩu được khai báo trong Database</param> /// <returns>Danh sách các đối tượng được build từ File Excel</returns> /// CreatedBy: NVMANH (20/05/2020) public List <object> BuildListDataFromExcel <T>(ExcelPackage excelPackage, ImportFileTemplate importFileTemplate) where T : BaseEntity { var worksheets = excelPackage.Workbook.Worksheets; var workSheetCount = worksheets.Count; // Duyệt từng sheet nhé // - mỗi sheet sẽ được khai báo tương ứng trong database gồm các thông tin: sheet này sẽ mapping với object nào, bảng sẽ lưu dữ liệu là gì... for (int i = 0; i < workSheetCount; i++) { Worksheet = worksheets[i]; var sheetName = Worksheet.Name; // Vả vào mồm người dùng nếu tệp không đúng là tệp mẫu: Tệp mẫu của MISA cấp luôn có ít nhất 1 sheet và phải có khai báo các thông tin - tức là không được phép null. if (Worksheet.Dimension == null) { throw new ImportException(string.Format(Resources.Error_ImportFile_NotMatchTemplate)); } var totalColumns = Worksheet.Dimension.Columns; // Check xem Worksheet trên tệp có giống File mẫu hay không? Không có lại vả tiếp ImportWorksheetTemplate = importFileTemplate.ImportWorksheet.Where(e => e.ImportWorksheetName.Trim().ToLower() == sheetName.Trim().ToLower() || e.WorksheetPosition == i + 1).FirstOrDefault(); // Bỏ qua các sheet ẩn và các sheet được khai báo là không nhập khẩu: if (ImportWorksheetTemplate == null || Worksheet.Hidden == OfficeOpenXml.eWorkSheetHidden.Hidden || (ImportWorksheetTemplate != null && ImportWorksheetTemplate.IsImport == 0)) { continue; } // Bảng dữ liệu trong database được khai báo sẽ lưu trữ đối tượng là gì? nếu không khai báo thì bỏ qua nốt. TableToImport = ImportWorksheetTemplate.ImportToTable; if (string.IsNullOrEmpty(TableToImport)) { continue; } //Guard.Against.FileContentInvalid(workSheetCount, importFileTemplate.ImportWorksheet.Count, importFileTemplate); //Guard.Against.WorksheetInValid(worksheetTemplate, sheetName, i); // Check số lượng cột trong workSheet có giống với số lượng cột tại worksheet như tệp mẫu hay không? // Không giống tức là không đúng mẫu - vả lỗi vào mồm! var listColumnsTemplate = ImportWorksheetTemplate.ImportColumn; if (totalColumns != listColumnsTemplate.Count()) { throw new ImportException(String.Format(Resources.Error_ImportFileWorksheetPossitionInvalid, listColumnsTemplate.Count(), sheetName)); } // For từng cột [xác định là tiêu đề], kiểm tra tiêu đề cột có khớp hay không - không khớp tức là cột linh tinh không đúng mẫu - ném lỗi vào mồm: var rangeHeader = Worksheet.Cells[1, 1, 1, totalColumns]; for (int j = 1; j < totalColumns; j++) { var headerName = rangeHeader[1, j].Value.ToString().Replace("\n", ""); var excelHeaderNameRemoveDiacritics = RemoveDiacritics(headerName).Trim().ToLower().Replace(" ", string.Empty); var headerNameTemplate = listColumnsTemplate.Where(col => (RemoveDiacritics(col.ColumnTitle.Trim().ToLower()).Replace(" ", string.Empty).Contains(excelHeaderNameRemoveDiacritics))).FirstOrDefault(); var address = rangeHeader[1, j].Address; if (headerNameTemplate == null) { throw new ImportException(String.Format(Resources.Error_ImportFileColumnPossitionInvalid, headerName, sheetName, address)); } } // Khai báo một số biến cần dùng trước khi thực hiện mapping dữ liệu nhập khẩu từng dòng: var rowCount = Worksheet.Dimension.Rows; var rowBeginImport = ImportWorksheetTemplate.RowStartImport ?? 0; // Nếu null thì lấy từ vị trí thứ 2 (sau vị trí tiêu đề) var tableName = importFileTemplate.TableImport; if (rowBeginImport > rowCount) { throw new ImportException(Resources.Error_ImportFileColumnHeaderPossitionInvalid); } // Duyệt từng dòng, thực hiện mapping các giá trị: for (int row = rowBeginImport; row <= rowCount; row++) { List <T> entitiesFromExcel = _entitiesFromEXCEL.Cast <T>().ToList(); var entity = BuildObject(Worksheet, rangeHeader, listColumnsTemplate, totalColumns, row, entitiesFromExcel); SetOrgId(entity); ProcessDataAfterBuild <T>(entity); } } return(_entitiesFromEXCEL); }