C# excel文件托管在Azure Blob上,如何将其读入文件流?
我使用c#将文件上载到Azure Blob。 现在我想使用ExcelDataReader读取上传的文件 我正在使用下面的代码。 其中\u imageRootPathNos是保存文件的路径()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格式
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返回的流。做