在我的C#应用程序中,我可以通过单击按钮打开一个新的Excel进程。 然后,它等待输入空闲并加载新的Excel文件。我必须完成它,因为我希望在加载文档之前加载所有宏和工具(否则,存在渲染错误)。
进程ID保存在var中,当我再次单击该按钮时,使用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进程,但没有任何文档... 这种行为是逻辑的,但不适用于我想要的......
我见过一个加载新进程和新文档的软件,但是当点击文档关闭按钮时,整个进程已退出... 如何重现?
修改:好的,
最后,我没有将重点放在流程上,而是在此流程上启动了一个文件(如果文件已经打开,则设置焦点)。
这不是我真正想做的事,但它解决了我的问题......
答案 0 :(得分:1)
我建议使用Excel COM模型而不是手动运行该过程。您可以订阅工作表的事件并关闭应用程序。
这些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
答案 1 :(得分:0)
等待Excel流程结束,然后关闭您的应用:
processExcel_l.WaitForExit();
Application.Exit();
要处理仅关闭Excel文档(不是Excel流程),您可能需要引用Excel API。