public async Task <IActionResult> ImportCsvAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            var results         = new List <ClientDto>();
            var headers         = Request.Form.Where(p => p.Key == "headers").Select(p => p.Value.FirstOrDefault()).FirstOrDefault()?.DeSerialize <Dictionary <string, int> >();
            var delimiter       = Request.Form.Where(p => p.Key == "delimiter").Select(p => p.Value.FirstOrDefault()).FirstOrDefault()?.DeSerialize <string>();
            var hasHeaderRecord = Request.Form.Where(p => p.Key == "hasHeaderRecord").Select(p => p.Value.FirstOrDefault())?.FirstOrDefault().DeSerialize <bool>();

            foreach (var file in Request.Form.Files)
            {
                if (file.Length <= 0 || file.FileName == null)
                {
                    continue;
                }
                using (var stream = file.OpenReadStream())
                    using (var reader = new StreamReader(stream))
                        using (var csv = new CsvReader(reader))
                        {
                            // we can and will miss fields
                            csv.Configuration.MissingFieldFound = null;
                            // csv.Configuration.Encoding = new System.Text.UTF8Encoding();
                            csv.Configuration.Delimiter       = delimiter ?? ",";
                            csv.Configuration.HasHeaderRecord = hasHeaderRecord ?? true;

                            if (headers != null)
                            {
                                var map        = new CsvHelper.Configuration.DefaultClassMap <ClientDto>();
                                var clientType = typeof(ClientDto);
                                foreach (var memberName in headers.Keys)
                                {
                                    var member = clientType.GetMember(memberName).FirstOrDefault();
                                    if (member == null)
                                    {
                                        continue;
                                    }
                                    map.Map(typeof(ClientDto), member).Index(headers[memberName]);
                                }
                                csv.Configuration.RegisterClassMap(map);
                                // csv.Configuration.PrepareHeaderForMatch = (string header, int index) => string.IsNullOrWhiteSpace(headers[index]) ? header : headers[index];
                            }
                            var records = csv.GetRecords <ClientDto>();
                            foreach (var clientDto in records)
                            {
                                var record    = _mapper.Map <IClient>(clientDto);
                                var newClient = await service.CreateAsync(record, cancellationToken);

                                results.Add(_mapper.Map <ClientDto>(newClient));
                            }
                        }
            }
            return(Ok(ApiModel.AsSuccess(results)));
        }
Пример #2
0
        /// <summary>
        /// Processes and writes the CSV or Fixed format.
        /// </summary>
        /// <returns>CSV or Fixed file</returns>
        private byte[] WriteCsvToMemory(IEnumerable <StationData> records, string[] columns, DownloadFormatEnum downloadFormat)
        {
            // Use the streams and writers to generate the file
            using (var memoryStream = new MemoryStream())
                using (var streamWriter = new StreamWriter(memoryStream))
                    using (var csvWriter = new CsvWriter(streamWriter))
                    {
                        // Remove delimeter for fixed format
                        // Remove header row for fixed format
                        if (downloadFormat == DownloadFormatEnum.Fixed)
                        {
                            csvWriter.Configuration.Delimiter       = "";
                            csvWriter.Configuration.TrimOptions     = CsvHelper.Configuration.TrimOptions.None;
                            csvWriter.Configuration.ShouldQuote     = (field, context) => false;
                            csvWriter.Configuration.HasHeaderRecord = false;
                        }

                        // Configure the columns to write to the file
                        var map = new CsvHelper.Configuration.DefaultClassMap <StationData>();
                        foreach (var column in columns)
                        {
                            var property = typeof(StationData).GetProperty(column.Replace("_", ""));

                            // Use the FixedWidthConverter for the fixed format
                            if (downloadFormat == DownloadFormatEnum.Fixed)
                            {
                                map.Map(typeof(StationData), property).TypeConverter <FixedWidthConverter>();
                            }
                            else
                            {
                                map.Map(typeof(StationData), property);
                            }
                        }
                        csvWriter.Configuration.RegisterClassMap(map);

                        // Write the records and flush
                        csvWriter.WriteRecords(records);
                        streamWriter.Flush();
                        return(memoryStream.ToArray());
                    }
        }