2015-11-27 21 views
0

我有一個C#應用程序創建一個Excel文件。但是如果文件保持打開並且應用程序第二次運行,它會引發IO異常(因爲在代碼中,我將用新文件替換現有文件) 現在,我想檢查文件是否打開並且殺死引用此文件的excel.exe進程。 這有什麼辦法可以實現?C# - 殺死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所建議的)。

+0

我會說,我認爲你是從錯誤的一端接近的問題。你的程序應該優雅地處理這個異常。也許有可能重試?這比嘗試發送Excel遺忘(使用任何潛在的用戶更改)要好得多。 Plus Office傾向於用_「以前打開此文件時發生問題,再次打開該文件時出現問題?」_或某些此類 – MickyD

+0

^該報告僅使用此應用程序生成,從未手動修改過。 – SharpCoder

+0

[這篇文章](http://stackoverflow.com/questions/13807102/find-all-open-excel-workbooks)介紹瞭如何獲得運行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窗口的可能(或不,不知道,需要檢查)而異因版本

然而,正如我在評論中說,最好修復原因,但不要造成後果 - 只要讓程序啓動新的Excel應用程序而不會出錯。

1

另一種解決方案可以是:

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

@Micky我只是更新我的答案。一探究竟! –

+0

尼斯托尼,謝謝編輯! – MickyD