2016-03-31 9 views
0

ワークブック(.xlsx)をエクスポートするASP.NET MVCカスタムFileResultを作成しました。 (クローズドストリームにアクセスすることはできません)、それはエラーがスローコードのこの行でカスタムFileResultを使用してNPOIライブラリでワークブックを作成する

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); 
    } 
} 

は、以下のコードを参照してください、私はここで何かをしないのです output.Write(ms.GetBuffer(), 0, (int)ms.Length);

答えて

0

何が問題になったのか分かります。何らかの理由でNPOIがワークブックをストリームに書き込むと、それを閉じます。だから、コードは、我々はこれを実行する必要があります動作させるために

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

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

その後、我々は今、それをクライアントに渡すことができます:

response.OutputStream.Write(buffer, 0, btyesRead); 
関連する問題