public virtual List <TEntity> MapData(IEnumerable <Row> rows, Row headerRow) { //initialize list of container to add data var entities = new List <TEntity>(); //loop on rows and skip first row that contain only column header for (int i = 1; i < rows.Count(); i++) { // create new instance of T type TEntity entity = (TEntity)Activator.CreateInstance(typeof(TEntity)); //get data row Row row = rows.ElementAt(i); //initialize list of container of setting reference properties List <string> settingReferenceProperties = new List <string>(); //get row cells include empty values var rowCellValues = GetRowValues(row, headerRow.Elements <Cell>().Count()); //loop on cells of row for (int y = 0; y < rowCellValues.Count(); y++) { //get reference of cell value var cellValue = rowCellValues[y]; //to set the value to entity property //first : check about HeaderEntityReferences if exist and header index is saved in HeaderEntityReferences if (HeaderEntityReferences != null && HeaderEntityReferences.Any(h => h.Headers.Any(info => info.HeaderIndex == y))) { SetReferenceValue(ref entity, rowCellValues, y, settingReferenceProperties); } else { //get property name from columns header that will be set with value string propertyName = (string)GetCellValue(headerRow.Elements <Cell>().ElementAt(y)); //set value to property of object Repository <TEntity> .SetPropertyValue(ref entity, propertyName, cellValue); } } //insert object to list of container entities.Add(entity); } return(entities); }