2014-02-18 2 views
2

Я пытаюсь экспортировать лист Excel из ASP.NET MVC4 с помощью Open XML SDK 2.5. Я пытаюсь использовать стандартный пример из MSDN,Ошибка при создании открытого листа Excel excel из ASP.NET MVC

extention = "xlsx"; 
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
response.AddHeader("Content-Disposition",String.Format("attachment; filename={0}.{1}", fileName, extention)); 
using (MemoryStream mem = new MemoryStream()) 
{ 
    // Create a spreadsheet document by supplying the filepath. 
    // By default, AutoSave = true, Editable = true, and Type = xlsx. 
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(mem, SpreadsheetDocumentType.Workbook); 

    // Add a WorkbookPart to the document. 
    WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); 
    workbookpart.Workbook = new Workbook(); 

    // Add a WorksheetPart to the WorkbookPart. 
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 
    worksheetPart.Worksheet = new Worksheet(new SheetData()); 

    // Add Sheets to the Workbook. 
    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 

     // Append a new worksheet and associate it with the workbook. 
     Sheet sheet = new Sheet() 
     { 
      Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), 
      SheetId = 1, 
      Name = "mySheet" 
     }; 
     sheets.Append(sheet); 

     workbookpart.Workbook.Save(); 

     // Close the document. 
     spreadsheetDocument.Close(); 

     mem.CopyTo(response.OutputStream); 
} 

Мой файл становится загружен, но когда я пытаюсь открыть его, первенствует поп это ошибка о том, что файл поврежден. Когда я открываю файл с помощью блокнота или блокнота ++, файл полностью пуст, и в нем нет данных xml.

Что мне не хватает и что нужно сделать?

Заранее спасибо.

+0

ли вы вызываете response.Flush() потом? – rla4

+0

Да, я звонил в флеш. Как упоминалось в trailmax, проблема была SEEK. – Yogesh

ответ

3

Попробуйте сбросить позицию потока памяти до нуля, прежде чем скопировать его в ответ:

// Close the document. 
spreadsheetDocument.Close(); 
mem.Position = 0; 
mem.CopyTo(response.OutputStream); 

В качестве альтернативы копирования потока памяти в ответ, вы можете вернуть FileStreamResult из вашего MVC действий:

public ActionResult XlsDocument() 
{ 
    // generating your document here... 

    // very important to reset memory stream to a starting position, otherwise you would get 0 bytes returned 
    memoryStream.Position = 0; 

    var resultStream = new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";); 
    resultStream.FileDownloadName = String.Format("{0}.{1}", fileName, extension); 

    return resultStream; 
} 
Смежные вопросы