.net core 如何在内存中处理Excel文件?

.net core 如何在内存中处理Excel文件?,.net-core,asp.net-apicontroller,.net Core,Asp.net Apicontroller,我正在尝试创建一个API,该API将接受来自客户端的Excel文件的表示形式。我希望在处理完第一张表之后,以JSON数组的形式返回一个列表。但是,我无法将文件写入磁盘,所有处理必须在内存中进行。实现这一目标的途径是什么 我试着参考互联网上的各种解决方案,但它们都涉及将文件写入磁盘,然后使用该文件进行进一步处理。我愿意接受涉及以下方面的解决方案: 从POST请求主体接受文件的base-64表示形式 接受文件作为多部分/表单数据请求的一部分 接受文件的任何其他标准请求格式 唯一的条件是API应该返回

我正在尝试创建一个API,该API将接受来自客户端的Excel文件的表示形式。我希望在处理完第一张表之后,以JSON数组的形式返回一个列表。但是,我无法将文件写入磁盘,所有处理必须在内存中进行。实现这一目标的途径是什么

我试着参考互联网上的各种解决方案,但它们都涉及将文件写入磁盘,然后使用该文件进行进一步处理。我愿意接受涉及以下方面的解决方案:

  • 从POST请求主体接受文件的base-64表示形式
  • 接受文件作为多部分/表单数据请求的一部分
  • 接受文件的任何其他标准请求格式

  • 唯一的条件是API应该返回电子表格的JSON数组表示形式。

    这里我将一个文件作为多部分/表单数据请求的一部分发送给用.NET core编写的API

    支持.xlsx、.xls和.csv格式

    使用ExcelDataReader和ExcelDataReader.DataSet NuGet包读取excel并在数据集中转换

    这里是我在.NETCore中面临的一个问题和解决方案

    默认情况下,ExcelDataReader在.NET Core上抛出NotSupportedException“没有可用于编码1252的数据”

    要修复此问题,请向包System.Text.Encoding.CodePages添加依赖项,然后添加代码以在API的开头注册代码页

    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); 这是解析用DOS era代码页编码的二进制BIFF2-5 Excel文档中的字符串所必需的。默认情况下,这些编码在完整的.NET Framework中注册,但不在.NET Core上注册

    public ActionResult ExcelOrCsvToArray()
    {
    如果(Request.Form.Files.Count>0)
    {
    ifformfile file=Request.Form.Files[0];
    字符串文件名=file.fileName;
    字符串fileContentType=file.ContentType;
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    Stream=file.OpenReadStream();
    尝试
    {
    if(fileName.EndsWith(“.csv”))
    {
    使用(var reader=ExcelReaderFactory.CreateCsvReader(流))
    {
    var结果=SetAsDataSet(读卡器);
    DataTable=结果表[0];
    返回新的OkObjectResult(表);
    }
    }
    其他的
    {
    使用(var reader=ExcelReaderFactory.CreateReader(流))
    {
    var结果=SetAsDataSet(读卡器);
    DataTable=结果表[0];
    返回新的OkObjectResult(表);
    }
    }
    }
    捕获(例外e)
    {
    返回新的BadRequestObjectResult(e);
    }
    }
    其他的
    {
    返回新的BadRequestResult();
    }
    }
    私有数据集SetAsDataSet(IExcelDataReader)
    {
    var result=reader.AsDataSet(新的ExcelDataSetConfiguration()
    {
    ConfigureDataTable=(\u)=>new ExcelDataTableConfiguration()
    {
    UseHeaderRow=true,
    }
    });
    返回结果;
    }
    
    您计划使用哪个库进行数据提取?使用接受数据流的.NET Excel库来加载数据,并给它一个MemoryStream。@DervişKayımbaşıoğlu我愿意使用任何公开提供的库。@AndrewMorton有没有我可以利用的示例?他有一个例子。如果您最终使用EPPlus,请务必检查EPPlus的许可证。