Ejemplo n.º 1
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Starting Retrieving data from Excel...");
            Console.WriteLine("");

            // Grab file and convert to byte array
            string filePath = @"C:\TestFile.xlsx";

            byte[] bytes = System.IO.File.ReadAllBytes(filePath);

            var importFileData = new ImportFileData
            {
                FileData = bytes,
                FileName = "Test File"
            };
            var modelState = new ModelStateDictionary();

            var import = ImportService.ImportFile(importFileData, modelState);

            Console.WriteLine(import);

            Console.WriteLine("");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
Ejemplo n.º 2
0
        public static async Task <ImportResult> ImportFile(ImportFileData importData, ModelStateDictionary modelState)
        {
            if ((importData.FileData.Length / 1024.0F / 1024.0F) > 1.1f)
            {
                AddModelError(
                    modelState,
                    "File exceeds maximum size of 1MB",
                    0
                    );
                return(null);
            }

            #region Variable Initialization

            IList <ImportRow>          rows;
            IList <ComicBookInventory> newComicBookInventory = new List <ComicBookInventory>();
            var expectedColumns = new[]
            {
                "issuenumber",
                "title",
                "description",
                "flag",
                "datepublished",
            };

            #endregion

            using (var document = ExcelParsingUtil.OpenDocumentFromByteArray(importData.FileData, true))
            {
                var worksheetPart = ExcelParsingUtil.GetWorksheetPartFromDocument(document, "");
                if (!ExcelParsingUtil.HasAnyRows(worksheetPart))
                {
                    AddModelError(
                        modelState,
                        "File is empty",
                        0
                        );
                    return(null);
                }

                #region Data Converter

                ImportRow DataConverter(IList <string> rowData, IList <string> columnNames,
                                        int rowNumber)
                {
                    if (expectedColumns.Except(columnNames).Any())
                    {
                        var exception = new Exception("Missing expected columns in data");
                        exception.Data.Add("rowNumber", rowNumber);
                        throw exception;
                    }

                    var importRow = new ImportRow
                    {
                        IssueNumber   = rowData[columnNames.IndexOf("issuenumber")].Trim(),
                        Title         = rowData[columnNames.IndexOf("title")].Trim(),
                        Description   = rowData[columnNames.IndexOf("description")].Trim(),
                        Flag          = rowData[columnNames.IndexOf("flag")].Trim(),
                        DatePublished = DateTime.FromOADate(double.Parse(rowData[columnNames.IndexOf("datepublished")].Trim())),
                        ItemGuid      = Guid.NewGuid(),
                        RowNumber     = rowNumber,
                    };

                    ValidateImportRow(importRow, modelState);

                    return(importRow);
                }

                #endregion

                #region Parse File and Validate

                try
                {
                    rows = ExcelParsingUtil.GetDataToList(
                        document,
                        DataConverter
                        );
                }
                catch (Exception e)
                {
                    var rowNumber = 0;
                    if (e.Data.Keys.Count > 0)
                    {
                        int.TryParse(e.Data["rowNumber"].ToString(), out rowNumber);
                    }
                    AddModelError(
                        modelState,
                        e.Message,
                        rowNumber
                        );
                    return(null);
                }

                if (!rows.Any())
                {
                    AddModelError(
                        modelState,
                        "No rows",
                        0
                        );
                    return(null);
                }

                if (TooManyErrors(modelState))
                {
                    return(null);
                }

                #endregion

                #region Loop Rows for each Sample Result for Review

                foreach (var row in rows)
                {
                    if (row == null)
                    {
                        continue;
                    }

                    try
                    {
                        ComicBookInventory currentComicBookInventory = null;
                        currentComicBookInventory = ProcessOneComicBook(row);
                        if (modelState.ErrorCount == 0)
                        {
                            newComicBookInventory.Add(currentComicBookInventory);
                        }
                    }
                    catch (Exception e)
                    {
                        AddModelError(
                            modelState,
                            e.Message,
                            row.RowNumber
                            );
                    }

                    if (!TooManyErrors(modelState))
                    {
                        continue;
                    }
                    break;
                }

                if (modelState.ErrorCount > 0)
                {
                    return(null);
                }

                #endregion

                #region Persist Sample Results for Review objects

                // Using a repository save these in a database
                // await repository.AddMultiple(newSampleResultReview);
                // await DbContext.SaveChangesAsync();

                #endregion
            }

            #region Create Import Stats for Front-end

            var importStats = new ImportResult
            {
                NumberOfRows = rows.Count,
                FileName     = importData.FileName
            };

            #endregion

            return(importStats);
        }