2009-07-13 28 views
7

Tôi có một ứng dụng đơn giản C# mà phải viết một số giá trị trong một phạm vi excel của một trang tính cụ thể. Tôi tạo ra một thể hiện của ứng dụng Excel nếu không tồn tại, nhưng nếu tồn tại tôi muốn thiết lập hoạt động và lấy một thể hiện nếu nó sử dụng trong mã của tôi.Lấy ví dụ về ứng dụng Excel với C# bằng cách xử lý

tôi sử dụng mã này để tạo ra một ứng dụng mới:

Microsoft.Office.Interop.Excel app = 
    new Microsoft.Office.Interop.Excel.Application(); 
app.Visible = true; 

Để có được xử lý của cửa sổ excel hoạt động tôi sử dụng api này

[DllImportAttribute("User32.dll")] 
private static extern int FindWindow(String ClassName, String WindowName); 

Làm thế nào tôi có thể có được một thể hiện của ứng dụng excel bởi một tay cầm?

int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx"); 
Microsoft.Office.Interop.Excel app = ....(hWnd) 

Trả lời

16

Sử dụng đoạn mã sau để có được những ví dụ chạy đầu tiên của Excel:

oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

Ví dụ

public Excel.Application StartExcel() 
{ 
    Excel.Application instance = null; 
    try 
    { 
     instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
    } 
    catch (System.Runtime.InteropServices.COMException ex) 
    { 
     instance = new Excel.ApplicationClass(); 
    } 

    return instance; 
} 
+0

Đối với tôi, 'instance = new Excel.ApplicationClass();' không hoạt động. Tôi đã phải sử dụng 'instance = new Excel.Application();'. –

+2

@DavidMurdoch đây là kết quả của một [thay đổi trong VS2010 để nhúng các loại interop] (http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be -embedded-use-the-apply-interface-instead.aspx). Việc chuyển sang 'Application()' trên 'ApplicationClass()' là một cách giải quyết, bạn nhận được kết quả tương tự (mặc dù có vẻ như bạn đang tạo một giao diện!). – James

13

Có thể có nhiều hơn một phiên bản Excel đang chạy.

GetActiveObject (...) tìm trong Bảng đối tượng đang chạy (ROT) và sẽ cung cấp cho bạn phiên bản Excel cuối cùng được mở - không nhất thiết phải là phiên bản tương ứng với cửa sổ mà bạn có.

Bạn đang tìm AccessibleObjectFromWindow (..). Các Andrew Whitechapel post liên kết với trong câu trả lời khác cho thấy làm thế nào để sử dụng chức năng này.

Liên kết khác - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx.

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