对于ExcelPackage构造函数,您需要一个FileInfo对象。我更喜欢使用某种流对象(例如MemoryStream),因为我不需要将文件保存到服务器本身,而是将其公开为FileStream以供用户使用。我不想创建只用于生成目的且永远不会再次使用的服务器上必须稍后删除的文件。除此之外,否则我还需要应用程序/用户在服务器上目录/文件的必要权限。
那么我的问题是:如何将流对象转换为FileInfo对象。
那么我的问题是:如何将流对象转换为FileInfo对象。
Stream
直接转换为FileInfo
,它们代表完全不同的事物。Stream
包含可能表示磁盘上文件或非文件的数据。另一方面,FileInfo
包含有关文件的元数据,该文件可能存在也可能不存在。Stream
的内容写入磁盘上的文件中,创建指向该文件的FileInfo
并将其传递给构造函数。是的,你可以。
var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);
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 );
}
FileInfo
类是一个简单的包装器,用于封装磁盘上文件的路径。
无法使用FileInfo
来包装内存流。
但是,您可以下载源代码并添加一个接受Stream
的构造函数。(文件路径仅在WriteDebugFile
方法中使用)
查看 ExcelPackage
的源代码,它在构造函数中使用 FileInfo
对象的 FullName
属性上的 Package.Open
方法,以 FileMode.Open
和 FileAccess.ReadWrite
初始化一个 Package
对象。
Package.Open
方法也可以直接接受一个 Stream
。
如果您想要,您可以自己重载 ExcelPackage
构造函数来接受一个 Stream
参数,并简单地调用该 Stream
对象上的 Package.Open
--这个 Stream
对象可以很容易地是一个 MemoryStream
,例如。
Fredrik Mörk
所提到的那样,由于两种类型之间没有默认转换可用,因此这是不可能的,并且也不建议这样做。IConvertible
接口来提供自己的 Conversion
逻辑。虽然在此情况下并不正确,但在其他地方可能会有所帮助。class CustomStream : Stream, IConvertible
{
public FileInfo ConvertToFileInfo()
{
return new FileInfo("");
}
}
这是如何转换它的方法
CustomStream stream = new CustomStream();
FileInfo fileInfo = stream.ConvertToFileInfo();
ExcelPackage
会尝试从FileInfo
中的路径读取文件。 - SLaks