C#Excel互操作:来自HRESULT的异常(DISP#u E#u BADINDEX)
我正在尝试部署一个在我的开发pc和其他一些工作站上运行良好的应用程序。 然而,一些用户收到了一个我似乎无法理解的错误 该程序是一个具有Excel.Interop功能的C#dotNet应用程序(Office 2003) 我似乎对“索引”有问题。奇怪的是,这个部件在某些机器上工作得很完美,但在其他机器上却抛出了一个致命的异常。。。 所有计算机都是使用Office 2003的Windows 7 以下是相关代码:C#Excel互操作:来自HRESULT的异常(DISP#u E#u BADINDEX),c#,excel,indexing,interop,C#,Excel,Indexing,Interop,我正在尝试部署一个在我的开发pc和其他一些工作站上运行良好的应用程序。 然而,一些用户收到了一个我似乎无法理解的错误 该程序是一个具有Excel.Interop功能的C#dotNet应用程序(Office 2003) 我似乎对“索引”有问题。奇怪的是,这个部件在某些机器上工作得很完美,但在其他机器上却抛出了一个致命的异常。。。 所有计算机都是使用Office 2003的Windows 7 以下是相关代码: //Change sheet code (index is 1, 2, 3) ->
//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
我说得太快了!
这真是一个愚蠢的错误。我想我会给出解决方案,这样其他人就不会像我一样陷入同样的陷阱;-)
为了进一步分析问题,我在构造函数中添加了以下代码:
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: 1
First Sheet index: 1,
Last Sheet index: 1
结论:添加到新工作簿中的标准工作表数量因用户而异。
一定要记住 您可以检查工作表是否不存在,然后添加它们。通常默认情况下会创建第一个工作表,您可以按如下方式检查其余工作表。我有类似的问题,解决方法如下
// 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();
}
//如果没有工作表2,则添加工作表2
如果(工作簿.Worksheets.Count<2)
{
workbook.Worksheets.Add();
}
//如果不存在,则添加工作表3
如果(工作簿.Worksheets.Count<3)
{
workbook.Worksheets.Add();
}
这是IndexAutoFrangeException的Office互操作版本。电子表格没有第二页。哦,床单!非常感谢。办公室升级导致了我的公司出现这种情况。
// 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();
}