2011-09-02 67 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