2016-12-13 14 views
0

現在、私のCドライブにE​​xcelファイルを保存しています。 ...mvcでファイルをダウンロードする最も簡単な方法

私は、ファイルのダウンロードを返すためにリターンからの眺めを私の方法を変革したいと思っています...

public ActionResult Export() 
    { 
     try 
     { 
      Excel.Application application = new Excel.Application(); 
      Excel.Workbook workbook = application.Workbooks.Add(System.Reflection.Missing.Value); 
      Excel.Worksheet worksheet = workbook.ActiveSheet; 
      var people = db.People.ToList(); 
      worksheet.Cells[1, 1] = "Last Name"; 
      worksheet.Cells[1, 2] = "First Name"; 
      int row = 2; 
      foreach (var person in people) 
      { 
       worksheet.Cells[row, 1] = person.PersonFName; 
       worksheet.Cells[row, 2] = person.PersonLName; 
       row++; 
      } 
      workbook.SaveAs("c:\\test\\worksheet.xls"); 
      workbook.Close(); 
      Marshal.ReleaseComObject(workbook); 

      application.Quit(); 
      Marshal.FinalReleaseComObject(application); 
      ViewBag.Result = "Done"; 
     } 
     catch(Exception ex) 
     { 
      ViewBag.Result = ex.Message; 

     } 

     return File("c:\\test\\workseet.xls", "application/vnd.ms-excel", "workseet.xls"); 


     // return View("Success"); 
    } 

私はc:\\test\workseet.xlsに行くことができますし、それは私が今まで何それを行うことができますが存在します

私はそれがこのような単純なことだった考え出し:

return File("c:\\test\\workseet.xls", "application/vnd.ms-excel", "workseet.xls"); 

私はこの方法を実行し、ダウンロードするためのリンクをクリックしたときしかし、それは私に、このエラーが発生します。

The process cannot access the file 'c:\test\workseet.xls' because it is being used by another process. 
+0

まず、ブックを閉じる必要があります。ただし、ディスクに保存する代わりに、MemoryStreamに保存し、 'return File(myStream、..) 'を使用して回避することができます。 EPPlusを使用していますか? –

+0

どのようにExcelファイルを生成していますか?どのライブラリを使用していますか? – mason

+0

PS'xls'は、EPPlusのようなOpenXMLライブラリによって生成されたxlsxドキュメントの正しいタイプではありません。それはもはや使用されない2003年以前の古いフォーマットです。 –

答えて

2

This duplicate questionだけでスケーラブルな方法で、サーバー側でExcelファイルを生成するEPPlusを使用する方法を示しているものの一つです。実際には、Excelの相互運用機能を使用するよりはるかに簡単です。ファイルをディスクに保存する必要はありません。

public ActionResult ExportData() 
{ 

    //Somehow, load data to a DataTable 

    using (ExcelPackage package = new ExcelPackage()) 
    { 
     var ws = package.Workbook.Worksheets.Add("My Sheet"); 
     //true generates headers 
     ws.Cells["A1"].LoadFromDataTable(dataTable, true); 

     //Save the workbook to a stream 
     var stream = new MemoryStream(); 
     package.SaveAs(stream); 

     string fileName = "myfilename.xlsx"; 
     string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 

     stream.Position = 0; 
     return File(stream, contentType, fileName); 
    } 
} 

あなたは例えばList<Sale>、コレクションからデータをロードするために、データテーブルまたはLoadFromCollectionからシートを埋めるためにLoadFromDataTableを使用することができます。

両方のメソッドは、個々のセル、行、および列の書式設定に使用できるExcelRangeオブジェクト(セルの範囲)を返します。範囲からテーブルを作成し、テーマを適用することもできます。

重複はさらに遠くに行くことができますavoid even the MemoryStream

関連する問題