另一个进程正在使用TransmitFile文件

时间:2015-09-05 10:25:49

标签: c# asp.net .net export-to-excel

我正在服务器上生成Excel文件,然后立即将其下载给用户。这是我点击按钮上的代码:

 var excelApp = new Excel.Application();
 excelApp.Workbooks.Add();
 Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

 string fileTemporary = "C:\\Users\\........\\Desktop\\my folder\\";
 fileTemporary = fileTemporary  + nameOfDocument+".xlsx";
 workSheet.SaveAs(fileTemporary);

 HttpContext.Current.Response.TransmitFile(fileTemporary);

我收到了另一个进程正在使用该文件的错误,即使我已经创建了该文件。我将每个人都添加为该文件夹的用户,并以管理员身份运行。

更新:在人们告诉我关闭工作表之后,我试了一下:

Marshal.ReleaseComObject(workSheet);

在调用Transmitfile之前我一直遇到问题

更新2:我也试过了:

excelApp.Quit();

更新3:我试过了:

GC.Collect();
GC.WaitForPendingFinalizers();

Marshal.FinalReleaseComObject(workSheet);
excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);

HttpContext.Current.Response.TransmitFile(fileTemporary);

问题是,现在我没有得到任何例外,但没有下载任何内容

3 个答案:

答案 0 :(得分:0)

试试这个,这是你的代码,加上关闭和退出

 var excelApp = new Excel.Application();
 excelApp.Workbooks.Add();
 Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

 String fileTemporary = "C:\\Users\\........\\Desktop\\my folder\\";
 fileTemporary = fileTemporary  + nameOfDocument+".xlsx";
 workSheet.SaveAs(fileTemporary);

workSheet.Close(0); 
excelApp.Quit();

HttpContext.Current.Response.TransmitFile(fileTemporary);

答案 1 :(得分:0)

这对我有用

GC.Collect();
            GC.WaitForPendingFinalizers();
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workSheet);
            excelApp.Quit();
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelApp);

答案 2 :(得分:0)

如果您现在正在下载文件并且这是一个网络,您可能需要考虑使用URL的路径而不是实际路径,并通过Response.Redirect或Response.AppendHeader

将其发回。
     string fileTemporary = "~/TempFiles/";
     string actualLoc = fileTemporary.Replace("~",HttpContext.Current.Server.MapPath(""));
     if(!Directory.Exists(actualLoc)) { Directory.CreateDirectory(actualLoc); }
     string newActualLoc = actualLoc + nameOfDocument + ".xlsx";
     string linkLoc = fileTemporary + nameOfDocument + ".xlsx";

     workSheet.SaveAs(newActualLoc);

     GC.Collect();
     GC.WaitForPendingFinalizers();
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workSheet);
     excelApp.Quit();
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelApp);

加上重定向

     HttpContext.Current.Response.Redirect(linkLoc);

或追加标题

     HttpContext.Current.Response.AppendHeader("content-disposition","attachment; filename=" + linkLoc);