Принудительно загрузить поток - принудительно загрузить файл Excel

Я создаю файл Excel в памяти, используя MemoryStream API и EPPlus для создания документа Excel.

Мой код для создания файла excel в основном выглядит так:

public Stream GetXlsDocument(IQueryable data)
{

    const string sheetName = "Sheet1";
    var file = new FileInfo("test2.xls");

    MemoryStream stream = new MemoryStream();
    using (ExcelPackage p = new ExcelPackage(stream))
    {
        p.Workbook.Worksheets.Add(sheetName);

        ExcelWorksheet ws = p.Workbook.Worksheets[1];
        ws.Name = sheetName;
        ws.Cells.Style.Font.Size = 11;
        ws.Cells.Style.Font.Name = "Calibri";

        // Headers
        ws.SetValue(1, 1, "Some data");

        p.SaveAs(stream);
    }

    stream.Position = 0;
    return stream;
}

Тогда моя другая функция должна обслуживать этот поток как загрузку для пользователя. Я пытаюсь сделать это так:

var file = Documents.GetXlsDocument();

var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);

Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=nfile.xls");
Response.BinaryWrite(memoryStream.ToArray());
Response.End();

Это показывает мне диалоговое окно загрузки. Но когда я открываю свой файл excel, весь документ excel заполняется мусором (я предполагаю, что двоичные данные представлены в виде строки).

Я понятия не имею, что я делаю неправильно.

Кто-нибудь знает, как я могу сделать файл excel загружаемым в хорошем формате? Возможно, у EPPlus уже есть что-то для этого?


person Vivendi    schedule 12.09.2012    source источник


Ответы (2)


Не добавляйте поток в конструктор. Оставьте конструктор пустым.

Итак, измените эту строку:

using (ExcelPackage p = new ExcelPackage(stream))

к этому:

using (ExcelPackage p = new ExcelPackage())
person w00    schedule 12.09.2012

Для 'Response.ContentType' используйте application/octet-stream в качестве типа. Это скажет большинству браузеров рассматривать файл как данные, которые он не должен загружать.

person Community    schedule 12.09.2012
comment
К сожалению, это по-прежнему дает мне двоичные строковые данные в моем файле Excel. - person Vivendi; 12.09.2012