Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Считывание excel из memorystream


Автор: Annihilator 10.9.2009, 20:48
Добрый вечер,товарищи. Проблема в следующем. В MemoryStream находится содержимое excel файла. Как его вывести в браузер? У меня все время окно с предложением сохранить вылазит. Пробовал что-то типа

Код

            byte[] byteArr = (byte[])Array.CreateInstance(typeof(byte), theStream.Length);
            theStream.Position = 0;
            theStream.Read(byteArr, 0, (int)theStream.Length);
            theStream.Close();
            Response.Clear();
            Response.ContentType = "application/vnd.ms-excel";
            Response.AddHeader("content-disposition", "attachment; filename=ExportedTo.xls");
            Response.BinaryWrite(byteArr);
            Response.End();

не помогло.
 Или надо плагин специальный ставить для отображения таких данных?

Автор: Crypton 10.9.2009, 21:19
Цитата(Annihilator @ 10.9.2009,  13:48)
Добрый вечер,товарищи. Проблема в следующем. В MemoryStream находится содержимое excel файла. Как его вывести в браузер? У меня все время окно с предложением сохранить вылазит. Пробовал что-то типа

Код

           ...

не помогло.
 Или надо плагин специальный ставить для отображения таких данных?

В смысле вывести? Как текст? или выдать правильно файл?

Код


theStream.Position = 0;
byte[] buffer  = new byte[1024];
int read = 0;
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment; filename=ExportedTo.xls");
do{
 read = theStream.Read(buffer, 0, buffer.Length);
 Response.OutputStream.Write(buffer, 0, read);
}while(read>0);
Response.End();

Автор: Annihilator 11.9.2009, 05:20
Цитата(Crypton @  11.9.2009,  01:19 Найти цитируемый пост)
В смысле вывести? Как текст? или выдать правильно файл?

Да, именно вывести точно так же, с ячейками, данными, как будто в excel`е просматриваем. Попробовал, то что ты написал, все равно диалог на сохранение/открытие выдает диалог и ничего не выводит.

Автор: Crypton 11.9.2009, 16:29
А, ну это пример более-менее правильной отдачи файла чем у тебя. smile


а про вывод данных... тут местами проплывала темка где можно юзать OleDb как и для чтения Аксесс БД, так и для Экселя. Попробуй поискать по такой теме.

Автор: Annihilator 12.9.2009, 18:55
Через OLE DB это совсем другая тема. Мне было нужно удостоверится, что просто так из ИМЕННО стрима форматированные данные не вытащишь. Либо придется парсер писать что-то типа Excel->HTML

Автор: Любитель 12.9.2009, 23:29
Цитата(Crypton @  11.9.2009,  16:29 Найти цитируемый пост)
А, ну это пример более-менее правильной отдачи файла чем у тебя.

По сути он отличается лишь буферизованным чтением потока и отсутствием извращений с копированием туда-сюда и рефлексией. Учитывая что поток (по условию) итак весь в памяти - наиболее разумно использовать (ToArray именно от MemoryStream).
Код

Response.BinaryWrite(theStream.ToArray())


Что касается сабжа. Ты указываешь content-disposition в attachment - и этим форсируешь показ файла вне браузера. Для твоей цели нужен inline. Но, собственно, есть другая проблема - ты сможешь в принципе заставить открыть внутри браузера экселевский файл кого-либо кроме ИЕ? Так вот, если у тебя не ИЕ-онли проект, то надо действительно создать страничку просто рендерющую в хтмл нужный контент.

Автор: Crypton 13.9.2009, 04:10
Цитата

Учитывая что поток (по условию) итак весь в памяти - наиболее разумно использовать (ToArray именно от MemoryStream).


Сабж чисто для примера smile


Автор: Любитель 13.9.2009, 06:32
А чем он прям уж правильней варианта автора? smile Кроме лишнего цикла?

Автор: Crypton 13.9.2009, 18:09
Цитата(Любитель @ 12.9.2009,  23:32)
А чем он прям уж правильней варианта автора? smile Кроме лишнего цикла?

Относительней smile Думаю сработает получше если происходит передача огромных файлов например с диска. Было такое дело, что нужно было сделать скачивание файлов только авторизованными пользователями через хэндлер а файлы хранились в ~/App_data

Автор: Любитель 13.9.2009, 18:12
Ладно, я понял smile Но в случае топикстартера твой вариант будет просто медленнее. Впрочем, не в этом дело - так как буфферизация не имеет отношения к вопросу топикстартера.

Автор: Annihilator 15.9.2009, 05:48
Большое спасибо всем учатсникам. Вопрос считаю закрытым.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)