我正在创建一个可以从数据库数据生成Excel文件的Windows窗体应用程序。在将数据库填入文件后,我打开它并执行宏,保存文件然后关闭它(或者我想我正在关闭它)。这些文件保存在我的硬盘上,但是当生成所有文件时,我必须能够生成一组新文件,因此我必须在生成新组之前从硬盘中删除所有旧文件。运行应用程序一次后,我尝试生成新的文件集,我收到一个错误,指出其中一个文件(第一批中生成的最后一个文件)被另一个进程使用。
这是我的代码:
public void RemoveRows_Macro(string fileName)
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
xlWorkBook = xlApp.Workbooks.Open(fileName);
//xlApp.Visible = true;
xlApp.DisplayAlerts = true;
//Run the macro
xlApp.Run("RemoveRows", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Save();
xlWorkBook.Close(false);
xlApp.Quit();
releaseObject(xlApp);
releaseObject(xlWorkBook);
}
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
Console.WriteLine("Error in releasing object :" + ex);
obj = null;
}
finally
{
GC.Collect();
}
}
由于应用程序未发布文件,我做错了什么?
答案 0 :(得分:2)
您希望首先释放对象,然后按照与分配对象相反的顺序将它们设置为null。
releaseObject(xlWorkBook);
releaseObject(xlApp);
xlWorkBook = null;
xlApp = null;
我在使用Excel Interop时发现此链接是一个很好的资源 How do I properly clean up Excel interop objects?
答案 1 :(得分:1)
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
答案 2 :(得分:0)
我现在无法运行测试,但看起来您在将xlApp和xlWorkBook传递给releaseObject之前将其设置为null。之后可能还有其他原因。
答案 3 :(得分:0)
首先将xlApp和xlWorkBook设置为null,然后尝试将其释放。尝试评论这两行:
xlApp = null;
xlWorkBook = null;
这可以解决问题吗?
答案 4 :(得分:0)
我遇到了同样的问题,但是我解决了。因此,创建文件后,我将其关闭。
xlWorkbook.SaveAs("nameExcel");
xlWorkbook.Close();