C# 如何将blob(Excel文件)上载到Azure存储帐户

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)

我正在尝试使用NPOI.XSSF库创建Excel报表。当我使用
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被压缩了,谢谢!没问题;很高兴我能帮忙。