2010-06-08 33 views
5

Trong C# Tôi đang cố gắng để có được một thể hiện của một đối tượng Excel.Application từ một đối tượng Process. Điều này có vẻ như nó phải được thực sự đơn giản nhưng tôi không thể tìm ra nó và không thể tìm thấy một ví dụ. Để lặp lại, tôi có một đối tượng System.Diagnostics.Process mà tôi biết đề cập đến một cá thể Excel đang chạy. Bây giờ tôi cần khôi phục một đối tượng Microsoft.Office.Interop.Excel.Application đề cập đến quá trình để tôi có thể thao tác ứng dụng Excel từ C#.Nhận đối tượng Excel.Application từ Process hoặc hwnd trong .NET

Trong trường hợp nó đơn giản hơn, tôi cũng có văn bản HWND id và cửa sổ được liên kết với cửa sổ Excel đang hoạt động.

Cảm ơn.

+0

bản sao có thể có của [Cách lấy phiên bản Excel hoặc cá thể Excel CLSID bằng ID tiến trình?] (Http://stackoverflow.com/questions/770173/how-to-get-excel-instance-or-excel-instance -clsid-using-the-process-id) – Helen

Trả lời

2
+0

Cảm ơn rất nhiều. Tôi có thể làm việc này. – Abiel

+0

Tôi không rõ ràng về cách này là một câu trả lời, như các chủ đề khác cung cấp cho bạn một 'IntPtr HWind' của trường hợp Excel, nhưng nó vẫn không cung cấp cho bạn' Microsoft.Office.Interop.Excel.Application' đối tượng .. . Tui bỏ lỡ điều gì vậy? – Antony

+0

Nevermind, lý do tại sao tôi đã nhầm lẫn là vì câu trả lời thực sự liên quan đến một liên kết bên ngoài không hoạt động nữa. Trên thực tế, ai đó đã đăng mã @ http://pastebin.com/F7gkrAST – Antony

2

How to use Visual C# to automate a running instance of an Office program

using Excel = Microsoft.Office.Interop.Excel; 
:  

private void button1_Click(object sender, System.EventArgs e) 
{ 

    //Excel Application Object 
    Excel.Application oExcelApp; 

    this.Activate(); 

    //Get reference to Excel.Application from the ROT. 
    oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

    //Display the name of the object. 
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name); 

    //Release the reference. 
    oExcelApp = null; 
} 

Không chắc chắn nếu bạn nghiêm túc cần phải lấy đối tượng áp dụng từ lớp Process? Hi vọng điêu nay co ich.

+2

Xin lỗi, tôi nên nói rằng tôi đã xem xét tùy chọn này. Thật không may, cách tiếp cận phổ biến này không làm việc cho tôi bởi vì tôi cần có khả năng để có được cửa sổ Excel hoạt động cuối cùng bất kể có bao nhiêu phiên bản Excel đang chạy. GetActiveObject sẽ luôn cung cấp tham chiếu đến cùng một cá thể Excel ngay cả khi có nhiều phiên bản đang chạy. – Abiel

1

tôi đã tạo ra một lớp có thể lặp qua tất cả chạy trường Excel, và cũng có thể tra cứu các trường hợp đơn xin việc bằng hWnd, ProcessID, hoặc một đối tượng Process.

http://www.codeproject.com/Tips/1080611/Get-a-Collection-of-All-Running-Excel-Instances

Câu trả lời là về cơ bản được nhiều cuộc gọi extern xấu xí trong Win32 API, đó là tốt nhất trái ẩn đằng sau một giao diện công cộng sạch sẽ.

Điều này chưa được thử nghiệm trên tất cả các phiên bản Excel hoặc Windows.

Các vấn đề liên quan