C# - 杀死引用特定文件的EXCEL.exe进程

时间:2015-11-27 05:49:17

标签: c# excel

我有一个创建excel文件的C#应用​​程序。但是如果文件保持打开并且应用程序第二次运行,则会抛出IO异常(因为,在代码中我用新的文件替换现有文件) 现在,我想检查文件是否已打开并终止引用此文件的excel.exe进程。 有什么办法可以实现吗?

注意:可能有多个Excel文件已打开。我想只关闭正在使用我的文件的进程。

xlFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
File.Copy(xlFilePath + "\\file.xlsx", String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month), true);
xlFilePath = Path.Combine(xlFilePath, String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month));

appl = new Excel.Application(Visible = false);
wbookss = appl.Workbooks;
wbook = wbookss.Open(xlFilePath);
//Excel.Worksheets wsheetss = appl.Worksheets;
wsheet = wbook.Sheets["Sheet1"];

Application_GenerateReport(wsheet);
Clipboard.Clear();
wbook.Close(true);
wbookss.Close();
appl.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbookss);
System.Runtime.InteropServices.Marshal.ReleaseComObject(appl);

编辑:如果上次运行中有异常,文件将保持打开状态。如果用户打开它,可以通过检查MainWindowTitle属性(正如Yeldar建议的那样)来杀死它。

2 个答案:

答案 0 :(得分:1)

由于Excel将打开文件的名称存储在其标题中,如下所示:

Microsoft Excel - filename.xls

您可以遍历这些进程并终止具有给定名称的进程:

string filename = "mylist.xls";
var excelProcesses = Process.GetProcessesByName("excel");

foreach (var process in excelProcesses)
{
  if (process.MainWindowTitle == $"Microsoft Excel - {filename}") // String.Format for pre-C# 6.0 
  {
     process.Kill();
  }
}

请注意:

  • 它还将关闭所有已打开的同名文件
  • 它将放弃用户可以更改的任何更改
  • Excel窗口的标题可能(或不,不确定,需要检查)因版本而异

然而,正如我在评论中所说,最好修复原因,但不是后果 - 只需让程序启动新的Excel应用程序而不会出错。

答案 1 :(得分:1)

另一种解决方案可能是:

taskkill

此行将调用命令提示符并运行命令System.Diagnostics.Process.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls");

所有开放的excel程序都将以这种方式被杀死。

更新:(对于一个文件)

gdb ./Debug/TestC++.exe ./TestC++.exe.stackdump