Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# excel文件托管在Azure Blob上,如何将其读入文件流?_C#_Excel_Azure - Fatal编程技术网

C# excel文件托管在Azure Blob上,如何将其读入文件流?

C# excel文件托管在Azure Blob上,如何将其读入文件流?,c#,excel,azure,C#,Excel,Azure,我使用c#将文件上载到Azure Blob。 现在我想使用ExcelDataReader读取上传的文件 我正在使用下面的代码。 其中\u imageRootPathNos是保存文件的路径() FileStream stream = System.IO.File.Open(_imageRootPathNos + "/" + "ImEx.xlsx", FileMode.Open, FileAccess.Read); 我收到一个错误System.ArgumentException:“不支持URI格式

我使用c#将文件上载到Azure Blob。 现在我想使用ExcelDataReader读取上传的文件

我正在使用下面的代码。 其中\u imageRootPathNos是保存文件的路径()

FileStream stream = System.IO.File.Open(_imageRootPathNos + "/" + "ImEx.xlsx", FileMode.Open, FileAccess.Read);
我收到一个错误System.ArgumentException:“不支持URI格式。”


我缺少什么?

在使用Azure存储服务时,建议您使用Azure.NET SDK。SDK公开了下载、上载和管理容器和blob存储的适当方法。在这种情况下,您的代码应该如下所示:

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("files");

// Retrieve reference to a blob named "imex.xlsx".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("Imex.xlsx");

// Save blob contents to a file.
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
    blockBlob.DownloadToStream(fileStream);
}

您可以在此处找到有关如何使用SDK的所有信息:

使用Azure存储服务时,建议您使用Azure.NET SDK。SDK公开了下载、上载和管理容器和blob存储的适当方法。在这种情况下,您的代码应该如下所示:

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("files");

// Retrieve reference to a blob named "imex.xlsx".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("Imex.xlsx");

// Save blob contents to a file.
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
    blockBlob.DownloadToStream(fileStream);
}

您可以在此处找到有关如何使用SDK的所有信息:

我使用这段代码将excel文件(上传到azure上)读取到数据集中

Uri blobUri = new Uri(_imageRootPath + "/" + fileName);
                var wc = new WebClient();
                var sourceStream = wc.DownloadData(blobUri);
                Stream memoryStream = new MemoryStream(sourceStream);
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(memoryStream);
                DataSet dsResult = excelReader.AsDataSet();
                return dsResult;

我使用这段代码将excel文件(上传到azure上)读取到数据集中

Uri blobUri = new Uri(_imageRootPath + "/" + fileName);
                var wc = new WebClient();
                var sourceStream = wc.DownloadData(blobUri);
                Stream memoryStream = new MemoryStream(sourceStream);
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(memoryStream);
                DataSet dsResult = excelReader.AsDataSet();
                return dsResult;

您无法使用标准FileTeam访问Azure Blob存储文件。正如Chris在回答中所建议的,您可以使用Azure SDK访问该文件。或者,您可以使用

另一种解决方案是使用并创建映射到文件存储的网络驱动器。然后,您可以使用代码访问该文件,就像它位于本地或网络存储系统上一样

这两种服务在技术上有很多不同之处。
按照定价,Azure文件存储比Azure Blob存储更昂贵,但是根据预期用途,两者都非常便宜。

您无法使用标准的FileTeam访问Azure Blob存储文件。正如Chris在回答中所建议的,您可以使用Azure SDK访问该文件。或者,您可以使用

另一种解决方案是使用并创建映射到文件存储的网络驱动器。然后,您可以使用代码访问该文件,就像它位于本地或网络存储系统上一样

这两种服务在技术上有很多不同之处。
按照定价,Azure文件存储比Azure Blob存储更昂贵,但根据预期用途,两者都非常便宜。

ExcelDataReader可以从任何流读取数据,而不仅仅是文件流。您可以使用WebClient(过时)、HttpClient或Azure SDK打开流并读取blob

读取或下载blob会打开并读取流。您可以直接访问流,而不是下载blob或读取缓冲区中的所有内容。不管您使用哪种技术,最终都会在单个URL上打开一个流进行读取

在您的情况下,您可以下载并保存该文件以重用它,也可以直接从流中读取。如果您没有写入磁盘文件的权限,或者您同时处理多个请求,并且不想处理临时文件存储,那么您可能希望在web应用程序中执行此操作

使用HttpClient,您可以使用以下方法打开流:

var client=new HttpClient();
client.BaseAddress = new Uri("https://imor.blob.core.windows.net/files");
// Set headers and credentials
// ...
using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
{
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    //Process the data
}
使用Azure SDK,您可以使用以下方法:

您可能希望将数据存储在内存缓冲区或文件中,例如用于缓存或重新处理。为此,您可以分别创建MemoryStream或FileStream,并将数据从blob流复制到目标流

使用HttpClient,您可以使用以下内容填充内存缓冲区:

//To avoid reallocations, create a buffer large enough to hold the file

using(var memStream=new MemoryStream(65536)) 
{
    using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
    {
        await stream.CopyToAsync(memStream);
    }
    memStream.Position=0;
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
}
使用SDK:

using(var memStream=new MemoryStream(65536)) 
{
    //.....
    var blob = container.GetBlockBlobReference("Imex.xlsx");
    await stream.DownloadToStreamAsync(memStream);
    memStream.Position=0;
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
    //...
}

要下载文件,可以用文件流替换MemoryStream。

ExcelDataReader可以从任何流读取数据,而不仅仅是文件流。您可以使用WebClient(过时)、HttpClient或Azure SDK打开流并读取blob

读取或下载blob会打开并读取流。您可以直接访问流,而不是下载blob或读取缓冲区中的所有内容。不管您使用哪种技术,最终都会在单个URL上打开一个流进行读取

在您的情况下,您可以下载并保存该文件以重用它,也可以直接从流中读取。如果您没有写入磁盘文件的权限,或者您同时处理多个请求,并且不想处理临时文件存储,那么您可能希望在web应用程序中执行此操作

使用HttpClient,您可以使用以下方法打开流:

var client=new HttpClient();
client.BaseAddress = new Uri("https://imor.blob.core.windows.net/files");
// Set headers and credentials
// ...
using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
{
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    //Process the data
}
使用Azure SDK,您可以使用以下方法:

您可能希望将数据存储在内存缓冲区或文件中,例如用于缓存或重新处理。为此,您可以分别创建MemoryStream或FileStream,并将数据从blob流复制到目标流

使用HttpClient,您可以使用以下内容填充内存缓冲区:

//To avoid reallocations, create a buffer large enough to hold the file

using(var memStream=new MemoryStream(65536)) 
{
    using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
    {
        await stream.CopyToAsync(memStream);
    }
    memStream.Position=0;
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
}
使用SDK:

using(var memStream=new MemoryStream(65536)) 
{
    //.....
    var blob = container.GetBlockBlobReference("Imex.xlsx");
    await stream.DownloadToStreamAsync(memStream);
    memStream.Position=0;
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
    //...
}

要下载文件,您可以用文件流替换MemoryStream。

我建议您使用“想要”而不是“需要”,您可以直接使用JSON和web api。我建议使用SDK,因为它有助于保护代码不受Azure存储API中更改的影响。OP正在尝试使用ExcelDataReader,它可以从任何流读取数据,包括HttpClient返回的流。下载对于网站、web应用程序或无服务器应用程序来说不是一个好主意,在这些应用程序中,由于权限或可伸缩性的原因,写入临时文件夹是不实用的。为我辩护,尽管我可能很迂腐,但他没有提到他试图在web应用程序上实现这一点。不过,我同意使用您提出的解决方案可能更合适。我建议“想要”而不是“需要”,您可以直接使用JSON和web api。我建议使用SDK,因为它有助于保护代码不受Azure存储API中更改的影响。OP正在尝试使用ExcelDataReader,它可以从任何流读取数据,包括HttpClient返回的流。做