2013-05-31 5 views
5

Ich versuche, eine Anwendung bereitzustellen, die auf meinem Entwicklungscomputer und einigen anderen Arbeitsstationen funktioniert. Einige Benutzer erhalten jedoch einen Fehler, den ich nicht erfassen kann.C# Excel-Interop: Ausnahme von HRESULT (DISP_E_BADINDEX)

Das Programm ist eine C# dotNet-App mit Excel.Interop-Funktionalität (Office 2003).

Ich habe ein Problem mit 'Indizes' zu bekommen. Das Seltsame ist, dass dieser Teil auf einigen Maschinen perfekt funktioniert, aber wirft eine schwerwiegende Ausnahme auf andere ... Alle Maschinen sind Windows 7 mit Office 2003.

Dies ist der entsprechende Code:

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

Diese ist das Protokoll, das ich erhalte:

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

Dies ist die Office-Interop-Version von IndexOutOfRangeException. Die Tabelle hat einfach kein zweites Blatt. Oh, Blatt! –

Antwort

7

Ich sprach zu früh! Dies ist nur ein wirklich dummer Fehler. Ich dachte, ich würde die Lösung geben, damit andere vielleicht nicht in die gleiche Falle tappen wie ich ;-)

das Problem weiter zu analysieren, habe ich an den Konstruktor folgenden Code:

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

Dies führte in folgendem Protokoll auf meinem Rechner:

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

Aber auf dem Zielcomputer folgendes Protokoll:

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

Fazit: Die Anzahl der Arbeitsblätter, die standardmäßig zu einer neuen Arbeitsmappe hinzugefügt werden, ist von Benutzer zu Benutzer unterschiedlich. Etwas zu beachten!

+0

Danke! Office-Upgrades haben das in meiner Firma verursacht. – QuickDanger

0

Sie können prüfen, ob Arbeitsblätter vorhanden sind, und diese dann hinzufügen. Normalerweise wird das erste Arbeitsblatt standardmäßig erstellt, und Sie können den Rest wie folgt überprüfen. Ich hatte ähnliches Problem und entschloss mich wie folgt.

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