C# Excel互操作:HRESULT异常(DISP_E_BADINDEX)

5

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

这个程序是一个带有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
这是IndexOutOfRangeException的Office互操作版本。 电子表格只是没有第二个工作表。 哦,糟糕! - Hans Passant
2个回答

8
我说话太早了!这只是一个非常愚蠢的错误。我想提供解决方案,以便其他人不会像我一样掉进同样的陷阱;-)
为了进一步分析问题,我在构造函数中添加了以下代码:
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

结论:新工作簿中添加的标准工作表数量因用户而异。记住这一点!

谢谢!办公室升级导致了这个问题在我们公司。 - 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();
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接