.Net Core:从CSV和Excel文件读取数据

时间:2018-11-12 17:56:24

标签: c# excel csv asp.net-core epplus

在此处使用.net core和c#。

我有一个用户界面,用户可以从中上传Excel或CSV文件。他们上传后,将其发送到我的网络api,该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)

请输入任何内容?

-已更新-添加了用于从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

3 个答案:

答案 0 :(得分:0)

您可以使用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);
    }     
}

答案 1 :(得分:0)

这里使用的是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

答案 2 :(得分:0)

请尝试使用以下代码

 private string uploadCSV(FileUpload fl)
    {
        string fileName = "";
        serverLocation = Request.PhysicalApplicationPath + "ExcelFiles\\";
        fileName = fl.PostedFile.FileName;
        int FileSize = fl.PostedFile.ContentLength;
        string contentType = fl.PostedFile.ContentType;
        fl.PostedFile.SaveAs(serverLocation + fileName);

        string rpath = string.Empty, dir = string.Empty;
        HttpContext context = HttpContext.Current;
        string baseUrl = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + context.Request.ApplicationPath.TrimEnd('/') + '/';

        try
        {
            rpath = serverLocation + fileName;//Server.MapPath(dir + fileName);

            using (Stream InputStream = fl.PostedFile.InputStream)
            {
                Object o = new object();
                lock (o)
                {
                    byte[] buffer = new byte[InputStream.Length];
                    InputStream.Read(buffer, 0, (int)InputStream.Length);
                    lock (o)
                    {
                        File.WriteAllBytes(rpath, buffer);
                        buffer = null;
                    }
                    InputStream.Close();
                }
            }

        }
        catch (Exception ex)
        {
            lblSOTargetVal.Text = ex.Message.ToString();
        }
        return rpath;
    }