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

欢迎关注本人的公众号:编程手札,文章也会在公众号更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramNotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值