2016-03-31 6 views
0

Ich erstellte eine ASP.NET Mvc benutzerdefinierte FileResult, die eine Arbeitsmappe (.xlsx) exportieren wird.Ausgabe Arbeitsmappe erstellen in NPOI-Bibliothek mit benutzerdefinierten FileResult

Siehe die Codes unter:

public class TestData 
{ 
    public string StudentName { get; set; } 

    public string Course { get; set; } 
} 


public class ExcelResult<T> : FileResult 
{ 
    private readonly List<TestData> _testDataList; 

    public ExcelResult(string fileName = "export.xlsx") 
     : base("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
    { 
     FileDownloadName = fileName; 


     List<TestData> testDataList = new List<TestData>(); 

     TestData td = new TestData(); 
     TestData td1 = new TestData(); 

     td.StudentName = "Student1"; 
     td.Course = "BS IT"; 

     td1.StudentName = "Student2"; 
     td1.Course = "BS IT"; 

     testDataList.Add(td); 
     testDataList.Add(td1); 


     _testDataList = testDataList; 
    } 


    protected override void WriteFile(HttpResponseBase response) 
    { 
     Stream output = response.OutputStream; 

     // create an Excel file objects 
     XSSFWorkbook workbook = new XSSFWorkbook(); 
     // add a Sheet 
     ISheet sheet1 = workbook.CreateSheet("Sheet1"); 

     // get list data 
     List<TestData> listRainInfo = _testDataList; 

     // to sheet1 add the title of the first head row 
     IRow row1 = sheet1.CreateRow(0); 
     row1.CreateCell(0).SetCellValue("Student Name"); 
     row1.CreateCell(1).SetCellValue("Course"); 

     // data is gradually written sheet1 each row 
     for (int i = 0; i < listRainInfo.Count; i++) 
     { 
      IRow rowtemp = sheet1.CreateRow(i + 1); 
      rowtemp.CreateCell(0).SetCellValue(listRainInfo[i].StudentName.ToString()); 
      rowtemp.CreateCell(1).SetCellValue(listRainInfo[i].Course.ToString()); 
     } 

     // Write to the client 
     MemoryStream ms = new MemoryStream(); 
     workbook.Write(ms); 

     output.Write(ms.GetBuffer(), 0, (int)ms.Length); 
    } 
} 

In dieser Zeile von Codes, wo er einen Fehler wirft (keine geschlossene Stream-Zugriff): output.Write(ms.GetBuffer(), 0, (int)ms.Length);

Bin ich hier etwas fehlt?

Antwort

0

Ich finde nur heraus, was schief gelaufen ist. Aus irgendeinem Grund, sobald NPOI das Schreiben der Arbeitsmappe in einem Stream abgeschlossen hat, wird sie geschlossen.

So machen die Codes arbeiten wir dies tun müssen:

MemoryStream ms = new MemoryStream(); 
workbook.Write(ms); 

var buffer = ms.ToArray(); 
var bytesRead = buffer.Length; 

Dann können wir jetzt an den Client übergeben:

response.OutputStream.Write(buffer, 0, btyesRead);