2013-05-31 17 views
5

Я пытаюсь развернуть приложение, которое отлично работает на моем компьютере разработки и некоторых других рабочих станциях. Однако некоторые пользователи получают сообщение об ошибке, которое я не могу понять.C# Excel interop: Исключение из HRESULT (DISP_E_BADINDEX)

Программа представляет собой приложение CNet dotNet с функцией Excel. Интегральная функциональность (Office 2003).

У меня, похоже, проблема с «индексами». Странно то, что эта часть работает отлично на некоторых машинах, но бросает фатальное исключение на других ... Всех машин для Windows 7 с Office 2003.

Это соответствующий код:

//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(); 
} 

Это это журнал, который я получаю:

... 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

Это версия Interop для OfficeOutOfRangeException. Электронная таблица просто не имеет 2-го листа. О лист! –

ответ

7

Я говорил слишком рано! Это просто очень глупая ошибка. Я думал, что я дал бы решение, чтобы другие не могли попасть в ту же ловушку, как я сделал ;-)

Проанализировать проблему дальше, я добавил следующий код в конструктор:

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)); 

Это привело в следующий журнал на моей машине:

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

Но в следующий журнал на целевой машине:

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

Заключение: количество рабочих листов, которые стандартно добавлены в новую книгу, отличается от пользователя к пользователю. Что-то нужно иметь в виду!

+0

Спасибо! Усовершенствования в офисе вызвали это в моей компании. – QuickDanger

0

Вы можете проверить, нет ли рабочих листов, а затем добавить их. Обычно первый рабочий лист создается по умолчанию, и вы можете проверить отдых, как показано ниже. У меня была аналогичная проблема и решена, как показано ниже.

  // 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(); 
      } 
Смежные вопросы