C#-终止引用特定文件的EXCEL.exe进程

本文关键字:EXCEL exe 进程 文件 终止 引用 C#- | 更新日期: 2023-09-27 18:24:36

我有一个C#应用程序,它可以创建一个excel文件。但是,如果文件保持打开状态,并且应用程序第二次运行,它会抛出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所建议的)。

C#-终止引用特定文件的EXCEL.exe进程

另一种解决方案可能是:

System.Diagnostics.Process.Start("CMD.exe","taskkill /f /im excel.exe");

此行将调用命令提示符并运行命令taskkill

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

更新:(对于一个文件)

System.Diagnostics.Process.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls");

由于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应用程序而不出错。