ExcelDataReader可以从任何流中读取数据,而不仅仅是FileStream . 您可以使用WebClient(已废弃),HttpClient或Azure SDK来打开流并读取blob .
无论如何,读取或下载blob都会打开并读取流 . 而不是例如 . 下载blob或在缓冲区中读取其所有内容,您可以直接访问流 . 无论您使用哪种技术,最后都会在单个URL上打开一个流进行读取 .
在您的情况下,您可以下载并保留文件以重复使用它,或者您可以直接从流中读取 . 如果您没有写入磁盘文件的权限,或者您同时处理多个请求并且不想处理临时文件存储,则可能希望在Web应用程序中执行此操作 .
使用HttpClient,您可以使用GetStreamAsync方法打开流:
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,您可以使用CloudBlob.OpenRead方法:
var blob = container.GetBlockBlobReference("Imex.xlsx");
using(var stream=await blob.OpenReadAsync())
{
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//Process the data
}
您可能希望将数据存储在内存缓冲区或文件中,例如用于缓存或重新处理 . 为此,您可以分别创建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);
//...
}
要下载文件,您可以使用FileStream替换MemoryStream .