2013-05-31 40 views
5

Tôi đang cố gắng triển khai một ứng dụng hoạt động tốt trên máy tính phát triển của tôi và một số máy trạm khác. Tuy nhiên, một số người dùng nhận được lỗi mà tôi không thể hiểu được.C# Excel interop: Ngoại lệ từ HRESULT (DISP_E_BADINDEX)

Chương trình là ứng dụng C# dotNet với chức năng Excel.Interop (Office 2003).

Tôi dường như đang gặp sự cố với 'chỉ mục'. Điều kỳ lạ là phần này hoạt động hoàn hảo trên một số máy nhưng ném một ngoại lệ gây tử vong cho người khác ... Tất cả các máy là Windows 7 với Office 2003.

Đây là mã có liên quan:

//Change sheet code (index is 1, 2, 3) -> errors at #2 
public void ChangeWorksheet(int sheetIndex) 
{ 
    if (_OnXLSEvent != null) _OnXLSEvent(string.Format("TEMP: working on page {0}", sheetIndex)); 
    _WS = _WSs[sheetIndex]; 
    _Shapes = _WS.Shapes; 
    _PageSetup = _WS.PageSetup; 
    if (_OnXLSEvent != null) _OnXLSEvent(string.Format("TEMP: working on page {0}", _WS.Name)); 
} 

//Constructor (_App and _WBs are static) 
public ExcelProcessor(bool SaveAutomatically = false, string SavePath = "") 
{ 
    if (_App == null) 
     _App = new XLS.Application(); 
    if (_WBs == null) 
     _WBs = _App.Workbooks; 
    _WB = _WBs.Add(); 
    _WSs = _WB.Sheets; 
    _WS = _WSs[1]; 
    _Shapes = _WS.Shapes; 
    _PageSetup = _WS.PageSetup; 
    _SavePath = SavePath; 
    _SaveOnDispose = SaveAutomatically; 
    _App.DisplayAlerts = false; 
    ApplyPageSetup(); 
} 

này là nhật ký tôi nhận được:

... Irrelevant 
8:52: TEMP: working on page 1 
8:52: TEMP: working on page Sheet1 
8:52: TEMP: working on page 2 
8:52: Error occurred: 
Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX)) 
at Microsoft.Office.Interop.Excel.Sheets.get__Default(Object Index) 
at Classes.XLSInterop.ExcelProcessor.ChangeWorksheet(Int32 sheetIndex) in  c:\Users\panjaj\Documents\VS Projects\Projects\Client Projects\ProFormaCreator\ProFormaCreator\Classes\XLSInterop\ExcelProcessor.cs:line 74 
at Classes.ApplicationManager.Manager.ProcessSingleDocument(InFileDocument doc) in c:\Users\panjaj\Documents\VS Projects\Projects\Client Projects\ProFormaCreator\ProFormaCreator\Classes\ApplicationManager\ApplicationManager.cs:line 327 
at Classes.ApplicationManager.Manager.ConvertFile(String File) in c:\Users\panjaj\Documents\VS Projects\Projects\Client Projects\ProFormaCreator\ProFormaCreator\Classes\ApplicationManager\ApplicationManager.cs:line 172 
+1

Đây là phiên bản Office Interop của IndexOutOfRangeException. Bảng tính chỉ đơn giản là không có trang tính thứ 2. Oh tờ! –

Trả lời

7

Tôi đã nói quá sớm! Đây chỉ là một lỗi thực sự câm. Tôi nghĩ rằng tôi muốn cung cấp cho các giải pháp để những người khác có thể không rơi vào cái bẫy giống như tôi đã làm ;-)

Để phân tích vấn đề xa hơn, tôi đã thêm mã sau đây để các nhà xây dựng:

List<XLS.Worksheet> sheets = new List<XLS.Worksheet>() 
foreach(XLS.Worksheet sh in _WSs) 
{ 
    sheets.Add(sh); 
} 
if(_OnXLSEvent != null) _OnXLSEvent(String.Format("\n\tSheets in WB: {0}\n\tFirst Sheet index: {1}, \n\tLast Sheet index: {2}", 
                _WSs.Count, 
                sheets[0].Index, 
                sheets.Last().Index)); 

Điều này dẫn trong sau log trên máy tính của tôi:

Sheets in WB: 3 
First Sheet index: 1, 
Last Sheet index: 3 

Nhưng sau log trên máy mục tiêu:

Sheets in WB: 1 
First Sheet index: 1, 
Last Sheet index: 1 

Kết luận: số lượng trang tính được thêm vào một sổ làm việc mới khác nhau giữa người dùng và người dùng. Điều cần lưu ý!

+0

Cảm ơn bạn! Nâng cấp văn phòng đã gây ra điều này trong công ty của tôi. – QuickDanger

0

Bạn có thể kiểm tra xem bảng tính có hiện diện hay không rồi thêm chúng. Thông thường, bảng tính đầu tiên được tạo theo mặc định và bạn có thể kiểm tra phần còn lại như dưới đây. Tôi có vấn đề tương tự và được giải quyết như dưới đây.

  // Add Worksheet 2 if not present 
      if (workbook.Worksheets.Count < 2) 
      { 
       workbook.Worksheets.Add(); 
      } 

      // Add Worksheet 3 if not present 
      if (workbook.Worksheets.Count < 3) 
      { 
       workbook.Worksheets.Add(); 
      } 
Các vấn đề liên quan