首页 > 解决方案 > 当我尝试在 Azure DataLake 中写入文件时,我得到的方法不受支持

问题描述

我正在尝试在系统中以天蓝色写入文件,但出现一个我无法弄清楚的错误。该代码适用于我的环境,但不适用于 zure。

我在不同的环境中尝试了我的代码,除了天蓝色之外,它们都可以工作。

下面是我的代码。

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        await _dlsService.Init();
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        log.LogInformation("Processing request: " + requestBody);
        CDTO cFile = JsonConvert.DeserializeObject<CDTO>(requestBody);

        string filePath = $"{cFile.DataLakeFolder}/{cFile.FileName}";
        var summary = _dlsService.GetMetadata(filePath);
        //string csvFileName = @"";

        try
        {
            string pathToFile = $"{cFile.DataLakeFolder}/x.xlsx";

            using (var str = await _dlsService.CreateFile(pathToFile))
            {

                using (var streamReader =  await _dlsService.OpenStream(filePath))
                {
                    StreamReader sr = new StreamReader(streamReader);
                    var parser = new CsvParser(sr);

                    //get the first row of csv as the header 
                    var header = parser.Read();
                    if (header == null)
                        return null;
                    var columns = header.ToList();
                    //check if there are empty columns
                    columns.RemoveAll(o => string.IsNullOrWhiteSpace(o));
                    int i = 1;
                    using (var report = new Application.Helpers.ExcelReportHelper(str)) // **this line gives me error** 
                    {
                        report.WriteHeader(columns);
                        if (i >= 1)
                        {
                            //if (parser.read == null) break, else continue to write the excel
                            //..work work work ...

                        }
                        report.Save();
                    }
                }
            }
            return new ObjectResult(new { fileCreated = pathToFile });
        }
        catch (Exception ex)
        {
            log.LogInformation("Processing request: " + ex.Message);
            return ErrorHandler.HandleException(ex, log);
        }
  }

比我的 excelhelper 类是:

class ExcelReportHelper : IDisposable
{
    private ExcelPackage _package;
    private string _currentQueryName;

    public ExcelReportHelper(Stream destStream)
    {
        _package = new ExcelPackage(destStream); // **this is the line that raises the error**
        _package.Workbook.Worksheets.Add("Sheet1");
    }

    //bla bla bla
    //bla bla bla
 }

关于如何解决这个问题的任何想法?我非常需要一些帮助。谢谢 :)

PS:这是堆栈跟踪:

{System.NotSupportedException: Specified method is not supported.
        at Microsoft.Azure.DataLake.Store.AdlsOutputStream.get_Length()
        at OfficeOpenXml.ExcelPackage..ctor(Stream newStream)
        at Roar.EnrolService.Application.Helpers.ExcelReportHelper..ctor(Stream destStream) in  

C:\Projects\Roar\Roar.Ingestion\Roar.EnrolService\Application\Helpers\ExcelReportHelper.cs:line 16
   at 
 Roar.EnrolService.Functions.FileConversion.FromCsvToExcelFunction.Run(HttpRequest req, ILogger log) in C:\Projects\Roar\Roar.Ingestion\Roar.EnrolService\Functions\FileConversion\FromCsvToExcelFunction.cs:line 66}

标签: c#excelazurecsvazure-data-lake

解决方案


使用 ExcelPackage 需要您安装 Excel。

可能它适用于您的环境,因为您拥有 Excel,并且在 Azure 中不起作用(不确定您在 Azure 中的哪个位置运行代码),因为代码无法访问那里的 Excel。


推荐阅读