private List <ColumnInfo> GetColumns(IRow headerRow, Type type) { // // Column mapping priority: // Map<T> > ColumnAttribute > naming convention > column filter. // var sheetName = headerRow.Sheet.SheetName; var columns = new List <ColumnInfo>(); var columnsCache = new List <object>(); // Cached for export usage. // Prepare a list of ColumnInfo by the first row. foreach (ICell header in headerRow) { // Custom mappings via attributes. var column = GetColumnInfoByAttribute(header, type); // Naming convention. if (column == null && HasHeader && MapHelper.GetCellType(header) == CellType.String) { var s = header.StringCellValue; if (!string.IsNullOrWhiteSpace(s)) { column = GetColumnInfoByName(s.Trim(), header.ColumnIndex, type); } } // Column filter. if (column == null) { column = GetColumnInfoByFilter(header, _columnFilter); if (column != null) // Set default resolvers since the column is not mapped explicitly. { column.Attribute.TryPut = _defaultPutResolver; column.Attribute.TryTake = _defaultTakeResolver; } } if (column == null) { continue; // No property was mapped to this column. } if (header.CellStyle != null) { column.HeaderFormat = header.CellStyle.DataFormat; } columns.Add(column); columnsCache.Add(column); } var typeDict = TrackedColumns.ContainsKey(sheetName) ? TrackedColumns[sheetName] : TrackedColumns[sheetName] = new Dictionary <Type, List <object> >(); typeDict[type] = columnsCache; return(columns); }
private ColumnInfo GetColumnInfoByDynamicAttribute(ICell header) { var cellType = MapHelper.GetCellType(header); var index = header.ColumnIndex; foreach (var pair in DynamicAttributes) { var attribute = pair.Value; // If no header, cannot get a ColumnInfo by resolving header string. if (!HasHeader && attribute.Index < 0) { continue; } var headerValue = HasHeader ? GetHeaderValue(header) : null; var indexMatch = attribute.Index == index; var nameMatch = cellType == CellType.String && string.Equals(attribute.Name, header.StringCellValue); // Index takes precedence over Name. if (indexMatch || (attribute.Index < 0 && nameMatch)) { // Use a clone so no pollution to original attribute, // The origin might be used later again for multi-column/DefaultResolverType purpose. attribute = attribute.Clone(index); return(new ColumnInfo(headerValue, attribute)); } } return(null); }
private List <ColumnInfo <T> > GetColumns <T>(IRow headerRow) { // // Column mapping priority: // Map<T> > ColumnAttribute > naming convention > DefaultResolverType. // var sheetName = headerRow.Sheet.SheetName; var columns = new List <ColumnInfo <T> >(); var columnsCache = new List <object>(); // Cached for export usage. // Prepare a list of ColumnInfo by the first row. foreach (ICell header in headerRow) { // Custom mappings via attributes. var column = GetColumnInfoByAttribute <T>(header); // Naming convention. if (column == null && HasHeader && MapHelper.GetCellType(header) == CellType.String) { var s = header.StringCellValue; if (!string.IsNullOrWhiteSpace(s)) { column = GetColumnInfoByName <T>(s.Trim(), header.ColumnIndex); } } // DefaultResolverType if (column == null) { column = GetColumnInfoByResolverType <T>(header, DefaultResolverType); } if (column == null) { continue; // No property was mapped to this column. } if (header.CellStyle != null) { column.HeaderFormat = header.CellStyle.DataFormat; } columns.Add(column); columnsCache.Add(column); } var typeDict = TrackedColumns.ContainsKey(sheetName) ? TrackedColumns[sheetName] : TrackedColumns[sheetName] = new Dictionary <Type, List <object> >(); typeDict[typeof(T)] = columnsCache; return(columns); }
private Type GetDynamicType(ISheet sheet) { var firstRowIndex = GetFirstRowIndex(sheet); var firstRow = sheet.GetRow(firstRowIndex); var names = new Dictionary <string, Type>(); foreach (var header in firstRow) { var column = GetColumnInfoByDynamicAttribute(header); var type = Helper.InferColumnDataType(sheet, HasHeader ? firstRowIndex : -1, header.ColumnIndex); if (column != null) { names[column.Attribute.PropertyName] = type ?? typeof(string); } else { var headerValue = GetHeaderValue(header); var tempColumn = new ColumnInfo(headerValue, header.ColumnIndex, null); if (_columnFilter != null && !_columnFilter(tempColumn)) { continue; } string propertyName; if (HasHeader && MapHelper.GetCellType(header) == CellType.String) { propertyName = MapHelper.GetVariableName(header.StringCellValue, IgnoredNameChars, TruncateNameFrom, header.ColumnIndex); } else { propertyName = MapHelper.GetVariableName(null, null, null, header.ColumnIndex); } names[propertyName] = type ?? typeof(string); DynamicAttributes[propertyName] = new ColumnAttribute((ushort)header.ColumnIndex) { PropertyName = propertyName }; } } return(AnonymousTypeFactory.CreateType(names, true)); }
private ColumnInfo <T> GetColumnInfoByAttribute <T>(ICell header) { var type = typeof(T); var cellType = MapHelper.GetCellType(header); var index = header.ColumnIndex; foreach (var pair in Attributes) { var attribute = pair.Value; if (pair.Key.ReflectedType != type || attribute.Ignored == true) { continue; } // If no header, cannot get a ColumnInfo by resolving header via custom resolver. if (!HasHeader && attribute.Index < 0) { continue; } var headerValue = HasHeader ? GetHeaderValue(header) : null; var indexMatch = attribute.Index == index; var nameMatch = cellType == CellType.String && string.Equals(attribute.Name, header.StringCellValue); // Index takes precedence over Name. if (indexMatch || (attribute.Index < 0 && nameMatch)) { // Use a clone so no pollution to original attribute, // The origin might be used later again for multi-column/DefaultResolverType purpose. attribute = attribute.Clone(index); var resolver = attribute.ResolverType == null ? null : Activator.CreateInstance(attribute.ResolverType) as IColumnResolver <T>; resolver?.IsColumnMapped(ref headerValue, index); // Ignore return value since it's already mapped to column. return(new ColumnInfo <T>(headerValue, attribute) { Resolver = resolver }); } // If goes this far, try map column by custom resolver. if (attribute.Index < 0 && attribute.Name == null && attribute.ResolverType != null) { var resolver = Activator.CreateInstance(attribute.ResolverType) as IColumnResolver <T>; if (resolver == null) { continue; } // Check if this column is desired by resolver. if (!resolver.IsColumnMapped(ref headerValue, index)) { continue; } attribute = attribute.Clone(index); return(new ColumnInfo <T>(headerValue, attribute) { Resolver = resolver }); } } return(null); }