/// <summary> /// Processes the given CSV file. /// </summary> /// <param name="file">File path.</param> /// <returns>Processed file.</returns> private ExcelDataImportResultModel ProcessCsvFile(string file) { DataRow row = null; DataTable tab = null; ExcelDataImportResultModel ret = null; try { using (var reader = new StreamReader(file)) { using (var csv = new CsvHelper.CsvReader(reader)) { while (csv.Read() && csv.CurrentRecord != null) { if (tab == null) { tab = new DataTable(); if (csv.FieldHeaders != null && csv.FieldHeaders.Any()) { row = new DataRow(); foreach (var v in csv.FieldHeaders) { row.Cells.Add(new DataCell() { Value = v }); } tab.Rows.Add(row); } } row = new DataRow(); foreach (var v in csv.CurrentRecord) { row.Cells.Add(new DataCell() { Value = v }); } tab.Rows.Add(row); } } } } catch (System.IO.IOException) { } catch (CsvHelper.CsvReaderException) { } if (tab != null) { ret = new ExcelDataImportResultModel(); ret.SheetData.Add(tab); } return(ret); }
public async Task <ExcelDataImportResultModel> UploadData() { long fileSize = 0; int maxSizeKb = 1024; string root = string.Empty; MultipartFileData file = null; ExcelDataImportResultModel ret = null; MultipartFormDataStreamProvider provider = null; if (!this.Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Uploads"); provider = new MultipartFormDataStreamProvider(root); await this.Request.Content.ReadAsMultipartAsync(provider); file = provider.FileData.FirstOrDefault(); if (file != null) { if (File.Exists(file.LocalFileName)) { fileSize = new FileInfo(file.LocalFileName).Length; if ((fileSize / maxSizeKb) <= maxSizeKb) { ret = ProcessUploadedFile(file); } if (ret != null) { ret.FileSize = fileSize; } try { File.Delete(file.LocalFileName); } catch { } } } return(ret); }
/// <summary> /// Processes uploaded file. /// </summary> /// <param name="file">File.</param> /// <returns>The result of file processing.</returns> private ExcelDataImportResultModel ProcessUploadedFile(MultipartFileData file) { string fileName = string.Empty; ExcelDataImportResultModel ret = null; if (file.Headers != null && file.Headers.ContentDisposition != null && !string.IsNullOrEmpty(file.Headers.ContentDisposition.FileName)) { fileName = file.Headers.ContentDisposition.FileName.Trim().Trim('\"').Trim(); if (fileName.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)) { ret = ProcessCsvFile(file.LocalFileName); } else if (fileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) { ret = ProcessXlsxFile(file.LocalFileName); } } return(ret); }
/// <summary> /// Processes the given XLSX file. /// </summary> /// <param name="file">File path.</param> /// <returns>Processed file.</returns> private ExcelDataImportResultModel ProcessXlsxFile(string file) { DataRow row = null; DataTable tab = null; List <string> r = null; string v = string.Empty; int sheetIndex = 0, sheetOffset = 0; ExcelDataImportResultModel ret = null; List <string> sheets = new List <string>(); OfficeOpenXml.ExcelWorkbook workbook = null; List <List <string> > data = new List <List <string> >(); bool hasData = false, hasFullData = false, hasRowData = false; List <List <List <string> > > fullData = new List <List <List <string> > >(); int maxColumns = 25, maxRows = 25, longestRow = 0, offset = 0, i = 0, j = 0; using (var package = new OfficeOpenXml.ExcelPackage(new FileInfo(file))) { workbook = package.Workbook; if (workbook != null && workbook.Worksheets != null && workbook.Worksheets.Any()) { if (workbook.Worksheets.Count > 1) { sheets.AddRange(workbook.Worksheets.Select(s => s.Name)); } foreach (var s in workbook.Worksheets) { hasData = false; data.Clear(); for (i = 1; i <= maxRows; i++) { data.Add(new List <string>()); hasRowData = false; for (j = 1; j <= maxColumns; j++) { v = s.Cells[i, j].GetValue <string>(); if (!hasRowData) { hasRowData = !string.IsNullOrWhiteSpace(v); } if (!hasData) { hasData = hasRowData; } data[data.Count - 1].Add(v); } if (!hasRowData) { data.RemoveAt(data.Count - 1); } else if (data[data.Count - 1].Count > longestRow) { offset = 0; r = data[data.Count - 1]; while (string.IsNullOrWhiteSpace(r[r.Count - offset - 1]) && offset < (r.Count - 1)) { offset++; } if (r.Count - offset > longestRow) { longestRow = r.Count - offset; } } } if (hasData) { for (i = 0; i < data.Count; i++) { if (data[i].Count > longestRow) { data[i].RemoveRange(longestRow, data[i].Count - longestRow); } } hasFullData = true; fullData.Add(new List <List <string> >(data.Select(d => new List <string>(d)))); } else if ((sheetIndex - sheetOffset) >= 0 && (sheetIndex - sheetOffset) < sheets.Count) { sheets.RemoveAt(sheetIndex - sheetOffset); sheetOffset++; } sheetIndex++; } } } if (hasFullData) { ret = new ExcelDataImportResultModel(); ret.AvailableSheets = sheets; foreach (var fd in fullData) { tab = new DataTable(); for (i = 0; i < fd.Count; i++) { row = new DataRow(); for (j = 0; j < fd[i].Count; j++) { row.Cells.Add(new DataCell() { Value = fd[i][j] }); } tab.Rows.Add(row); } ret.SheetData.Add(tab); } } return(ret); }