C#实战017:Excel操作-计算单元格时出现的类型转换问题解决

     今天遇到个问题,在A表中提取值a,在B表提取值b,然后再将a、b的值计算到C表中,由于要牵涉到计算,所以要把获取的数据进行类型转换,这里我们本来是想用 Convert.ToInt32进行强制转换的,结果在运算的时候出现问题,循环一次之后就报错了,而第一次获取的数据却又是对的。。。

将a注释掉,b数据能全部获取的到,但注释掉b来获取a数据时就出现了问题,同样是循环数据并强制转换,b能成功,a却失败了

Worksheet ws1 = ((Worksheet)wb.Worksheets["客户排配计划"]);//方法一:指定工作表名称读取
Worksheet ws2 = ((Worksheet)wb.Worksheets["刀具寿命"]);//方法一:指定工作表名称读取
Worksheet ws3 = ((Worksheet)wb.Worksheets["刀具预估数量"]);//方法一:指定工作表名称读取
//获取工作表中的行数
int ws1RowsCount = ws1.UsedRange.Rows.Count;
//获取工作表中的列数
int ws1ColumnsCount = ws1.UsedRange.Columns.Count;
int ws2RowsCount = ws2.UsedRange.Rows.Count;
for (int i = 3; i < ws2RowsCount; i++)
{
    for (int k = 3; k < ws1RowsCount; k++)
    {
        if ((ws3.Cells[i, 2]).Text == (ws1.Cells[k, 2]).Text)
        {
            for (int l = 1; l < ws1ColumnsCount - 1; l++)
            {
                int a = Convert.ToInt32((ws1.Cells[k, l + 2]).Text);
                int b = Convert.ToInt32((ws2.Cells[i, 7]).Text);
                ws3.Cells[i, l + 5] = a / b;
            }
        }
    }
}

    单独获取通过Console.WriteLine(ws1.Cells[k, l + 2]).Text)却可以获取到所有的数据,所以关键问题还是在类型转换上出现了异常,尝试用int.Parse(ws1.Cells[k, l + 2]).Tex)转换也同样出现异常。

int.Parse()也是是一种类容转换:表示将数字内容的字符串转为int类型, 如果字符串为空,则抛出ArgumentNullException异常; 如果字符串内容不是数字,则抛出FormatException异常; 如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;

奇怪的是既然错了,为什么还能执行这么多。。。,刚好是表2的一次循环,70多条数据都被读取到了

那么遇到这种问题该怎么办呢,大家可以尝试下用这种方式去解决,int.TryParse 和 int.Parse很类似,但它不会产生异常,转换成功返回 true,转换失败返回 false

 int a = 0;   //定义一个变量
 bool ws1value = int.TryParse((ws1.Cells[k, l + 2]).Text, out a); 

int.TryParse((ws1.Cells[k, l + 2]).Text, out a),其中第一个参数代表被转换的参数,第二个参数为转换后的参数 int类型,成功返回True,失败返回False,下面是循环代码:

for (int i = 3; i < ws2RowsCount; i++)
{
    for (int k = 3; k < ws1RowsCount; k++)
    {
        if ((ws3.Cells[i, 2]).Text == (ws1.Cells[k, 2]).Text)
        {
            for (int l = 1; l < ws1ColumnsCount - 1; l++)
            {
                int a = 0;
                bool ws1value = int.TryParse((ws1.Cells[k, l + 2]).Text, out a);
                int b = 0;
                bool ws2value = int.TryParse((ws2.Cells[i, 7]).Text, out b);
                //int b = Convert.ToInt32((ws2.Cells[i, 7]).Text);
                Console.WriteLine(a / b);
                ws3.Cells[i, l + 5] = a / b;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/kevinfan2011/article/details/84074737
今日推荐