3

I have a requriement to upload a file and modify and then return the same. I dont need to save the file to any location but manipulate it and return. However I am not knowing how to return the file.

The below code allows the file to save, I even wrote code with out saving file. only problem is I am getting an error that this file is already open by someother user.

The process cannot access the file 'D:\Places\places\App_Data\877d36d3-ce29-48d1-995a-ea6652a528a7C2.xlsx' because it is being used by another process.

Can you please help me

[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();
    }
}

2 Answers 2

3

in the action you can return a FileStreamResult

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

You also might want to close and save the workbook to a temp area before returning. From the error it looks like the file is still open.

Sign up to request clarification or add additional context in comments.

1 Comment

not sure if it is the correct mime type of excel workbooks. but that should be a quick google search to find.
0

It's because probably you are not closing your file. You should use something like xlWorkbook.Close before trying to use it again, or you can use the using() statement.

http://msdn.microsoft.com/en-us/library/system.io.file.open(v=vs.71).aspx

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.