/// <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));
     }
 }
Example #2
0
        /// <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);
        }