2013-05-31 13 views
5

Próbuję wdrożyć aplikację, która działa dobrze na moim komputerze programisty i niektórych innych stacji roboczych. Jednak niektórzy użytkownicy otrzymują błąd, którego nie mogę zrozumieć.C# Excel interop: Wyjątek od HRESULT (DISP_E_BADINDEX)

Program jest aplikacją C# dotNet z funkcją Excel.Interop (Office 2003).

Wygląda na to, że mam problem z "indeksami". Najdziwniejsze jest to, że ta część działa idealnie na niektórych maszynach, ale rzuca wyjątek krytyczny na innych ... Wszystkie maszyny są Windows 7 z Office 2003.

To jest odpowiedni kod:

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

ten jest dziennik, który otrzymuję:

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

To jest wersja interpolowa Office IndexOutOfRangeException. Arkusz kalkulacyjny po prostu nie ma drugiego arkusza. Och, arkusz! –

Odpowiedz

7

Za wcześnie rozmawiałem! To tylko naprawdę głupi błąd. Myślałam, że dam rozwiązanie, tak aby inni nie mogą wpaść w tę samą pułapkę co zrobiłem ;-)

do dalszej analizy problemu, dodałem następujący kod do konstruktora:

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

Wynikało to w następujących log na moim komputerze:

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

Ale w następujących dziennika na komputerze docelowym:

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

Wniosek: liczba arkuszy roboczych, które są standardowo dodawane do nowego skoroszytu, różni się w zależności od użytkownika. Coś, o czym należy pamiętać!

+0

Dziękujemy! Ulepszenia biurowe spowodowały to w mojej firmie. – QuickDanger

0

Możesz sprawdzić, czy arkusze nie są obecne, a następnie je dodać. Zazwyczaj domyślnie tworzony jest pierwszy arkusz roboczy, który można sprawdzić, jak poniżej. Miałem podobny problem i rozwiązany jak poniżej.

  // 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(); 
      } 
Powiązane problemy