我正在服务器上生成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);
问题是,现在我没有得到任何例外,但没有下载任何内容
答案 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);