示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        private Type GetDynamicType(ISheet sheet)
        {
            var firstRowIndex = sheet.FirstRowNum;
            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 ? sheet.FirstRowNum : -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));
        }