【问题标题】:C# - Kill EXCEL.exe process referencing a particular fileC# - 杀死引用特定文件的 EXCEL.exe 进程
【发布时间】:2015-11-27 16:00:38
【问题描述】:

我有一个创建 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 所建议的那样)将其杀死。

【问题讨论】:

  • 我会说,我认为您从错误的角度解决问题。你的程序应该优雅地处理这个异常。也许有可能重试?这比试图将 Excel 发送到遗忘(接受任何潜在的用户更改)要好得多。 Plus Office 往往会用 “之前打开此文件时出现问题,请再次打开它?” 或类似 来唠叨您
  • ^报告仅使用此应用生成,从未手动修改。
  • This post 描述了如何获取正在运行的 excel 实例。您应该考虑该实例而不是杀死它

标签: c# excel


【解决方案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 窗口的标题可能(或不,不确定,需要检查)因版本而异

但是,正如我在 cmets 中所说,最好解决原因,而不是后果 - 只需让您的程序启动新的 Excel 应用程序而不会出错。

【讨论】:

    【解决方案2】:

    另一种解决方案可能是:

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多