對於ExcelPackage構造函數,您需要一個FileInfo對象。我寧願使用某種流對象(f.i.MemoryStream),因爲我不需要將文件保存到服務器本身,而是將它作爲FileStream公開給用戶。我不想創建文件,我必須從服務器中刪除,這些服務器僅用於生成目的並且不再使用。除此之外,否則我還需要在服務器上的目錄/文件上爲應用程序/用戶提供必要的權限。我可以將Stream對象轉換爲FileInfo對象嗎?
所以我的問題是:如何將流對象轉換爲FileInfo對象。
對於ExcelPackage構造函數,您需要一個FileInfo對象。我寧願使用某種流對象(f.i.MemoryStream),因爲我不需要將文件保存到服務器本身,而是將它作爲FileStream公開給用戶。我不想創建文件,我必須從服務器中刪除,這些服務器僅用於生成目的並且不再使用。除此之外,否則我還需要在服務器上的目錄/文件上爲應用程序/用戶提供必要的權限。我可以將Stream對象轉換爲FileInfo對象嗎?
所以我的問題是:如何將流對象轉換爲FileInfo對象。
添加下面的構造方法ExcelPackage使得可以使用流來代替。
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);
}
A FileInfo
class是圍繞磁盤上文件的路徑的簡單包裝。
不可能有FileInfo
包裝內存流。
但是,您可以下載源代碼並添加一個需要Stream
的構造函數。 (文件路徑僅用於WriteDebugFile
方法)
您不能將Stream
同樣轉換爲FileInfo
;它們代表完全不同的事物。 A Stream
包含的數據可能代表或不代表磁盤上的文件。另一方面,FileInfo
包含關於文件的元數據,該文件可能存在也可能不存在。
你可以做的是Stream
的內容寫入到磁盤上的文件,創建一個FileInfo
在該文件指向並傳遞FileInfo
給構造什麼。
你不能這樣做,你應該做的是輸出內存流到文件並獲取FileInfo對象爲新創建的文件並將其傳遞給ExcelPackage。
正如Fredrik Mörk
所述,這是不可能的,因爲它們在兩種類型之間沒有默認轉換,也不推薦。
僅適用於reference
,您可以通過實施IConvertible
接口來提供自己的Conversion
邏輯。在這種情況下再次不正確的做法,但可能會在別的地方有所幫助。
class CustomStream : Stream, IConvertible
{
public FileInfo ConvertToFileInfo()
{
return new FileInfo("");
}
}
這是你如何將它轉換
CustomStream stream = new CustomStream();
FileInfo fileInfo = stream.ConvertToFileInfo();
尋找在用於ExcelPackage
的源代碼,它使用上傳遞到構造,與FileMode.Open
和FileAccess.ReadWrite
的FileInfo
對象的FullName
屬性Package.Open
方法,以初始化Package
對象。
Package.Open
方法也可以直接接受Stream
。
如果你願意,你可以重載自己ExcelPackage
構造函數接受Stream
參數,只需撥打Package.Open
是Stream
對象 - 這很容易是,例如,一個MemoryStream
。
是的,你可以
var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);
在哪裏以及如何像您一樣更改源代碼? – user3207158 2016-12-09 23:26:42