C# 如何将blob(Excel文件)上载到Azure存储帐户
我正在尝试使用NPOI.XSSF库创建Excel报表。当我使用C# 如何将blob(Excel文件)上载到Azure存储帐户,c#,azure,azure-storage-blobs,npoi,C#,Azure,Azure Storage Blobs,Npoi,我正在尝试使用NPOI.XSSF库创建Excel报表。当我使用FileStream保存到磁盘文件中时,它工作正常;但是,如果我使用MemoryStream并尝试将其上载到Azure存储帐户,它会上载大小正确的文件,但当我尝试使用excel打开它时,它已损坏 这是我的代码: public static void ExportToStorageAccount(string storageConnection, IEnumerable<ReportEntry> reportEntries)
FileStream
保存到磁盘文件中时,它工作正常;但是,如果我使用MemoryStream
并尝试将其上载到Azure存储帐户,它会上载大小正确的文件,但当我尝试使用excel打开它时,它已损坏
这是我的代码:
public static void ExportToStorageAccount(string storageConnection, IEnumerable<ReportEntry> reportEntries)
{
var storageAccount = CloudStorageAccount.Parse(storageConnection);
var myClient = storageAccount.CreateCloudBlobClient();
var container = myClient.GetContainerReference("reportsContainer");
string fileName = GetFileName();
using (var ms = new MemoryStream())
{
IWorkbook workbook = CreateWorkbook(reportEntries);
workbook.Write(ms);
var blockBlob = container.GetBlockBlobReference(fileName);
var buffer = ms.GetBuffer();
blockBlob.UploadFromStream(new MemoryStream(buffer, false));
}
}
public static void ExportToStorageAccount(string-storageConnection,IEnumerable-reportEntries)
{
var storageAccount=CloudStorageAccount.Parse(storageConnection);
var myClient=storageAccount.CreateCloudBlobClient();
var container=myClient.GetContainerReference(“reportsContainer”);
字符串fileName=GetFileName();
使用(var ms=new MemoryStream())
{
IWorkbook工作簿=创建工作簿(reportEntries);
练习册。书写(ms);
var blockBlob=container.GetBlockBlobReference(文件名);
var buffer=ms.GetBuffer();
blockBlob.UploadFromStream(新内存流(缓冲区,false));
}
}
我做错了什么导致文件损坏?要将文件上载到Azure blob,可以使用microsoft提供的默认“Azure.Storage.blob”库。然后创建对容器的引用,并在blob.upload(path)中提供文件的路径。我认为问题在于您使用第一个来创建第二个。从: 评论 请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入对象,则从返回的缓冲区长度为256,而不是4,未使用252字节。要仅获取缓冲区中的数据,请使用以下方法:;但是,会在内存中创建数据的副本 可能发生的情况是,在缓冲区中的流末尾,您会得到不需要的额外零字节。Excel不知道如何处理多余的字节,因此它声明工作簿已损坏。因为XLSX是一种压缩格式,所以完全有可能有额外的零和没有它们的文件大小相同,所以您可能无法通过查看来判断 简言之,你应该用它来防止腐败 若要修复,请更改此行:
var buffer = ms.GetBuffer();
为此:
var buffer = ms.ToArray();
是的,就是这样。另外,我不知道xlsx被压缩了,谢谢!没问题;很高兴我能帮忙。