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

TransmitFile file is being used by another process

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

我得到了文件正在被另一个进程使用的错误,即使我刚刚创建了文件。我将每个人都作为用户添加到该文件夹​​,并且 运行 与管理员身份相比。

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

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

问题是现在我没有收到任何异常,但没有任何内容正在下载

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

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

如果您现在需要下载文件并且这是一个网络,您可能需要考虑使用 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);

或追加header

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