Example #1
0
        /// <summary>
        /// 将表格数据转换为指定的数据实体(实际上下面的方法高度重合,主要为了Init)
        /// </summary>
        public static ICollection <T> ExcelToEntity <T>(Stream excelStream, ExcelImportOption <T> options)
        {
            var header = GenExcelHeaderByOptions(excelStream, options);

            using ExcelPackage pack = new(excelStream);
            // 合并 FieldOption 和 DefaultOption
            var propOptions = options.FieldOption.Concat(options.DefaultOption);
            var sheet = pack.Workbook.Worksheets[1];
            int rowCount = sheet.Dimension.Rows, colCount = sheet.Dimension.Columns;
            // 将excel 的数据转换为 对应实体
            List <T> data = new();

            for (int r = 2; r <= rowCount; r++)
            {
                try
                {
                    // 将单行数据转换为 表头:数据 的键值对
                    var rowData = sheet.Cells[r, 1, r, colCount]
                                  .Where(item => header.Any(title => title.Value == item.End.Column))
                                  .Select(item => new KeyValuePair <string, string>(header.First(title => title.Value == item.End.Column).Key, item.Value?.ToString().Trim()))
                                  .ToDictionary(item => item.Key, item => item.Value);
                    var obj = Activator.CreateInstance(typeof(T));
                    // 根据对应传入的设置 为obj赋值
                    foreach (var option in propOptions)
                    {
                        if (!option.ExcelField.IsNullOfEmpty())
                        {
                            var value = rowData.ContainsKey(option.ExcelField) ? rowData[option.ExcelField] : string.Empty;
                            // if (!value.IsNullOfEmpty())
                            option.Prop.SetValue(obj, option.Action == null ? value : option.Action(value));
                        }
                        else
                        {
                            option.Prop.SetValue(obj, option.Action == null ? null : option.Action(string.Empty));
                        }
                    }
                    if (options.Init != null)
                    {
                        obj = options.Init((T)obj);
                    }
                    data.Add((T)obj);
                }
                catch (Exception ex)
                {
                    throw new Exception($@"ERROR: 第 {r} 行 ; {ex.Message}");
                }
            }

            return(data);
        }