在Excel中以编程方式关闭工作簿

问题描述:

可以说我打开了一个名为“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

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

off off没有这样的代码。但通常情况下,过去我会用一些API调用来做到这一点。首先,您将获得窗口句柄(hWnd),然后使用带wm_close参数的sendmessage api调用。

这就是所有我能记住 - 它一直约10岁,因为我不得不做这有点儿东西,所以从那时起:)

+0

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

Process类将允许你去杀死一个过程领域可能已经改变。您可以检查所有正在运行的excel.exe进程,获取进程的主窗口句柄,检查该窗口的标题是否包含XLS文件的名称,然后终止该窗口的进程。

否则,您可以使用Office COM类与Excel交谈。这也可能允许您关闭打开的工作簿。

+0

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

单个进程很可能包含多个打开的工作簿。特别是因为Excel在从资源管理器,Outlook等打开文件时更喜欢重新使用现有实例,而不是为每个工作簿创建新的进程。

更不用说杀死进程将要求您1)关闭主窗口,这将提示是否存在未保存的更改或2)强行终止进程,这可能会导致Excel在下次您显示其崩溃恢复选项时启动它。

最好的方法是使用Excel COM API关闭工作簿。您可以使用Marshal.GetActiveObject方法获取正在运行的Excel实例,然后参阅Office开发人员参考,以获取有关如何在不提示的情况下关闭特定命名工作簿的更多信息。

+0

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