private void SaveExtractedData(DataOutputFormat dataOutputFormat, IEnumerable <IEnumerable <KeyValuePair <string, object> > > extractedDataCol)
        {
            ReturnMessage succesfullySaved;
            DataTable     extractedDataTable = null;

            switch (dataOutputFormat)
            {
            case DataOutputFormat.XLSX:
                extractedDataTable           = ExtractedDataConverter.GenerateDataTable(extractedDataCol);
                extractedDataTable.TableName = "ExtractedData";
                var newWorkbook = new XLWorkbook();
                newWorkbook.AddWorksheet(extractedDataTable);
                succesfullySaved = _xlioService.SaveWorkbook(Path.Combine(ExtractionDirectory, $"{DateTime.Now.Ticks} Output.xlsx"), newWorkbook);
                DisplaySuccessOrFailMessage(succesfullySaved);

                break;

            case DataOutputFormat.CSV:
                extractedDataTable = ExtractedDataConverter.GenerateDataTable(extractedDataCol);
                var generatedCSV = ExtractedDataConverter.ConvertToCSV(extractedDataTable);
                succesfullySaved = _ioService.SaveText(generatedCSV, Path.Combine(ExtractionDirectory, $"{DateTime.Now.Ticks} Output.csv"));
                DisplaySuccessOrFailMessage(succesfullySaved);

                break;

            default:
                break;
            }

            if (extractedDataTable != null)
            {
                ExtractedDataTable = extractedDataTable;
            }
        }
        private async Task <IEnumerable <ReturnMessage> > ExtractDataFromFiles(DirectoryInfo documentsDirectory, DataOutputFormat dataOutputFormat, IProgress <IEnumerable <ReturnMessage> > progress, CancellationToken cancellationToken)
        {
            if (documentsDirectory == null)
            {
                throw new ArgumentNullException("fileInfo", "Cannot be null");
            }
            if (cancellationToken == null)
            {
                throw new ArgumentNullException("cancellationToken", "Cannot be null");
            }

            var validExtensions = new string[] { ".xlsx", ".xlsm" };

            var extractedDataCol = new BlockingCollection <IEnumerable <KeyValuePair <string, object> > >();
            var returnMessages   = new BlockingCollection <ReturnMessage>();

            await Task.Run(() =>
            {
                //filter files to valid extensions, and ignore temporary Excel files if excel file is open.
                var documents        = documentsDirectory.GetFiles().Where(x => validExtensions.Contains(Path.GetExtension(x.FullName).ToLower()) && !x.Name.StartsWith(@"~$"));
                TotalExtractionCount = documents.Count();

                Parallel.ForEach(documents, (document) =>
                {
                    try
                    {
                        if (!cancellationToken.IsCancellationRequested)
                        {
                            var extractionRequests = DataRetrievalRequestCollectionToExtractionRequestCollection(DataRetrievalRequests);
                            var dataExtractor      = new DataExtractor(document.FullName);
                            foreach (var extraction in (dataExtractor.RetrieveDataCollectionFromAllWorksheets <object>(extractionRequests)))
                            {
                                extractedDataCol.Add(extraction);
                            }

                            returnMessages.Add(new ReturnMessage(true, $"{document.Name} successfully parsed and extracted from"));
                        }
                    }
                    catch (Exception e)
                    {
                        returnMessages.Add(new ReturnMessage(false, $"Failed to extract from {document.Name}.{Environment.NewLine}Error: {e.Message}"));
                    }

                    progress?.Report(returnMessages);
                });
            }, cancellationToken);

            if (extractedDataCol != null)
            {
                SaveExtractedData(dataOutputFormat, extractedDataCol);
            }
            else
            {
                throw new NoDataOutputtedException($"No detected in files at {documentsDirectory.FullName}", "No Data");
            }

            return(returnMessages);
        }