杀死EXCEL.exe进程引用一个特定的文件
我有一个C#应用程序创build一个Excel文件。 但是,如果文件保持打开状态,并且应用程序第二次运行,则会抛出IOexception(因为在代码中,我将用新的文件replace现有的文件)现在,我想检查文件是否打开并杀死正在引用此文件的excel.exe进程。 有什么办法可以实现吗?
注意:可能有多个excel文件打开。 我只想closures正在使用我的文件的进程。
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);
编辑:如果最后一次运行中发生exception,文件保持打开状态。 如果用户打开它,可以通过检查MainWindowTitle属性(如Yeldarbuild议的)来终止它。
由于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(); } }
注意:
- 它也将closures所有打开的同名文件
- 它将放弃用户可能改变的任何改变
- Excel窗口的标题可能 (或不是,不确定,需要检查)因版本而异
但是,正如我在评论中所说的那样,最好是修复原因,而不是后果 – 只要让程序启动新的Excel应用程序就不会有错误。
另一个解决scheme可能是
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");