对于ExcelPackage构造函数,您需要一个FileInfo对象。我宁愿使用某种流对象(f.i.MemoryStream),因为我不需要将文件保存到服务器本身,而是将其作为FileStream公开给用户。我不想制作我必须从服务器中删除的文件,这些服务器仅用于生成目的而从未再次使用过。除此之外,我还需要服务器上目录/文件上的应用程序/用户的必要权限。
所以我的问题是:如何将流对象转换为FileInfo对象。
答案 0 :(得分:7)
您无法将Stream
转换为FileInfo
;它们代表完全不同的东西。 Stream
包含的数据可能代表也可能不代表磁盘上的文件。另一方面,FileInfo
包含有关文件的元数据,可能存在也可能不存在。
可以做的是将Stream
的内容写入磁盘上的文件,创建指向该文件的FileInfo
并传递FileInfo
到构造函数。
答案 1 :(得分:2)
FileInfo
类是磁盘上文件路径的简单包装
不可能有FileInfo
包装内存流。
但是,您可以下载源代码并添加一个Stream
的构造函数。 (文件路径仅用于WriteDebugFile
方法)
答案 2 :(得分:2)
将以下构造函数添加到ExcelPackage可以改为使用Streams。
public ExcelPackage( Stream stream ) {
_package = Package.Open( stream, FileMode.Create, FileAccess.ReadWrite );
Uri uriDefaultContentType = new Uri( "/default.xml", UriKind.Relative );
PackagePart partTemp = _package.CreatePart( uriDefaultContentType, "application/xml" );
XmlDocument workbook = Workbook.WorkbookXml;
_package.CreateRelationship( Workbook.WorkbookUri, TargetMode.Internal, schemaRelationships + "/officeDocument" );
_package.DeletePart( uriDefaultContentType );
}
答案 3 :(得分:0)
你不能这样做,你应该做的是将内存流输出到文件并获取新创建的文件的FileInfo对象并将其传递给ExcelPackage。
答案 4 :(得分:0)
查看ExcelPackage
的源代码,它使用传递给构造函数的Package.Open
对象的FullName
属性上的FileInfo
方法,FileMode.Open
}和FileAccess.ReadWrite
,初始化Package
对象。
Package.Open
方法也可以直接接受Stream
。
如果您愿意,可以自行重载ExcelPackage
构造函数以接受Stream
参数,只需在Package.Open
对象上调用Stream
即可例如,MemoryStream
。
答案 5 :(得分:0)
是的,你可以
var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);
答案 6 :(得分:-1)
如Fredrik Mörk
所述,这是不可能的,因为它们在两种类型之间都没有默认转换,也不推荐使用。
仅针对reference
,您可以通过实施IConvertible
接口提供自己的Conversion
逻辑。在这种情况下再次没有正确的方法,但在其他地方可能会有所帮助。
class CustomStream : Stream, IConvertible
{
public FileInfo ConvertToFileInfo()
{
return new FileInfo("");
}
}
这是你转换它的方式
CustomStream stream = new CustomStream();
FileInfo fileInfo = stream.ConvertToFileInfo();