C#Azure文件存储CloudFile.OpenWrite与OpenXml.SpreadsheetDocument问题…需要FileMode和FileAccess选项?

我正在处理DocumentFormat.OpenXml.SpreadsheetDocument并打开Excel文档的模板,写入并保存它。

它像一个正常的文件stream的魅力:

using (var documentStream = System.IO.File.Open("--somePath--", FileMode.Open, FileAccess.ReadWrite)) { using (var document = SpreadsheetDocument.Open(documentStream, true)) { // do something } } 

注意SpreadsheetDocument.Open

现在,我正在将此应用程序重写为Azure,并在“WindowsAzure.Storage”包中使用Azure存储和.NET文件库。

它的作用就像一个魅力,所有这一切都要在Azure中填写相同的Excel文件。

 using (var documentStream = _GetRootDirectoryOfAccount().GetFileReference("--someRelativePath--").OpenWrite(null)) { using (var document = SpreadsheetDocument.Open(documentStream, true)) { // do something } } 

第一部分“ _GetRootDirectoryOfAccount()。GetFileReference ”工作100%,然后OpenWrite(null)确实打开一个stream。

但是,当该stream被推向电子表格时:

 SpreadsheetDocument.Open(documentStream, true) 

它打破了:

System.IO.IOException:'无法打开包,因为FileMode或FileAccess值对stream无效。

这是因为在stream上的设置没有设置:

System.IO.File.Open(“ – somePath–”, FileMode.Open,FileAccess.ReadWrite

有谁知道如何解决这个问题? 还是解决scheme?

请 :)

有谁知道如何解决这个问题? 还是解决scheme?

_ GetRootDirectoryOfAccount().GetFileReference("--someRelativePath--").OpenWrite(null))的返回types是CloudFileStream

似乎CloudFileStream 被SpreadsheetDocument.Open() 支持

请尝试使用下面的代码,它在我身边正常工作。 更新内容后,我们可以使用file.UploadFromFile()或file.UploadFromStream()来上传文件。

 var file = _GetRootDirectoryOfAccount().GetFileReference("--someRelativePath--"); var memoryStream = new MemoryStream(); file.DownloadToStream(memoryStream); using (var document = SpreadsheetDocument.Open(memoryStream, true)) { // do something } 

以下是我的演示代码。

 var connectionString = "DefaultEndpointsProtocol=https;AccountName=accountName;AccountKey=xxxxx;EndpointSuffix=core.windows.net"; CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); // Get a reference to the file share we created previously. CloudFileShare share = fileClient.GetShareReference("test"); //share name if (share.Exists()) { // Get a reference to the root directory for the share. CloudFileDirectory rootDir = share.GetRootDirectoryReference(); // Get a reference to the directory we created previously. CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("custom"); // Ensure that the directory exists. if (sampleDir.Exists()) { // Get a reference to the file we created previously. var file = sampleDir.GetFileReference("OpenXMl.xlsx"); //file name // Ensure that the file exists. if (file.Exists()) { // Write the contents of the file to the console window. Console.WriteLine(file.DownloadTextAsync().Result); var memoryStream = new MemoryStream(); file.DownloadToStream(memoryStream); using (var document = SpreadsheetDocument.Open(memoryStream, true)) { // do something } } } }