Как написать книгу Excel в MemoryStream в .NET?
Как написать книгу Excel в MemoryStream
без сохранения ее в файловой системе?
Все параметры в параметрах сохранения Microsoft.Office.Interop.Excel.WorkBook
принимают имя файла.
Ответы
Ответ 1
Я провел обширную работу с PIA и сохранил файлы Excel в репозитории документов и передал их в браузер, и я не смог найти решение для использования PIA без предварительной записи содержимого в файл сначала.
Я думаю, что вам придется усвоить пулю и разобраться с файловой системой в качестве посредника. Хорошей новостью является то, что вы можете просто предоставить файлу уникальное имя, например, guid или использовать какой-либо другой метод tempfilename (не уверен, существует ли он в .net) и просто удалять содержимое, когда вы закончите.
Ответ 2
Это можно сделать с помощью Open XML SDK 2.0. У Эрика Уайта есть отличная статья о том, как работать с файлами OOXML в потоке в Работа с открытыми документами XML в памяти
Ответ 3
Если вам нужна только базовая функциональность из Excel, вы можете создать Рабочую книгу как поток Html. Есть еще один вопрос о SO, который без ручного обслуживания.
Это также решает некоторые проблемы (возможно, еще не все) относительно масштабируемости вашего решения.
Ответ 4
Другой вариант - использовать эту бесплатную библиотеку для экспорта рабочей книги. Метод сохранения в классе рабочей книги может принимать имя файла или поток.
Ответ 5
Единственный способ, которым вы могли бы это сделать, - это подготовить свой пользовательский объект, который позволил бы хранить все различные биты и фрагменты данных/формул/vba/links/ole, которые вы хотели сохранить, скопировать из вашей книги к объекту, а затем сохраняйте этот объект в потоке памяти. В случае использования вашего прокси-объекта в качестве перехода между ними.
Невозможно (как другие говорили) писать файл Excel прямо в память.
В формате Excel 2007 OpenXML вы можете использовать событие BeforeSave для книги, чтобы иметь собственный метод, который сначала устанавливает параметр Cancel для события BeforeSave в значение True, а затем сериализует результирующий XML-пакет (представляющий файл) в объект в памяти.