2016-12-13 2 views
0

В настоящее время я сохраняю файл excel, как на моем диске c.Самый простой способ загрузить файл в 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' является * не * правильным типом для документов xlsx, сгенерированных любой из библиотек OpenXML, таких как EPPlus. Это старый формат до 2003 года, который больше не используется. –

ответ

2

This duplicate question только один из тех, которые показывают, как использовать EPPlus для создания файлов Excel на стороне сервера в масштабируемой манере. На самом деле это намного проще, чем использование 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); 
    } 
} 

Вы можете использовать LoadFromDataTable, чтобы заполнить лист из таблицы или LoadFromCollection данных для загрузки данных из коллекции, например List<Sale>.

Оба метода возвращают объект ExcelRange (диапазон ячеек), который можно использовать для форматирования отдельных ячеек, строк и столбцов. Вы также можете создавать таблицы из диапазона и применять темы.

Дубликат идет еще дальше и показывает, как вы можете avoid even the MemoryStream

Смежные вопросы