2013-05-31 18 views
5

Sto provando a distribuire un'applicazione che funzioni correttamente sul mio PC di sviluppo e su alcune altre workstation. Tuttavia, alcuni utenti ricevono un errore che non riesco a capire.Interop C# Excel: Eccezione da HRESULT (DISP_E_BADINDEX)

Il programma è un'applicazione C# dotNet con funzionalità di Excel.Interop (Office 2003).

Mi sembra di avere un problema con "indici". La cosa strana è che questa parte funziona perfettamente su alcune macchine, ma genera un'eccezione fatale sugli altri ... Tutte le macchine sono di Windows 7 con Office 2003.

Questo è il codice corrispondente:

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

Questo è il log che sto ricevendo:

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

Questa è la versione di interoperabilità di Office di IndexOutOfRangeException. Il foglio di calcolo semplicemente non ha un secondo foglio. Oh foglio! –

risposta

7

Ho parlato troppo presto! Questo è solo un errore davvero stupido. Io ho pensato di dare la soluzione in modo che altri potrebbero non cadere nella stessa trappola come ho fatto io ;-)

Per analizzare ulteriormente il problema, ho aggiunto seguente codice al costruttore:

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

Ciò ha provocato nel seguente registro sulla mia macchina:

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

Ma nel seguente registro sul computer di destinazione:

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

Conclusione: la quantità di fogli di lavoro aggiunti standard a una nuova cartella di lavoro differisce da utente a utente. Qualcosa da tenere a mente!

+0

Grazie! Gli aggiornamenti dell'ufficio lo hanno causato nella mia azienda. – QuickDanger

0

È possibile controllare se i fogli di lavoro non sono presenti, quindi aggiungerli. Di solito il primo foglio di lavoro viene creato di default e puoi controllare il resto come di seguito. Ho avuto un problema simile e risolto come di seguito.

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