2011-02-02 107 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

如果這是在你的控制你的行動方法,你可以通過返回FileStreamResult,這需要stream在其構造與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

一起返回一個FileResult!謝謝,這工作得很好!還有一件事。當我下載這個文件時,它會以未知文件類型下載,而不是Excel文件。如果我點擊「打開」,然後選擇excel它打開罰款。無論如何,我可以把它作爲一個直接的excel文件下載嗎? – 109221793 2011-02-02 16:12:46

2

2擔憂

  1. 太多的行可能會導致內存問題。
  2. 當你聲明新的變量,如dataRow.CreateCell。因爲你調用COM互操作,試圖處理你使用的每個對象。 obj.Dispose();和Marshal.Release(obj);我不認爲NPOI能夠做到這一點。