2011-02-02 22 views
4

私の問題は、データベースにたくさんの情報があり、それをクライアントのダウンロード用にExcelファイルに取り込むことが理想的です。excelファイルをダウンロードする

私は偉大なNPOIライブラリを使用していますが、すでにシステムのコンソールアプリケーションに実装されていますが、これは私によって書かれたものではありません。私は、私のコントローラのActionLinkの上に何もなく、「System.IO.MemoryStreamを」と言っていない空白のページが表示をクリックすると、現在何が起こる

..

明らかにこれは望ましい効果ではありません。私が望むのは、ユーザーがリンクをクリックすると、レポートがダウンロードされるということです。ここで

は、レポートのためのクラスです:

public class RepairReporting 
    { 
     public Stream GenerateRepairFile(List<Int64> itemIds) 
     { 
      // Getting the complete workbook... 
      // 
      MemoryStream ms = new MemoryStream(); 
      HSSFWorkbook templateWorkbook = new HSSFWorkbook(); 

      // Create a worksheet by it's name. 
      // 
      HSSFSheet sheet = templateWorkbook.CreateSheet("Repairs Report"); 
      sheet.ForceFormulaRecalculation = true; 



      HSSFRow dataRow = sheet.CreateRow(0); 

      HSSFCell cell = dataRow.CreateCell(0); 
      cell.SetCellValue("Repairs"); 


      cell = dataRow.CreateCell(1); 
      cell.SetCellValue(DateTime.Now); 

      // Build the header row 
      // 
      dataRow = sheet.CreateRow(1); 

      string[] colHeaders = new string[]{ "Product Code", 
               "Product Name", 
               "Customer", 
               "Date Submitted For Repair", 
               "Date Sent For Repair", 
               "Expected Release Date",  
               "Estimated Cost", 
               "Actual Cost", 
               "Total Repair Price (END PRICE)" 
               }; 

      int colPosition = 0; 

      // Write all the headers out. 
      // 
      foreach (string colHeader in colHeaders) 
      { 
       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(colHeader); 
      } 

      // Build the item rows. 
      // 
      int row = 2; 

      foreach (Int64 itemId in itemIds) 
      { 
       using (ModelContainer ctn = new ModelContainer()) 
       { 

        Item currentItem = (from t in ctn.Items 
              where t.ItemID == itemId && t.RepairSelection == true 
              select t).First(); 


        dataRow = sheet.CreateRow(row++); 
        colPosition = 0; 

        cell = dataRow.CreateCell(colPosition++); 
        cell.SetCellValue(currentItem.ProductCode); 

        cell = dataRow.CreateCell(colPosition++); 
        cell.SetCellValue(currentItem.Product); 

        cell = dataRow.CreateCell(colPosition++); 
        cell.SetCellValue(currentItem.Customer.Name); 


        cell.SetCellValue(currentItem.Repair.SubmissionDate.Value.ToString("MM/dd/yyyy")); 


        if (currentItem.Repair.SentForConversion != null) 
        { 
         cell = dataRow.CreateCell(colPosition++); 
         cell.SetCellValue(currentItem.Repair.SentForRepair.Value.ToString("MM/dd/yyyy")); 
        } 
        else 
        { 
         colPosition++; 
         colPosition++; 
        } 

        if (currentItem.Repair.ReleaseDate != null) 
        { 
         cell = dataRow.CreateCell(colPosition++); 
         cell.SetCellValue(currentItem.Repair.ReleaseDate.Value.ToString("MM/dd/yyyy")); 
        } 
        else 
        { 
         colPosition++; 
         colPosition++; 
        } 


        if (currentItem.Repair.CostEstimation != null) 
        { 
         cell = dataRow.CreateCell(colPosition++); 
         cell.SetCellValue(currentItem.Repair.CostEstimation.Value.ToString()); 
        } 
        else 
        { 
         colPosition++; 
         colPosition++; 
        } 

        if (currentItem.Repair.ActualCost != null) 
        { 
         cell = dataRow.CreateCell(colPosition++); 
         cell.SetCellValue(currentItem.Repair.ActualCost.Value.ToString()); 
        } 
        else 
        { 
         colPosition++; 
         colPosition++; 
        } 

        if (currentTitle.Repair.TotalRepairPrice != null) 
        { 
         cell = dataRow.CreateCell(colPosition++); 
         cell.SetCellValue(currentItem.Repair.TotalRepairPrice.Value.ToString()); 
        } 
        else 
        { 
         colPosition++; 
         colPosition++; 
        } 

       } 

      } 


      templateWorkbook.Write(ms); 
      ms.Position = 0; 

      return ms; 
     } 
    } 
} 

そして、ここに私の問題はどこにあるか、私はあると思う私のコントローラ、次のとおりです。

public Stream repairReport() 
    { 
     ModelContainer ctn = new ModelContainer(); 

     List<Title> items = null; 

     var itemObjects = ctn.Items.Where(t => t.RepairSelection == true) 
      .Select(t =>t); 

     items = itemObjects.ToList(); 

     RepairReporting rtp = new RepairReporting(); 


     List<long> itemIDs = items.Select(t => t.ItemID).ToList(); 

     Stream repairReport = rtp.GenerateRepairFile(itemIDs); 

     return repairReport; 
    } 

答えて

7

これはあなたのコントローラであなたのアクションメソッドである場合は、ContentType

public FileResult RepairReport() 
{ 
    ModelContainer ctn = new ModelContainer(); 

    List<Title> items = ctn.Items.Where(t => t.RepairSelection == true) 
     .Select(t =>t).ToList(); 

    RepairReporting rtp = new RepairReporting(); 

    List<long> itemIDs = items.Select(t => t.ItemID).ToList(); 

    Stream repairReport = rtp.GenerateRepairFile(itemIDs); 

    return new FileStreamResult(repairReport, "application/ms-excel") 
     { 
      FileDownloadName = "RepairReport.xls", 
     }; 
} 
+0

とともに、そのコンストラクタでstreamをとるFileStreamResultを返すことによってFileResultを返すことができます!ありがとう、これは治療を働いた!もう一つのこと。このファイルをダウンロードすると、Excelファイルではなく、不明なファイルタイプとしてダウンロードされます。しかし、「open with」をクリックしてからexcelを選択すると、うまく開きます。とにかくこれをダウンロードしてすぐにExcelファイルにすることはできますか? – 109221793

+0

が更新されました。 – hunter

+0

ありがとうございます:) – 109221793

2

2懸念を

  1. 行が多すぎるとメモリの問題が発生する可能性があります。
  2. uがdataRow.CreateCellなどの新しい変数を宣言したとき。 COM相互運用機能を呼び出すので、使用するすべてのオブジェクトを処分しようとします。 obj.Dispose();およびMarshal.Release(obj);私はNPOIがそれを管理しているとは思わない。
関連する問題