首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Office.Interop IndexOutOfRangeException

Microsoft.Office.Interop IndexOutOfRangeException
EN

Stack Overflow用户
提问于 2017-08-03 21:41:01
回答 1查看 134关注 0票数 1

下面的IndexOutOfRangeException不让我的代码运行(它会编译)。虽然我理解这种异常(数组索引等),但问题是,我尝试做的只是用单元格Bexcelrow中的值更新字符串subsection2。由于某些原因,有一个索引越界异常,这对我来说是没有意义的。subsection2和excelrow都不是数组的一部分。我能想到的唯一数组是excel数组,但excel是一个值为3的整数,它应该更新为行B3,依此类推。(我甚至尝试过直接使用B3进行更新,也遇到了同样的错误)。

为了进一步帮助您了解上下文,这个名为createsource的方法将excel电子表格和该表中的总行作为输入。它执行下面的代码来输出一个二维数组,第一维包含每个新订单(每个不同客户)的excel索引,第二维是每个客户订购的商品数量。

代码的方法如下:

private int,createsource(Microsoft.Office.Interop.Excel.Worksheet xlWorksheet,int totalRows) {

代码语言:javascript
复制
        String subsection = "";
        object subsection2 = "";
        int orders = 0;

        //figures out how many different pages there are going to be
        for (int n = 3; n < totalRows + 1; n++)
        {
            if (!(xlWorksheet.get_Range("B" + n.ToString()).Text == subsection))
            {
                subsection = xlWorksheet.get_Range("B" + n.ToString()).Text;
                orders++;
            }
        }
        MessageBox.Show(orders.ToString());
        int[,] source = new int[orders, 2];

        int excelrow = 3;
        subsection2 = xlWorksheet.get_Range("B" + excelrow.ToString()).Text;
        int i;

        for (i = 0; i < orders + 1; i++)
        {
            int j = 1;
            if (excelrow == totalRows + 1)
            {
                break;
            }

 //Out of bounds exception is found in the below if statement updating subsection2:

            if (!(xlWorksheet.get_Range("B" + excelrow.ToString()).Text == subsection2))
            {
                source[i, 0] = excelrow;
                //MessageBox.Show(xlWorksheet.get_Range("B" + excelrow.ToString()).Text.ToString());
                subsection2 = xlWorksheet.get_Range("B" + excelrow.ToString()).Text;
                excelrow++;
            }

            for (int iter = 0; iter < 1;)
            {
                if (excelrow == totalRows + 1)
                {
                    break;
                }
                if (xlWorksheet.get_Range("B" + excelrow.ToString()).Text == subsection2)
                {
                    excelrow++;
                    j++;
                }
                if (!(xlWorksheet.get_Range("C" + excelrow.ToString()).Text == subsection2))
                {
                    subsection2 = xlWorksheet.get_Range("C" + excelrow.ToString()).Text;
                    iter = 1;
                }
            }

            source[i, 1] = j;

        }

        MessageBox.Show(source[2, 0].ToString());
        return source;

    }
EN

回答 1

Stack Overflow用户

发布于 2017-08-03 22:00:46

我看到了问题所在。您将源代码声明为:

代码语言:javascript
复制
int[,] source = new int[orders, 2];

..。好的,但是看看你的循环:

代码语言:javascript
复制
for (i = 0; i < orders + 1; i++)

..。稍后将其提供给:

代码语言:javascript
复制
source[i, 0] = excelrow;

好的,如果orders = 100,你已经声明了一个100长的数组,从0到99。然后你的循环,你从0到“小于100+1",又名0-100。当您到达最后一个循环时,您正在使用一个值i=100,并尝试将其放入不存在的数组spot中。

您需要将循环减少1,或将数组大小增加1。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45485991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档