我正在尝试使用NPOI.XSSF库创建一个Excel报告。当我使用FileStream保存到磁盘文件时,它工作正常,但是,如果我使用内存流并尝试将其上传到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));
}
}
我做错了什么导致文件损坏?
我认为问题是您在第一个GetBuffer
上使用了GetBuffer
创建了第二个。从MemoryStream
:
备注
请注意,缓冲区包含分配的字节,这些字节可能未使用。例如,如果将字符串“ test”写入
MemoryStream
对象,则从documentation返回的缓冲区的长度为256,而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用MemoryStream
方法;但是,MemoryStream
在内存中创建数据的副本。
[可能发生的是,您在缓冲区的流末尾得到了多余的零字节。 Excel不知道如何处理多余的字节,因此它声明工作簿已损坏。由于XLSX是一种压缩格式,因此带有多余零的文件大小完全有可能与没有多余零的情况相同,因此您可能无法仅通过查看来分辨出来。
总之,应该使用GetBuffer
来防止损坏。
要解决,请更改此行:
GetBuffer
为此:
ToArray
要将文件上传到Azure blob,可以使用Microsoft提供的默认“ Azure.Storage.Blobs”库。然后创建对容器的引用,并在blob.upload(path)中提供文件的路径。
链接:ToArray