2011-09-02 44 views
0

在我的C#应用​​程序中,可以通过单击按钮打开新的Excel进程。 然后,它等待输入空闲并加载新的Excel文件。我必须完成它,因为我希望在加载文档之前加载所有的宏和工具(否则,存在渲染错误)。关闭文档时加载Excel进程并关闭整个进程

进程ID保存在一个变种,当我在那个按钮再次点击,与PID,如果该进程已经存在,进程具有焦点,否则,将创建一个新的进程:

Process processExcel = null; 

if (pId_m.HasValue) 
{ 
    try 
    { 
     processExcel = Process.GetProcessById(pId_m.Value); 
    } 
    catch (Exception ex) 
    { 
     Log.MonitoringLogger.Error("Unable to find Pid : " + pId_m,ex); 
    } 
} 

if (processExcel != null && (processExcel.HasExited == false)) 
{ 
    AutomationElement element = AutomationElement.FromHandle(processExcel.MainWindowHandle); 
    if (element != null) 
    { 
     element.SetFocus(); 
    } 
} 
else 
{ 
    ProcessStartInfo info = new ProcessStartInfo(); 
    info.FileName = "Excel.exe"; 
    info.Arguments = " /e "; 
    processExcel_l = Process.Start(info); 
    pId_m = processExcel_l.Id; 
    processExcel_l.WaitForInputIdle(); 
    processExcel_l.StartInfo = new ProcessStartInfo(path); 
    processExcel_l.Start(); 
} 

问题是:当我关闭Excel文档窗口(而不是Excel窗口)时,我点击了按钮,焦点被设置为Excel进程,但没有任何文档... 此行为是逻辑,但没有为我想要的工作...

我见过一个软件,加载一个新的进程和一个新的文件,但是当点击文档关闭按钮,整个过程被退出... 如何重现相同的?

编辑:好吧,

最后反而将焦点设置的过程中,我发起了这个过程(这将焦点设置该文件是否已经打开)的文件。

这不是我真正想做的事,但它解决我的问题......

回答

1

我会建议使用Excel COM模型,而不是手动运行这个过程。您可以订阅Worksheet的事件并关闭应用程序。

这些MSDN文档可能会有所帮助:

http://msdn.microsoft.com/en-us/library/wss56bz7(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheet_members.aspx

+0

我知道COM,但我认为不可能通过COM在用户的新过程中显示Excel窗口。 我想我只能使用Excel中的数据,而不会向用户显示任何Excel窗口... – metalcam

0

等待结束,然后关闭应用Excel进程:

processExcel_l.WaitForExit(); 
Application.Exit(); 

要处理仅关闭Excel文档(不是Excel进程)你可能需要参考Excel API。

+0

事实上,我想处理仅关闭Excel文档...不要如何如何与进程标识COM OBJETS混合(在过程仍然打开时不打开第二个文档)... – metalcam