2013-03-04 8 views
3

У меня есть требование загрузить файл и изменить его, а затем вернуть его. Мне не нужно сохранять файл в любом месте, но манипулировать им и возвращаться. Однако я не знаю, как вернуть файл.ASP.NET MVC Вернуть файл Excel

Этот код позволяет сохранить файл, я даже написал код без сохранения файла. проблема только в том, что я получаю сообщение об ошибке, что этот файл уже открыт другим пользователем.

Процесс не может получить доступ к файлу 'D: \ Places \ places \ App_Data \ 877d36d3-ce29-48d1-995a-ea6652a528a7C2.xlsx', потому что он используется другим процессом.

Можете ли вы помочь мне

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult FileUpload(HttpPostedFileBase uploadFile) 
{ 
    if (uploadFile.ContentLength > 0) 
    { 
     string path = string.Empty; 
     var fileName = Path.GetFileName(uploadFile.FileName); 
     path = Path.Combine(Server.MapPath("~/App_Data/"), Guid.NewGuid() + fileName); 
     uploadFile.SaveAs(path); 

     Excel.Application xlApp = new Excel.Application(); 
     Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(path); 
     Excel._Worksheet xlWorksheet = (Excel._Worksheet)xlWorkbook.Sheets[1]; 
     Excel.Range xlRange = xlWorksheet.UsedRange; 
     int rowCount = xlRange.Rows.Count; int colCount = xlRange.Columns.Count; 
     (xlRange.Cells[4, 5] as Excel.Range).Value2 = "asdF"; 
     (xlRange.Cells[4, 6] as Excel.Range).Value2 = "asdF"; 
     (xlRange.Cells[4, 7] as Excel.Range).Value2 = "asdF"; 
     (xlRange.Cells[4, 8] as Excel.Range).Value2 = "asdF"; 

     releaseObject(xlWorksheet); 
     releaseObject(xlWorkbook); 
     releaseObject(xlApp); 
     GC.Collect(); 

     uploadFile.InputStream.Dispose(); 
     return File(path, "application/text"); 

    } 
    else 
    { 
     return View(); 
    } 
} 

private void releaseObject(object obj) 
{ 
    try 
    { 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
     obj = null; 
    } 
    catch (Exception ex) 
    { 
     obj = null; 
     //MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); 
    } 
    finally 
    {enter code here 
     GC.Collect(); 
    } 
} 

ответ

3

в действии вы можете вернуть FileStreamResult

return new FileStreamResult([memory stream], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

Вы также можете закрыть и сохранить книгу на временную области перед возвращением. Из-за ошибки он выглядит так, будто файл все еще открыт.

+0

не уверен, если это правильный тип пантомимы из книг Excel. но это должен быть быстрый поиск Google, чтобы найти. –

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