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

本文关键字:进程 另一个 文件 TransmitFile | 更新日期: 2023-09-27 18:11:23

我正在服务器上生成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);

我得到了文件正在被另一个进程使用的错误,即使我刚刚创建了文件。我将everyone作为用户添加到该文件夹中,并以管理员身份运行vs。

更新:在人们告诉我关闭表单后,我尝试了这个:

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);

问题是现在我没有得到任何异常,但是没有任何东西被下载

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

试试这个,这是你的代码,加上一个close和quit

 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);

这对我有用

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

如果下载文件是你现在的情况,这是一个web,你可能要考虑使用URL的路径,而不是实际的路径,并通过响应发送回。重定向或响应。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);