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