2011-07-01 43 views
20

Tôi đang sử dụng C# để thao tác bảng tính Excel. Hai đoạn mã sau đây sẽ làm việc giống nhau, nhưng một công trình và một đoạn khác sẽ đưa ra một ngoại lệ. Tôi tự hỏi tại sao.Worksheet get_Range ném ngoại lệ

này hoạt động:

oRange = (Excel.Range)oSheet.get_Range("A1","F1"); 
oRange.EntireColumn.AutoFit(); 

này ném một ngoại lệ:

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 
oRange.EntireColumn.AutoFit(); 

Ngoại lệ:

RuntimeBinderException occurred. "object" does not contain a definition for 'get_Range' 

Các oSheet được khởi tạo như sau:

Excel.Worksheet oSheet = new Excel.Worksheet(); 

Tôi có nên khởi tạo cả hai cách khác nhau không?

+0

Có vẻ như, "oSheet" một lần được nhập dưới dạng Worksheet và một lần là Object. – TcKs

+0

Đồng ý với các điều trên. Bạn có thể đăng bài oSheet được khởi tạo trong cả hai trường hợp không? – DoctorMick

+0

@Tcks, @DoctorMick, mã được đăng – KMC

Trả lời

32

Dường như ngoại lệ được ném từ oSheet.Cells[1, 1]oSheet.Cells[4, 4] được sử dụng làm đối số cho get_range.

Áp dụng những điều sau đây, không có ngoại lệ sẽ được ném:

Excel.Range c1 = oSheet.Cells[1, 1]; 
Excel.Range c2 = oSheet.Cells[4, 4]; 
oRange = (Excel.Range)oSheet.get_Range(c1, c2); 
oRange.EntireColumn.AutoFit(); 

Vì vậy, nó có thể liên quan đến các chức năng oSheet.get_Range. Nó nhận một đối tượng như là một đối số, do đó nó có thể cố gắng gọi một phương thức get_Range trên các đối số để nhận ô nội bộ và phép dựng lên từ Range đến đối tượng được thực hiện bởi trình biên dịch có thể ẩn cuộc gọi phương thức.

Nếu bạn cần định nghĩa ô theo hàng/cột - hãy thử sử dụng phương pháp trên.

+0

Có thể được thu nhỏ lại thành oRange = (Excel.Range) oSheet.get_Range (oSheet.Cells [1, 1] dưới dạng Excel.Object, oSheet.Cells [4, 4] dưới dạng Excel .Vật); oRange.EntireColumn.AutoFit(); – prabhakaran

18

Sử dụng thuộc tính Phạm vi bảng tính thay thế. Ví dụ, thay vì

oRange = (Excel.Range)oSheet.get_Range(oSheet.Cells[1, 1],oSheet.Cells[4,4]); 

sử dụng

oRange = (Excel.Range)oSheet.Range[oSheet.Cells[1, 1],oSheet.Cells[4,4]]; 

tôi đã sử dụng phương pháp get_Range() rộng rãi khi tôi thừa hưởng tắt NET 2. Khi tôi thay đổi để NET 4 Client Profile, tôi đã ngoại lệ này cũng vậy. Thay thế các tham chiếu get_Range() bằng thuộc tính Range đã giải quyết vấn đề này cho tôi.

+0

Giải pháp của NirMH làm việc cho tôi, nhưng tôi thích giải pháp này (cũng hoạt động) –

+1

Rõ ràng, vấn đề là với framework 4. Tôi đã ở 3.5 và Get_range đã hoạt động tốt. Bây giờ, dưới .net4, get_range sẽ không hoạt động, và việc sử dụng Sheet.Range [] hoạt động tốt – Simon

2

Đối với tất cả những người gặp sự cố này, sử dụng chuyển đổi rõ ràng hơn nhiều, thay vì tạo các biến mới.

oRange = (Excel.Range)oSheet.get_Range((Excel.Range)oSheet.Cells[1, 1], (Excel.Range)oSheet.Cells[4,4]); 
1

Tôi đã nâng cấp dự án VS C# của mình từ .Net Framework 3.5 lên 4.5. Khi tôi đã nâng cấp thành công, tôi nhận "đối tượng" này không chứa định nghĩa cho ngoại lệ 'get_Range' khi cố tạo báo cáo excel.

Những gì tôi đã làm là thay vì sử dụng mã dưới đây

range = xlSheet.get_Range(Cells[xlRow, xlCol], Cells[xlRow, xlCol]); 

tôi viết lại để

range = xlSheet.Range[Cells[xlRow, xlCol], xlSheet.Cells[xlRow, xlCol]]; 

Và nó làm việc.