C#Excel互操作:从HRESULTexception(DISP_E_BADINDEX)

我试图部署一个在我的开发电脑和其他工作站上工作正常的应用程序。 但是,有些用户收到我似乎无法理解的错误。

该程序是一个具有Excel.Interopfunction(Office 2003)的C#dotNet应用程序。

我似乎遇到了“索引”的问题。 奇怪的是,这个部分在一些机器上工作完美,但在其他机器上抛出一个致命的exception…所有的机器是与Office 2003的Windows 7。

这是相关的代码:

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

我说话太快了! 这只是一个非常愚蠢的错误。 我以为我会给解决scheme,以便其他人可能不像我一样陷入同一陷阱;-)

为了进一步分析问题,我在构造函数中添加了以下代码:

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

这导致在我的机器上login如下:

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

但在以下login目标机器上:

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

结论:添加到新工作簿的标准工作表数量因用户而异。 要记住的事情!

您可以检查工作表是否不存在,然后添加它们。 通常情况下,第一个工作表是默认创build的,您可以按照以下方式检查rest。 我有类似的问题,并解决如下。

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