Для конструктора ExcelPackage Вам нужен объект FileInfo. Я скорее использую некоторый потоковый объект (f.i. MemoryStream), потому что я не должен сохранить файл к самому серверу, но выставить его как FileStream так или иначе пользователю. Я не хочу к make-файлам, которые я должен удалить lateron из серверов, которые являются только там для генерации целей и никогда не используются снова. Кроме этого, иначе мне нужны также необходимые права для приложения/пользователя на каталоге/файле на сервере.
Таким образом, мой вопрос затем: Как я могу преобразовать потоковый объект в объект 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 );
}
Вы не можете преобразовать Stream
как таковой в FileInfo
; они представляют собой совершенно разные вещи. Поток
содержит данные, которые могут или не могут представлять файл на диске. С другой стороны, A FileInfo
содержит метаданные о файле, которые могут существовать или не существовать.
Что вы можете сделать, так это записать содержимое Stream
в файл на диске, создать FileInfo
, указывающую на этот файл, и передать этот FileInfo
конструктору.
Вы не можете этого сделать, вам нужно вывести поток памяти в файл и получить объект FileInfo для вновь созданного файла и передать его в ExcelPackage.
Класс FileInfo
представляет собой простую оболочку вокруг пути к файлу на диске.
Невозможно завернуть поток памяти в FileInfo
.
Однако можно загрузить исходный код и добавить конструктор, который принимает Stream
. (Путь к файлу используется только в методе WriteDebugFile
)
Если посмотреть на исходный код для ExcelPackage
, он использует метод Package.Open
в свойстве FullName
объекта FileInfo
. передается конструктору с FileMode.Open
и FileAccess.ReadWrite
, чтобы инициализировать объект Package
.
Метод Package.Open
также может напрямую принимать Stream
.
При желании вы можете самостоятельно перегрузить конструктор ExcelPackage
, чтобы принять параметр Stream
, и просто вызвать Package.Open
для этого Stream
объект, который легко может быть, например, MemoryStream
.
Как упоминал Фредрик Мёрк
, это невозможно, поскольку их преобразование по умолчанию не доступно между обоими типами и также не рекомендуется.
Только для справки
, вы можете предоставить свою собственную логику преобразования
, реализовав интерфейс IConvertible
. опять же неправильный подход в этом сценарии, но может быть полезен где-то еще.
class CustomStream : Stream, IConvertible
{
public FileInfo ConvertToFileInfo()
{
return new FileInfo("");
}
}
Вот как это преобразовать
CustomStream stream = new CustomStream();
FileInfo fileInfo = stream.ConvertToFileInfo();