Exemple #1
0
        public async Task <bool> Import(SheetConvertingContext context)
        {
            var success = await LoadData();

            if (!success)
            {
                context.Logger.LogError($"Failed to load data");
                return(false);
            }

            var sheetProps = context.Container.GetSheetProperties();

            foreach (var prop in sheetProps)
            {
                using (context.Logger.BeginScope(prop.Name))
                {
                    var page = GetPage(prop.Name);
                    if (page == null)
                    {
                        context.Logger.LogError("Failed to find sheet: {SheetName}", prop.Name);
                        continue;
                    }

                    var sheet = Activator.CreateInstance(prop.PropertyType) as ISheet;

                    page.Import(this, context, sheet);
                    prop.SetValue(context.Container, sheet);
                }
            }

            return(true);
        }
Exemple #2
0
            public override void PostLoad(SheetConvertingContext context)
            {
                base.PostLoad(context);

                int.TryParse(Value, out valueInt);
                float.TryParse(Value, out valueFloat);
            }
        public async Task <bool> Export(SheetConvertingContext context)
        {
            foreach (var prop in context.Container.GetSheetProperties())
            {
                using (context.Logger.BeginScope(prop.Name))
                {
                    var sheet = prop.GetValue(context.Container) as ISheet;
                    if (sheet == null)
                    {
                        continue;
                    }

                    var page = CreatePage(sheet.Name);
                    page.Export(this, context, sheet);
                }
            }

            var success = await SaveData();

            if (!success)
            {
                context.Logger.LogError($"Failed to save data");
                return(false);
            }

            return(true);
        }
Exemple #4
0
        private static void ImportToObject(this IRawSheetImporterPage page, RawSheetImporter importer, SheetConvertingContext context, object obj, int pageRow)
        {
            var type         = obj.GetType();
            var bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;

            for (int pageColumn = 0; !page.IsEmptyCell(pageColumn, 0); ++pageColumn)
            {
                var columnValue = page.GetCell(pageColumn, 0);

                using (context.Logger.BeginScope(columnValue))
                {
                    var cellValue = page.GetCell(pageColumn, pageRow);
                    if (string.IsNullOrEmpty(cellValue))
                    {
                        continue;
                    }

                    var prop = type.GetProperty(columnValue, bindingFlags);
                    if (prop == null)
                    {
                        continue;
                    }

                    try
                    {
                        object value = importer.StringToValue(prop.PropertyType, cellValue);
                        prop.SetValue(obj, value);
                    }
                    catch (Exception ex)
                    {
                        context.Logger.LogError(ex, "Failed to convert value \"{CellValue}\" of type {PropertyType}", cellValue, prop.PropertyType);
                    }
                }
            }
        }
Exemple #5
0
        public static void Import(this IRawSheetImporterPage page, RawSheetImporter importer, SheetConvertingContext context, ISheet sheet)
        {
            var idColumnName = page.GetCell(0, 0);

            if (idColumnName != nameof(ISheetRow.Id))
            {
                context.Logger.LogError("First column \"{ColumnName}\" must be named \"Id\"", idColumnName);
                return;
            }

            ISheetRow sheetRow = null;

            for (int pageRow = 1; !page.IsEmptyRow(pageRow); ++pageRow)
            {
                var rowId = page.GetCell(0, pageRow);

                if (!string.IsNullOrEmpty(rowId))
                {
                    using (context.Logger.BeginScope(rowId))
                    {
                        sheetRow = Activator.CreateInstance(sheet.RowType) as ISheetRow;

                        page.ImportToObject(importer, context, sheetRow, pageRow);

                        if (sheet.Contains(sheetRow.Id))
                        {
                            context.Logger.LogError("Already has row with id \"{RowId}\"", sheetRow.Id);
                            sheetRow = null;
                        }
                        else
                        {
                            sheet.Add(sheetRow);
                        }
                    }
                }

                if (sheetRow is ISheetRowArray sheetRowArray)
                {
                    using (context.Logger.BeginScope(sheetRow.Id))
                        using (context.Logger.BeginScope(sheetRowArray.Arr.Count))
                        {
                            var sheetElem = Activator.CreateInstance(sheetRowArray.ElemType);

                            page.ImportToObject(importer, context, sheetElem, pageRow);

                            sheetRowArray.Arr.Add(sheetElem);
                        }
                }
            }
        }
        public static void Export(this IRawSheetExporterPage page, RawSheetConverter exporter, SheetConvertingContext context, ISheet sheet)
        {
            if (sheet.Count == 0)
            {
                return;
            }

            var bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;

            PropertyInfo[] sheetRowProperties = null, sheetElemProperties = null;

            int pageRow = 1;

            foreach (ISheetRow sheetRow in sheet)
            {
                using (context.Logger.BeginScope(sheetRow.Id))
                {
                    if (sheetRowProperties == null)
                    {
                        sheetRowProperties = sheetRow.GetType()
                                             .GetProperties(bindingFlags)
                                             .Where(ShouldExport)
                                             .OrderByDescending(x => x.Name == nameof(ISheetRow.Id))
                                             .ToArray();

                        for (int i = 0; i < sheetRowProperties.Length; ++i)
                        {
                            var prop = sheetRowProperties[i];
                            page.SetCell(i, 0, prop.Name);
                        }
                    }

                    for (int i = 0; i < sheetRowProperties.Length; ++i)
                    {
                        var prop      = sheetRowProperties[i];
                        var value     = prop.GetValue(sheetRow);
                        var cellValue = exporter.ValueToString(prop.PropertyType, value);

                        page.SetCell(i, pageRow, cellValue);
                    }

                    if (sheetRow is ISheetRowArray sheetRowArray)
                    {
                        foreach (ISheetRowElem sheetElem in sheetRowArray.Arr)
                        {
                            using (context.Logger.BeginScope(sheetElem.Index))
                            {
                                if (sheetElemProperties == null)
                                {
                                    sheetElemProperties = sheetElem.GetType()
                                                          .GetProperties(bindingFlags)
                                                          .Where(ShouldExport)
                                                          .ToArray();

                                    for (int i = 0; i < sheetElemProperties.Length; ++i)
                                    {
                                        var prop = sheetElemProperties[i];
                                        page.SetCell(sheetRowProperties.Length + i, 0, prop.Name);
                                    }
                                }

                                for (int i = 0; i < sheetElemProperties.Length; ++i)
                                {
                                    var prop      = sheetElemProperties[i];
                                    var value     = prop.GetValue(sheetElem);
                                    var cellValue = exporter.ValueToString(prop.PropertyType, value);

                                    page.SetCell(sheetRowProperties.Length + i, pageRow, cellValue);
                                }

                                pageRow += 1;
                            }
                        }
                    }
                    else
                    {
                        pageRow += 1;
                    }
                }
            }
        }