2010-06-16 57 views
2

可以說我打開了一個名爲「DataSheet.xls」的Excel文件。我怎樣才能殺死使用C#的Excel文件?在Excel中以編程方式關閉工作簿

+1

是否要殺死excel應用程序,excel.exe或只關閉工作簿datasheet.xls? – simendsjo 2010-06-16 07:21:04

+0

我想僅關閉工作簿datasheet.xls – Rabin 2010-06-16 07:32:13

回答

5
using Excel = Microsoft.Office.Interop.Excel; 
(...) 
var app = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
// I have english excel, but another culture and need to use english culture to use excel calls... 
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
app.Workbooks["DataSheet"].Close(false, false, false); 
+0

非常感謝您的幫助。 – Rabin 2010-06-16 08:38:51

+0

是否有任何理由在FormClosed或FormClosing中不起作用? – Rabin 2010-06-17 08:38:13

+0

不應該..你確定它被叫了嗎? – simendsjo 2010-06-17 10:00:29

0

off off沒有這樣的代碼。但通常情況下,過去我會用一些API調用來做到這一點。首先,您將獲得窗口句柄(hWnd),然後使用帶wm_close參數的sendmessage api調用。

這就是所有我能記住 - 它一直約10歲,因爲我不得不做這有點兒東西,所以從那時起:)

+0

非常感謝您的幫助。 – Rabin 2010-06-16 09:06:57

1

Process類將允許你去殺死一個過程領域可能已經改變。您可以檢查所有正在運行的excel.exe進程,獲取進程的主窗口句柄,檢查該窗口的標題是否包含XLS文件的名稱,然後終止該窗口的進程。

否則,您可以使用Office COM類與Excel交談。這也可能允許您關閉打開的工作簿。

+0

非常感謝您的幫助。 – Rabin 2010-06-16 08:46:14

2

單個進程很可能包含多個打開的工作簿。特別是因爲Excel在從資源管理器,Outlook等打開文件時更喜歡重新使用現有實例,而不是爲每個工作簿創建新的進程。

更不用說殺死進程將要求您1)關閉主窗口,這將提示是否存在未保存的更改或2)強行終止進程,這可能會導致Excel在下次您顯示其崩潰恢復選項時啓動它。

最好的方法是使用Excel COM API關閉工作簿。您可以使用Marshal.GetActiveObject方法獲取正在運行的Excel實例,然後參閱Office開發人員參考,以獲取有關如何在不提示的情況下關閉特定命名工作簿的更多信息。

+0

非常感謝您的幫助。 – Rabin 2010-06-16 08:37:08

相關問題