public static bool DeserializeWorkbook(object model, ExcelWorkbook source, XlsxSerializerSettings settings)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var mainsheetProcessed = false;

            foreach (var sheetAssociation in SheetAssociation.GetSheetAssociations(model.GetType()))
            {
                var sheet = source.Worksheets[sheetAssociation.SheetName];
                if (sheet == null)
                {
                    continue;
                }

                if (sheetAssociation.BoundProperty == null)
                {
                    mainsheetProcessed = true;
                    XlsSheetDeserializerCore.Deserialize(model, sheet, settings);
                    continue;
                }

                if (ReflectionHelper.GetIsCollection(sheetAssociation.BoundProperty.PropertyType, out var itemType,
                                                     true))
                {
                    var collection = XlsCollectionDeserializerCore
                                     .DeserializeCollection(itemType, sheet, () => Activator.CreateInstance(itemType), 0, 0, settings)
                                     .OfType <object>().ToList();

                    ReflectionHelper.PopulateCollectionProperty(model, sheetAssociation.BoundProperty, collection);

                    continue;
                }

                var sheetModel = sheetAssociation.BoundProperty.GetValue(model, null);

                if (sheetModel == null)
                {
                    if (!sheetAssociation.BoundProperty.CanWrite)
                    {
                        continue;
                    }

                    sheetModel = Activator.CreateInstance(sheetAssociation.BoundProperty.PropertyType);
                    sheetAssociation.BoundProperty.SetValue(model, sheetModel, null);
                }

                XlsSheetDeserializerCore.Deserialize(sheetModel, sheet, settings);
            }

            return(mainsheetProcessed);
        }
예제 #2
0
        public void WriteCell(object propertyOwner, ExcelRange cell, XlsxSerializerSettings settings)
        {
            foreach (var cellSetup in m_cellSetups)
            {
                cellSetup.Apply(BoundProperty, cell);
            }

            foreach (var setter in m_cellValueAccessors)
            {
                setter.WriteCellValue(BoundProperty, propertyOwner, cell, settings);
            }
        }
예제 #3
0
        public object ReadCell(Func <object> propertyOwnerFactory, ExcelRange cell, XlsxSerializerSettings settings)
        {
            if (cell.Value == null)
            {
                return(null);
            }

            var owner = propertyOwnerFactory();

            foreach (var setter in m_cellValueAccessors)
            {
                setter.ReadCellValue(cell, owner, BoundProperty, settings);
            }

            return(owner);
        }
예제 #4
0
        public static void SerializeWorkbook(object model, ExcelWorkbook target, XlsxSerializerSettings settings)
        {
            if (model == null)
            {
                return;
            }

            foreach (var sheetAssociation in SheetAssociation.GetSheetAssociations(model.GetType()))
            {
                var sheet = target.Worksheets[sheetAssociation.SheetName];

                if (sheet == null)
                {
                    sheet = target.Worksheets.Add(sheetAssociation.SheetName);

                    foreach (var setup in sheetAssociation.SheetSetup)
                    {
                        setup.SetupSheet(sheet);
                    }
                }


                object sheetModelValue;

                if (sheetAssociation.BoundProperty == null)
                {
                    sheetModelValue = model;
                    XlsSheetSerializerCore.Serialize(model.GetType(), model, sheet, settings);
                    continue;
                }

                if ((!sheetAssociation.BoundProperty.CanRead) ||
                    ((sheetModelValue = sheetAssociation.BoundProperty.GetValue(model)) == null))
                {
                    continue;
                }

                if (ReflectionHelper.GetIsCollection(sheetAssociation.BoundProperty.PropertyType,
                                                     out var collectionItemType, true))
                {
                    XlsCollectionSerializerCore.SerializeCollection(collectionItemType, (IEnumerable)sheetModelValue, sheet, 0, 0, settings);
                }
        public static void Deserialize(object modelInstance, ExcelWorksheet source, XlsxSerializerSettings settings)
        {
            if (modelInstance == null)
            {
                throw new ArgumentNullException(nameof(modelInstance));
            }

            var mapping = DocumentMapper.GetMapping(modelInstance.GetType());

            foreach (var rule in mapping.Values)
            {
                if (rule.CellLocation.Row == null)
                {
                    continue;
                }

                var sourceCell = source.Cells[rule.CellLocation.Row.Value + 1, rule.CellLocation.Column + 1];
                rule.ReadCell(() => modelInstance, sourceCell, settings);
            }
        }
        public static void Serialize(Type modelType, object model, ExcelWorksheet target, XlsxSerializerSettings settings)
        {
            var mapping = DocumentMapper.GetMapping(modelType);

            foreach (var m in mapping.Values)
            {
                if (m.CellLocation.Row == null)
                {
                    continue;
                }

                var cell = target.Cells[m.CellLocation.Row.Value + 1, m.CellLocation.Column + 1];

                m.WriteCell(model, cell, settings);
            }
        }
예제 #7
0
        public void ReadCellValue(ExcelRange cell, object owner, PropertyInfo targetProperty, XlsxSerializerSettings settings)
        {
            if (ReflectionHelper.GetIsCollection(targetProperty.PropertyType, out var collectionItemType, true))
            {
                var collection = XlsCollectionDeserializerCore.DeserializeCollection(collectionItemType, cell.Worksheet,
                    () => Activator.CreateInstance(collectionItemType), cell.Start.Row - 1, cell.Start.Column - 1, settings).OfType<object>().ToList();

                ReflectionHelper.PopulateCollectionProperty(owner, targetProperty, collection);

                return;
            }

            var pao = new PropertyAndOwnerInstance(targetProperty, owner);

            Func<PropertyAndOwnerInstance, bool> defaultShouldProcessCellDecision = (p) => p.Property.CanWrite;

            Func<ExcelRange, Type, PropertyAndOwnerInstance, IValueConverter, object> defaultConvertCellValueToType = (cl, tp, p, converter) =>
            {
                var cellValue = cl.Value;
                if (cellValue == null)
                {
                    return null;
                }

                return converter.FromCellValue(tp, cellValue); 
            };

            Action<PropertyAndOwnerInstance, object> defaultPropertySetter = (p, v) => p.Property.SetValue(p.PropertyOwner, v);

            settings.CellReaderInterceptor.ReadCell(cell,
                owner,
                targetProperty,
                defaultShouldProcessCellDecision,
                defaultConvertCellValueToType,
                defaultPropertySetter,
                settings);
        }
예제 #8
0
        public virtual void WriteCellValue(PropertyInfo sourceProperty, object owner, ExcelRange cell, XlsxSerializerSettings settings)
        {
            Func<PropertyAndOwnerInstance, object> defaultValueReader = (pao) =>
            {
                if (!pao.Property.CanRead || (!string.IsNullOrWhiteSpace(cell.Formula)) || (!string.IsNullOrWhiteSpace(cell.FormulaR1C1)))
                {
                    return null;
                }

                return pao.Property.GetValue(pao.PropertyOwner, null);
            };

            Action<Type, object, ExcelRange, IValueConverter> defaultWrite = (t, val, cel, con) =>
            {
                var formula = cell.Formula;
                var formulaRC = cell.FormulaR1C1;

                cell.Value = con.ToCellValue(t, val, cell);

                if (!string.IsNullOrWhiteSpace(formula))
                {
                    cell.Formula = formula;
                }

                if (!string.IsNullOrWhiteSpace(formulaRC))
                {
                    cell.FormulaR1C1 = formulaRC;
                }
            };

            settings.CellWriterInterceptor.Write(owner, sourceProperty, defaultValueReader, cell, defaultWrite, settings);
        }
        public static void SerializeCollection(Type itemType, IEnumerable collection, ExcelWorksheet target, int startRow, int startColumn, XlsxSerializerSettings settings)
        {
            var mapping = DocumentMapper.GetMapping(itemType);

            var sheetRow = 1 + startRow;

            if (mapping.HasHeader)
            {
                for (var i = mapping.StartColumn; i <= mapping.EndColumn; i++)
                {
                    var headerCell = target.Cells[sheetRow, i + 1 + startColumn];
                    mapping.SetupHeader(i, headerCell);
                }

                sheetRow++;
            }

            foreach (var item in collection)
            {
                foreach (var columnMapping in mapping.Values)
                {
                    columnMapping.WriteCell(item, target.Cells[sheetRow, columnMapping.CellLocation.Column + 1 + startColumn], settings);
                }

                sheetRow++;
            }
        }
예제 #10
0
 public object ReadCell(Func <object> propertyOwner, ExcelRange cell, XlsxSerializerSettings settings)
 {
     return(cell.Value);
 }
예제 #11
0
 public void WriteCell(object propertyOwner, ExcelRange cell, XlsxSerializerSettings settings)
 {
     cell.Value = propertyOwner;
 }
예제 #12
0
        public override void WriteCellValue(PropertyInfo sourceProperty, object owner, ExcelRange cell, XlsxSerializerSettings settings)
        {
            if (ReflectionHelper.GetIsCollection(sourceProperty.PropertyType, out var collectionItemType, true))
            {
                var value = sourceProperty.GetValue(owner, null) as IEnumerable ?? new object[0];
                XlsCollectionSerializerCore.SerializeCollection(collectionItemType, value, cell.Worksheet, cell.Start.Row - 1, cell.Start.Column - 1, settings);
                return;
            }

            base.WriteCellValue(sourceProperty, owner, cell, settings);
        }
        public static IEnumerable DeserializeCollection(Type collectionItemType, ExcelWorksheet source, Func <object> newItemFactory, int startRow, int startColumn, XlsxSerializerSettings settings)
        {
            var mapping = DocumentMapper.GetMapping(collectionItemType);

            var sheetRow = (mapping.HasHeader ? 2 : 1) + startRow;

            for (; sheetRow <= (source.Dimension?.End?.Row ?? 0); sheetRow++)
            {
                object item = null;

                foreach (var cellMapping in mapping.Values)
                {
                    var cell = source.Cells[sheetRow, cellMapping.CellLocation.Column + 1 + startColumn];
                    try
                    {
                        var readingResult = cellMapping.ReadCell(item == null ? newItemFactory : () => item, cell, settings);

                        if ((item == null) || (readingResult != null))
                        {
                            item = readingResult;
                        }

                        if (item is IHasSourceRowIndex rowReference)
                        {
                            rowReference.SourceRowIndex = sheetRow;
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new XlsxSerializerException(cell, ex);
                    }
                }

                if (item == null)
                {
                    yield break;
                }

                yield return(item);
            }
        }