OpenXml.SpreadsheetDocument 的 C# Azure 文件存储 CloudFile.OpenWrite 问题...需要 FileMode 和 FileAccess 选项?
C# Azure File Storage CloudFile.OpenWrite issue with OpenXml.SpreadsheetDocument...need FileMode and FileAccess options?
我正在使用 DocumentFormat.OpenXml.SpreadsheetDocument 并打开 Excel 文档的模板,写入并保存它。
它像普通文件流中的魅力一样工作:
using (var documentStream = System.IO.File.Open("--somePath--", FileMode.Open, FileAccess.ReadWrite))
{
using (var document = SpreadsheetDocument.Open(documentStream, true))
{
// do something
}
}
注意 SpreadsheetDocument.Open
现在,我正在将此应用程序重写到 Azure,并使用 Azure 存储和 "WindowsAzure.Storage" 包中的 .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。
但是,当该流被推向电子表格时:
SpreadsheetDocument.Open(documentStream, true)
它中断于:
System.IO.IOException: '无法打开包,因为 FileMode 或
FileAccess 值对流无效。'
这是因为 Stream 上没有设置:
System.IO.File.Open("--somePath--", FileMode.Open, FileAccess.ReadWrite)
有谁知道如何解决这个问题?或者解决方案?
拜托:)
Does anyone know how to get around this? Or a solution?
_GetRootDirectoryOfAccount().GetFileReference("--someRelativePath--").OpenWrite(null))
的return类型是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
}
}
}
}
我正在使用 DocumentFormat.OpenXml.SpreadsheetDocument 并打开 Excel 文档的模板,写入并保存它。
它像普通文件流中的魅力一样工作:
using (var documentStream = System.IO.File.Open("--somePath--", FileMode.Open, FileAccess.ReadWrite))
{
using (var document = SpreadsheetDocument.Open(documentStream, true))
{
// do something
}
}
注意 SpreadsheetDocument.Open
现在,我正在将此应用程序重写到 Azure,并使用 Azure 存储和 "WindowsAzure.Storage" 包中的 .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。
但是,当该流被推向电子表格时:
SpreadsheetDocument.Open(documentStream, true)
它中断于:
System.IO.IOException: '无法打开包,因为 FileMode 或 FileAccess 值对流无效。'
这是因为 Stream 上没有设置:
System.IO.File.Open("--somePath--", FileMode.Open, FileAccess.ReadWrite)
有谁知道如何解决这个问题?或者解决方案?
拜托:)
Does anyone know how to get around this? Or a solution?
_GetRootDirectoryOfAccount().GetFileReference("--someRelativePath--").OpenWrite(null))
的return类型是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
}
}
}
}