.Net Core: чтение данных из файлов CSV и Excel - PullRequest
0 голосов
/ 12 ноября 2018

Использование .net core & c # здесь.

У меня есть пользовательский интерфейс, с которого пользователь может загружать файлы Excel или CSV. После того, как они загрузят это, он перейдет в мой веб-API, который обрабатывает чтение данных из этих файлов и возвращает json.

Мой код API как:

 [HttpPost("upload")]
 public async Task<IActionResult> FileUpload(IFormFile file)
 {
     JArray data = new JArray();
     using (ExcelPackage package = new ExcelPackage(file.OpenReadStream()))
     {
        ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
        //Process, read from excel here and populate jarray
     }
      return Ok(data );
 }

В приведенном выше коде я использую EPPlus для чтения файла Excel. Для файла Excel все работает нормально, но не может прочитать CSV-файл, который является ограничением EPPlus.

Я искал и нашел другую библиотеку CSVHelper: https://joshclose.github.io/CsvHelper/ Проблема в том, что она работает наоборот и может читать из CSV, но не из Excel.

Есть ли какая-либо библиотека, которая поддерживает чтение из обоих?

Или было бы возможно использовать только EPPlus, но конвертировать загруженный CSV, чтобы преуспеть на лету, а затем читать. (обратите внимание, я не храню файл Excel где-либо, поэтому не могу использовать команду сохранения, чтобы сохранить его как файл Excel)

Любые входные данные, пожалуйста?

- Обновлено - добавлен код для чтения данных из Excel ---

 int rowCount = worksheet.Dimension.End.Row;
 int colCount = worksheet.Dimension.End.Column;

   for (int row = 1; row <= rowCount; row++)
   {
     for (int col = 1; col <= colCount; col++)
     {
         var rowValue = worksheet.Cells[row, col].Value;
     }
   }

//With the code suggested in the answer rowcount is always 1

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Здесь используется Aspose, который, к сожалению, не бесплатный, но это здорово работает.Мой API использует возможность потоковой передачи с Content-Type: multipart/form-data вместо реализации IFormFile:

[HttpPut]
[DisableFormValueModelBinding]
public async Task<IActionResult> UploadSpreadsheet()
{
    if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
    {
        return BadRequest($"Expected a multipart request, but got {Request.ContentType}");
    }

    var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit);
    var reader = new MultipartReader(boundary, HttpContext.Request.Body);

    var section = (await reader.ReadNextSectionAsync()).AsFileSection();

    //If you're doing CSV, you add this line:
    LoadOptions loadOptions = new LoadOptions(LoadFormat.CSV);

    var workbook = new Workbook(section.FileStream, loadOptions);
    Cells cells = workbook.Worksheets[0].Cells;
    var rows = cells.Rows.Cast<Row>().Where(x => !x.IsBlank);

    //Do whatever else you want here
0 голосов
/ 12 ноября 2018

Вы можете использовать EPPLus и MemoryStream для открытия CSV-файлов в ExcelPackage без записи в файл.Ниже приведен пример.Возможно, вам придется изменить некоторые параметры на основе спецификаций вашего CSV-файла.

[HttpPost("upload")]
public async Task<IActionResult> FileUpload(IFormFile file)
{
    var result = string.Empty;
    string worksheetsName = "data";

    bool firstRowIsHeader = false;
    var format = new ExcelTextFormat();
    format.Delimiter = ',';
    format.TextQualifier = '"';

    using (var reader = new System.IO.StreamReader(file.OpenReadStream()))
    using (ExcelPackage package = new ExcelPackage())
    {
         result = reader.ReadToEnd();
         ExcelWorksheet worksheet = 
         package.Workbook.Worksheets.Add(worksheetsName);
         worksheet.Cells["A1"].LoadFromText(result, format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
    }     
}
...