2013-05-31 104 views
5

我想部署一個應用程序,可以在我的開發電腦和其他工作站上正常工作。 但是,有些用戶收到我無法理解的錯誤。C#Excel互操作:從HRESULT異常(DISP_E_BADINDEX)

該程序是一個具有Excel.Interop功能(Office 2003)的C#dotNet應用程序。

我似乎遇到'索引'的問題。奇怪的是,這部分完美的作品在一些機器上,但引發他人致命異常... 所有的機器都是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

這是Office互操作版本的IndexOutOfRangeException。電子表格根本沒有第二張紙。哦,表! –

回答

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(); 
      } 
相關問題